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