diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..0944b56 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,166 @@ +# editorconfig.org +# https://raw.githubusercontent.com/dotnet/runtime/refs/heads/main/.editorconfig modified. + +# top-most EditorConfig file +root = true + +# Default settings: +# A newline ending every file +# Use 4 spaces as indentation +[*] +insert_final_newline = false +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +# Specify UTF-8 without byte-order mark +[*.{csproj,locproj,nativeproj,proj,resx,slnx,vbproj}] +charset = utf-8 + + +# C# files +[*.cs] +# New line preferences +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = false +csharp_indent_switch_labels = true +csharp_indent_labels = one_less_than_current + +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async:suggestion + +# avoid this. unless absolutely necessary +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + +# Types: use keywords instead of BCL types, and permit var only when the type is clear +csharp_style_var_for_built_in_types = true:suggestion +csharp_style_var_when_type_is_apparent = true:suggestion +csharp_style_var_elsewhere = false:suggestion +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# name all constant fields using PascalCase +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.required_modifiers = const +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +# static fields should have _ prefix +dotnet_naming_rule.static_fields_should_have_prefix.severity = suggestion +dotnet_naming_rule.static_fields_should_have_prefix.symbols = static_fields +dotnet_naming_rule.static_fields_should_have_prefix.style = static_prefix_style +dotnet_naming_symbols.static_fields.applicable_kinds = field +dotnet_naming_symbols.static_fields.required_modifiers = static +dotnet_naming_symbols.static_fields.applicable_accessibilities = private, internal, private_protected +dotnet_naming_style.static_prefix_style.required_prefix = _ +dotnet_naming_style.static_prefix_style.capitalization = camel_case + +# internal and private fields should be _camelCase +dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion +dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields +dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style +dotnet_naming_symbols.private_internal_fields.applicable_kinds = field +dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal +dotnet_naming_style.camel_case_underscore_style.required_prefix = _ +dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case + +# Code style defaults +csharp_using_directive_placement = outside_namespace:suggestion +dotnet_sort_system_directives_first = true +csharp_prefer_braces = true:silent +csharp_preserve_single_line_blocks = true:none +csharp_preserve_single_line_statements = true:suggestion +csharp_prefer_static_local_function = true:suggestion +csharp_prefer_simple_using_statement = false:none +csharp_style_prefer_switch_expression = true:suggestion +dotnet_style_readonly_field = true:suggestion + +# Expression-level preferences +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_prefer_collection_expression = when_types_exactly_match +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +csharp_prefer_simple_default_expression = true:suggestion + +# Expression-bodied members +csharp_style_expression_bodied_methods = true:suggestion +csharp_style_expression_bodied_constructors = true:suggestion +csharp_style_expression_bodied_operators = true:suggestion +csharp_style_expression_bodied_properties = true:suggestion +csharp_style_expression_bodied_indexers = true:suggestion +csharp_style_expression_bodied_accessors = true:suggestion +csharp_style_expression_bodied_lambdas = true:suggestion +csharp_style_expression_bodied_local_functions = true:suggestion + +# Pattern matching +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion + +# Null checking preferences +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion + +# Other features +csharp_style_prefer_index_operator = false:none +csharp_style_prefer_range_operator = false:none +csharp_style_pattern_local_over_anonymous_function = false:none + + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + + +# Set severity for all analyzers that are enabled by default (https://docs.microsoft.com/en-us/visualstudio/code-quality/use-roslyn-analyzers?view=vs-2022#set-rule-severity-of-multiple-analyzer-rules-at-once-in-an-editorconfig-file) +dotnet_analyzer_diagnostic.category-roslynator.severity = error + +# Enable/disable all refactorings +roslynator_refactorings.enabled = true + +# Enable/disable all compiler diagnostic fixes +roslynator_compiler_diagnostic_fixes.enabled = true diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index d45fc4c..a1947b6 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -12,7 +12,7 @@ name: CD on: release: types: [published] - + # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: # This workflow contains a single job called "build" @@ -23,13 +23,13 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v2 + - uses: actions/checkout@v6 # Runs a single command using the runners shell - - name: Setup .NET Core - uses: actions/setup-dotnet@v1 + - name: Setup .NET + uses: actions/setup-dotnet@v5 with: - dotnet-version: 6.0.x + dotnet-version: 10.0.x - name: Build run: dotnet build --configuration Release diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c00ac14..e84f23c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,20 +10,20 @@ on: paths-ignore: - 'README.md' workflow_dispatch: - + jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - + - uses: actions/checkout@v6 + - name: Setup .NET - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v5 with: - dotnet-version: 6.0.x - + dotnet-version: 10.0.x + - name: Build run: dotnet build --configuration Release working-directory: ./src/FileSizeFromBase64.NET diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..e7cfc75 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,32 @@ + + + latest + false + enable + + true + true + true + latest + Recommended + true + + false + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/FileSizeFromBase64.NET.sln b/FileSizeFromBase64.NET.sln deleted file mode 100644 index 59e4195..0000000 --- a/FileSizeFromBase64.NET.sln +++ /dev/null @@ -1,53 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.32126.317 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{55C2DD39-3BE6-4123-918B-E9DBC725B6AE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{36D68C5A-786B-4576-940D-A636E667127A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FileSizeFromBase64.NET", "src\FileSizeFromBase64.NET\FileSizeFromBase64.NET.csproj", "{7CBE7079-23DF-4EE0-899A-62C030D89777}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FileSizeFromBase64.NET.Tests", "tests\FileSizeFromBase64.NET.Tests\FileSizeFromBase64.NET.Tests.csproj", "{FF13BB86-E941-42C8-9419-908AC08F80E8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FileSizeFromBase64.NET.ConsoleApp", "tests\FileSizeFromBase64.NET.ConsoleApp\FileSizeFromBase64.NET.ConsoleApp.csproj", "{100450D0-E6CE-4D9D-8A0C-B909392F65C4}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileSizeFromBase64.Benchmarks", "tests\FileSizeFromBase64.Benchmarks\FileSizeFromBase64.Benchmarks.csproj", "{691C89B2-AD2B-49FC-B5FD-C4F97F717A45}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7CBE7079-23DF-4EE0-899A-62C030D89777}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7CBE7079-23DF-4EE0-899A-62C030D89777}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7CBE7079-23DF-4EE0-899A-62C030D89777}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7CBE7079-23DF-4EE0-899A-62C030D89777}.Release|Any CPU.Build.0 = Release|Any CPU - {FF13BB86-E941-42C8-9419-908AC08F80E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FF13BB86-E941-42C8-9419-908AC08F80E8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FF13BB86-E941-42C8-9419-908AC08F80E8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FF13BB86-E941-42C8-9419-908AC08F80E8}.Release|Any CPU.Build.0 = Release|Any CPU - {100450D0-E6CE-4D9D-8A0C-B909392F65C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {100450D0-E6CE-4D9D-8A0C-B909392F65C4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {100450D0-E6CE-4D9D-8A0C-B909392F65C4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {100450D0-E6CE-4D9D-8A0C-B909392F65C4}.Release|Any CPU.Build.0 = Release|Any CPU - {691C89B2-AD2B-49FC-B5FD-C4F97F717A45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {691C89B2-AD2B-49FC-B5FD-C4F97F717A45}.Debug|Any CPU.Build.0 = Debug|Any CPU - {691C89B2-AD2B-49FC-B5FD-C4F97F717A45}.Release|Any CPU.ActiveCfg = Release|Any CPU - {691C89B2-AD2B-49FC-B5FD-C4F97F717A45}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {7CBE7079-23DF-4EE0-899A-62C030D89777} = {55C2DD39-3BE6-4123-918B-E9DBC725B6AE} - {FF13BB86-E941-42C8-9419-908AC08F80E8} = {36D68C5A-786B-4576-940D-A636E667127A} - {100450D0-E6CE-4D9D-8A0C-B909392F65C4} = {36D68C5A-786B-4576-940D-A636E667127A} - {691C89B2-AD2B-49FC-B5FD-C4F97F717A45} = {36D68C5A-786B-4576-940D-A636E667127A} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {1BEC19AE-AECE-469D-962B-4F8E4282EF8E} - EndGlobalSection -EndGlobal diff --git a/FileSizeFromBase64.NET.slnx b/FileSizeFromBase64.NET.slnx new file mode 100644 index 0000000..71a8df5 --- /dev/null +++ b/FileSizeFromBase64.NET.slnx @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/global.json b/global.json new file mode 100644 index 0000000..f72210c --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "10.0.100", + "rollForward": "latestFeature" + } +} \ No newline at end of file diff --git a/src/FileSizeFromBase64.NET/FileSizeHelpers.cs b/src/FileSizeFromBase64.NET/FileSizeHelpers.cs index 48fc9fc..0569cb1 100644 --- a/src/FileSizeFromBase64.NET/FileSizeHelpers.cs +++ b/src/FileSizeFromBase64.NET/FileSizeHelpers.cs @@ -17,17 +17,26 @@ public static class FileSizeHelpers public static double GetFileSizeFromBase64String(string base64String, bool applyPaddingsRules = false, UnitsOfMeasurement unitsOfMeasurement = UnitsOfMeasurement.Byte) { if (string.IsNullOrEmpty(base64String)) return 0; - - var base64Length = base64String.AsSpan().Slice(base64String.IndexOf(',') + 1).Length; - + + var base64Length = base64String + .AsSpan() + [(base64String.IndexOf(',', StringComparison.Ordinal) + 1)..] + .Length; + var fileSizeInByte = Math.Ceiling((double)base64Length / 4) * 3; - + if (applyPaddingsRules && base64Length >= 2) { - var paddings = base64String.AsSpan()[^2..]; - fileSizeInByte = paddings.EndsWith("==") ? fileSizeInByte - 2 : - paddings[1].Equals('=') ? fileSizeInByte - 1 : fileSizeInByte; + ReadOnlySpan paddings = base64String.AsSpan()[^2..]; + + fileSizeInByte = paddings switch + { + _ when paddings.Equals("==", StringComparison.Ordinal) => fileSizeInByte - 2, + _ when paddings[1].Equals('=') => fileSizeInByte - 1, + _ => fileSizeInByte + }; } + return fileSizeInByte > 0 ? fileSizeInByte / (int)unitsOfMeasurement : 0; } } @@ -41,13 +50,15 @@ public enum UnitsOfMeasurement /// B. /// Byte = 1, + /// /// KB. /// KiloByte = 1_024, + /// /// MB. /// MegaByte = 1_048_576 } -} +} \ No newline at end of file diff --git a/tests/FileSizeFromBase64.Benchmarks/FileSizeFromBase64.Benchmarks.csproj b/tests/FileSizeFromBase64.Benchmarks/FileSizeFromBase64.Benchmarks.csproj index f493237..a32b62f 100644 --- a/tests/FileSizeFromBase64.Benchmarks/FileSizeFromBase64.Benchmarks.csproj +++ b/tests/FileSizeFromBase64.Benchmarks/FileSizeFromBase64.Benchmarks.csproj @@ -2,17 +2,14 @@ Exe - net6.0 - enable + net10.0 + false enable - - - - + @@ -20,5 +17,4 @@ Always - diff --git a/tests/FileSizeFromBase64.Benchmarks/FileSizeHelpersBenchmark.cs b/tests/FileSizeFromBase64.Benchmarks/FileSizeHelpersBenchmark.cs index e9b11e0..771a3f5 100644 --- a/tests/FileSizeFromBase64.Benchmarks/FileSizeHelpersBenchmark.cs +++ b/tests/FileSizeFromBase64.Benchmarks/FileSizeHelpersBenchmark.cs @@ -1,24 +1,48 @@ -using BenchmarkDotNet.Attributes; +using System.IO; +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Columns; +using BenchmarkDotNet.Configs; +using BenchmarkDotNet.Diagnosers; +using BenchmarkDotNet.Jobs; +using BenchmarkDotNet.Order; +using BenchmarkDotNet.Reports; using FileSizeFromBase64.NET; namespace FileSizeFromBase64.Benchmarks; -[MediumRunJob] -[MemoryDiagnoser] +[Config(typeof(Config))] public class FileSizeHelpersBenchmark { - private readonly string _base64; - - public FileSizeHelpersBenchmark() + private sealed class Config : ManualConfig { - _base64 = File.ReadAllText("data.txt"); + public Config() + { + var baseJob = Job.MediumRun; + + AddJob(baseJob.WithNuGet("FileSizeFromBase64.NET", "1.0.0").WithId("v1.0.0").WithBaseline(true)); + AddJob(baseJob.WithNuGet("FileSizeFromBase64.NET", "2.0.0").WithId("v2.0.0")); + + AddDiagnoser(MemoryDiagnoser.Default); + SummaryStyle = SummaryStyle.Default.WithRatioStyle(RatioStyle.Percentage); + Orderer = new DefaultOrderer(SummaryOrderPolicy.FastestToSlowest); + } + } + + private string _rawBase64 = null!; + private string _mimeBase64 = null!; + + [GlobalSetup] + public void Setup() + { + _rawBase64 = File.ReadAllText("data.txt"); + _mimeBase64 = "data:text/plain;base64," + _rawBase64; } - + [Benchmark] - public double GetFileSizeFromBase64StringV1() => FileSizeHelpersV1 - .GetFileSizeFromBase64String(_base64); - + public double GetFileSizeFromRawBase64String() + => FileSizeHelpers.GetFileSizeFromBase64String(_rawBase64); + [Benchmark] - public double GetFileSizeFromBase64StringV2() => FileSizeHelpers - .GetFileSizeFromBase64String(_base64); + public double GetFileSizeFromMimePrefixedBase64String() + => FileSizeHelpers.GetFileSizeFromBase64String(_mimeBase64); } \ No newline at end of file diff --git a/tests/FileSizeFromBase64.Benchmarks/FileSizeHelpersV1.cs b/tests/FileSizeFromBase64.Benchmarks/FileSizeHelpersV1.cs deleted file mode 100644 index a113dfd..0000000 --- a/tests/FileSizeFromBase64.Benchmarks/FileSizeHelpersV1.cs +++ /dev/null @@ -1,31 +0,0 @@ -using FileSizeFromBase64.NET; - -namespace FileSizeFromBase64.Benchmarks; - -public static class FileSizeHelpersV1 -{ - /// - /// Calculate a file size from base64 string. - /// - /// The base64 string. - /// Indicate if the padding management is required or not. Default is false - /// The unit of measure of the file size returned by the method. The default unit of measure is Byte. - /// The size of the file represented by the base64 string. - public static double GetFileSizeFromBase64String(string base64String, bool applyPaddingsRules = false, UnitsOfMeasurement unitsOfMeasurement = UnitsOfMeasurement.Byte) - { - if (string.IsNullOrEmpty(base64String)) return 0; - - // Remove MIME-type from the base64 string if exists and get the string length - var base64Length = base64String.Contains("base64,") ? base64String.Split(',')[1].Length : base64String.Length; - - var fileSizeInByte = Math.Ceiling((double)base64Length / 4) * 3; - - if(applyPaddingsRules && base64Length >= 2) - { - var paddings = base64String[^2..]; - fileSizeInByte = paddings.Equals("==") ? fileSizeInByte - 2 : paddings[1].Equals('=') ? fileSizeInByte - 1 : fileSizeInByte; - } - - return (fileSizeInByte > 0) ? fileSizeInByte / (int)unitsOfMeasurement : 0; - } -} \ No newline at end of file diff --git a/tests/FileSizeFromBase64.Benchmarks/Program.cs b/tests/FileSizeFromBase64.Benchmarks/Program.cs index cef8f5f..9b44e47 100644 --- a/tests/FileSizeFromBase64.Benchmarks/Program.cs +++ b/tests/FileSizeFromBase64.Benchmarks/Program.cs @@ -1,4 +1,4 @@ using BenchmarkDotNet.Running; using FileSizeFromBase64.Benchmarks; -BenchmarkRunner.Run(); +BenchmarkRunner.Run(); \ No newline at end of file diff --git a/tests/FileSizeFromBase64.NET.ConsoleApp/FileSizeFromBase64.NET.ConsoleApp.csproj b/tests/FileSizeFromBase64.NET.ConsoleApp/FileSizeFromBase64.NET.ConsoleApp.csproj index 3f3eab8..238b43a 100644 --- a/tests/FileSizeFromBase64.NET.ConsoleApp/FileSizeFromBase64.NET.ConsoleApp.csproj +++ b/tests/FileSizeFromBase64.NET.ConsoleApp/FileSizeFromBase64.NET.ConsoleApp.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net10.0 enable enable diff --git a/tests/FileSizeFromBase64.NET.Tests/Base64File.cs b/tests/FileSizeFromBase64.NET.Tests/Base64File.cs index f0c4c85..494984b 100644 --- a/tests/FileSizeFromBase64.NET.Tests/Base64File.cs +++ b/tests/FileSizeFromBase64.NET.Tests/Base64File.cs @@ -1,13 +1,12 @@ -namespace FileSizeFromBase64.NET.Tests +namespace FileSizeFromBase64.NET.Tests; + +public sealed record Base64File { - public class Base64File - { - public string? Base64String { get; set; } + public required string Base64String { get; init; } - public int Size { get; set; } + public int Size { get; init; } - public string? Description { get; set; } + public string? Description { get; init; } - public bool UsePaddingsRules { get; set; } - } -} + public bool UsePaddingsRules { get; init; } +} \ No newline at end of file diff --git a/tests/FileSizeFromBase64.NET.Tests/Base64FileTheoryData.cs b/tests/FileSizeFromBase64.NET.Tests/Base64FileTheoryData.cs index 8ff1b34..b375855 100644 --- a/tests/FileSizeFromBase64.NET.Tests/Base64FileTheoryData.cs +++ b/tests/FileSizeFromBase64.NET.Tests/Base64FileTheoryData.cs @@ -3,15 +3,16 @@ using System.Text.Json; using Xunit; -namespace FileSizeFromBase64.NET.Tests +namespace FileSizeFromBase64.NET.Tests; + +internal sealed class Base64FileTheoryData : TheoryData { - public class Base64FileTheoryData : TheoryData + public Base64FileTheoryData() { - public Base64FileTheoryData() - { - var json = File.ReadAllBytes("data.txt"); - var files = JsonSerializer.Deserialize>(json); - if (files != null) files.ForEach(file => Add(file)); - } + var json = File.ReadAllBytes("data.txt"); + + var files = JsonSerializer.Deserialize>(json); + + files?.ForEach(file => Add(file)); } -} +} \ No newline at end of file diff --git a/tests/FileSizeFromBase64.NET.Tests/FileSizeFromBase64.NET.Tests.csproj b/tests/FileSizeFromBase64.NET.Tests/FileSizeFromBase64.NET.Tests.csproj index 2fff1d1..b171a80 100644 --- a/tests/FileSizeFromBase64.NET.Tests/FileSizeFromBase64.NET.Tests.csproj +++ b/tests/FileSizeFromBase64.NET.Tests/FileSizeFromBase64.NET.Tests.csproj @@ -1,24 +1,25 @@ - net6.0 + net10.0 enable false + $(NoWarn);CA1707 - - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all + diff --git a/tests/FileSizeFromBase64.NET.Tests/FileSizeHelpersTests.cs b/tests/FileSizeFromBase64.NET.Tests/FileSizeHelpersTests.cs index 1309ff0..6380709 100644 --- a/tests/FileSizeFromBase64.NET.Tests/FileSizeHelpersTests.cs +++ b/tests/FileSizeFromBase64.NET.Tests/FileSizeHelpersTests.cs @@ -3,21 +3,12 @@ namespace FileSizeFromBase64.NET.Tests; -public class FileSizeHelpersTests +public sealed class FileSizeHelpersTests { - - [Fact] - public void GetFileSizeFromBase64String_Should_Return_0_If_String_Is_Null() - { - var size = FileSizeHelpers.GetFileSizeFromBase64String(null); - size.ShouldBe(0); - } - - [Theory] - [ClassData(typeof(Base64FileTheoryData))] + [Theory, ClassData(typeof(Base64FileTheoryData))] public void GetFileSizeFromBase64String_Should_Return_The_Right_Size(Base64File base64File) { - var size = FileSizeHelpers.GetFileSizeFromBase64String(base64File.Base64String, base64File.UsePaddingsRules); + var size = FileSizeHelpers.GetFileSizeFromBase64String(base64File.Base64String!, base64File.UsePaddingsRules); size.ShouldBe(base64File.Size); } } \ No newline at end of file