diff --git a/.github/instructions/snyk_rules.instructions.md b/.github/instructions/snyk_rules.instructions.md
new file mode 100644
index 0000000..eef0634
--- /dev/null
+++ b/.github/instructions/snyk_rules.instructions.md
@@ -0,0 +1,14 @@
+---
+alwaysApply: true
+always_on: true
+trigger: always_on
+applyTo: "**"
+description: Snyk Security At Inception
+---
+
+# Project security best practices
+
+- Always run snyk_code_scan tool for new first party code that is generated in a Snyk-supported language.
+- If any security issues are found based on newly introduced or modified code or dependencies, attempt to fix the issues using the results context from Snyk.
+- Rescan the code after fixing the issues to ensure that the issues were fixed and that there are no newly introduced issues.
+- Repeat this process until no new issues are found.
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 0000000..92b9b78
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,26 @@
+
+
+
+ Hideki Saito
+ Hideki Saito
+ Copyright (c) 2025 Hideki Saito
+ https://github.com/hsaito/MyNumber.NET/blob/master/LICENSE
+ https://github.com/hsaito/MyNumber.NET
+ latest
+
+
+
+
+ 1.0.7.0
+ 1.0.7.0
+ 1.0.7.0
+
+
+
+
+ true
+ /_/
+ $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)'))
+ $(RepoRoot)=$(DeterministicSourceRoot)
+
+
diff --git a/MyNumberNET/MyNumber.cs b/MyNumberNET/MyNumber.cs
index 137749a..1283359 100644
--- a/MyNumberNET/MyNumber.cs
+++ b/MyNumberNET/MyNumber.cs
@@ -43,18 +43,13 @@ public static int CalculateCheckDigits(int[] number)
throw new MyNumberMalformedException("Malformed sequence. Must be 11 digits.");
if (Array.Exists(number, n => n < 0 || n > 9))
throw new MyNumberMalformedException("All digits must be between 0 and 9.");
-
- // Calculate check digit using the official My Number algorithm
- // Process digits from right to left with specific weights
- // Array indexing: number[11-n] safely accesses indices 10,9,8,...,0 for n=1,2,3,...,11
- // This avoids Array.Reverse() while maintaining correct algorithm behavior
+ Array.Reverse(number);
var sum = 0;
- // First loop: rightmost 6 digits (indices 10,9,8,7,6,5) with weights 2,3,4,5,6,7
for (var n = 1; n < 7; n++)
- sum += (n + 1) * number[11 - n];
- // Second loop: leftmost 5 digits (indices 4,3,2,1,0) with weights 2,3,4,5,6
+ sum += (n + 1) * number[n - 1];
for (var n = 7; n < 12; n++)
- sum += (n - 5) * number[11 - n];
+ sum += (n - 5) * number[n - 1];
+ Array.Reverse(number);
if (sum % 11 <= 1)
return 0;
return 11 - sum % 11;
diff --git a/MyNumberNET/MyNumberNET.csproj b/MyNumberNET/MyNumberNET.csproj
index 953d34c..5e799e9 100644
--- a/MyNumberNET/MyNumberNET.csproj
+++ b/MyNumberNET/MyNumberNET.csproj
@@ -1,25 +1,12 @@
net8.0
- Hideki Saito
- Hideki Saito
MyNumberNET My Number Validation Library
MyNumberNET
MyNumberNET
My Number for .NET (Library)
- Copyright (c) 2019 Hideki Saito
- https://github.com/hsaito/MyNumber.NET/blob/master/LICENSE
- https://github.com/hsaito/MyNumber.NET
- 1.0.6.0
- 1.0.6.0
- 1.0.6.0
- latest
-
-
-
- true
- /_/
- $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\..\'))
- $(RepoRoot)=$(DeterministicSourceRoot)
+ $(MyNumberNETVersion)
+ $(MyNumberNETVersion)
+ $(MyNumberNETVersion)
diff --git a/MyNumberNET_CLI/MyNumberNET_CLI.csproj b/MyNumberNET_CLI/MyNumberNET_CLI.csproj
index 67fa9d0..6b6ce64 100644
--- a/MyNumberNET_CLI/MyNumberNET_CLI.csproj
+++ b/MyNumberNET_CLI/MyNumberNET_CLI.csproj
@@ -2,32 +2,20 @@
Exe
net8.0
- Hideki Saito
- Hideki Saito
MyNumber My Number Validation Command Line Tool
MyNumberNET_CLI
MyNumberNET_CLI
My Number for .NET (CLI)
- Copyright (c) 2017 Hideki Saito
- https://github.com/hsaito/MyNumber.NET/blob/master/LICENSE
- https://github.com/hsaito/MyNumber.NET
- 1.0.5.0
- 1.0.5.0
- 1.0.5.0
- latest
+ $(MyNumberNETCliVersion)
+ $(MyNumberNETCliVersion)
+ $(MyNumberNETCliVersion)
-
+
-
- true
- /_/
- $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\..\'))
- $(RepoRoot)=$(DeterministicSourceRoot)
-
diff --git a/MyNumberNET_Test/MyNumberNET_Test.csproj b/MyNumberNET_Test/MyNumberNET_Test.csproj
index a02ca83..59e02ed 100644
--- a/MyNumberNET_Test/MyNumberNET_Test.csproj
+++ b/MyNumberNET_Test/MyNumberNET_Test.csproj
@@ -2,35 +2,22 @@
net8.0
false
- Hideki Saito
- Hideki Saito
MyNumberNet My Number Validation Unit Tests
MyNumberNET_Test
MyNumberNET_Test
My Number for .NET (Unit Test)
- Copyright (c) 2019 Hideki Saito
- https://github.com/hsaito/MyNumber.NET/blob/master/LICENSE
- https://github.com/hsaito/MyNumber.NET
- 1.0.5.0
- 1.0.5.0
- 1.0.5.0
- latest
+ $(MyNumberNETTestVersion)
+ $(MyNumberNETTestVersion)
+ $(MyNumberNETTestVersion)
-
-
-
+
+
+
-
-
- true
- /_/
- $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\..\'))
- $(RepoRoot)=$(DeterministicSourceRoot)
-
diff --git a/MyNumberNET_Test/MyNumberValueTests.cs b/MyNumberNET_Test/MyNumberValueTests.cs
index 9f64947..67854a3 100644
--- a/MyNumberNET_Test/MyNumberValueTests.cs
+++ b/MyNumberNET_Test/MyNumberValueTests.cs
@@ -25,22 +25,22 @@ public void Constructor_ValidDigits_CreatesMyNumberValue()
public void Constructor_InvalidDigits_ThrowsException()
{
// Act & Assert
- Assert.ThrowsException(() => new MyNumberValue(_invalidMyNumber));
+ Assert.ThrowsExactly(() => new MyNumberValue(_invalidMyNumber));
}
[TestMethod]
public void Constructor_NullDigits_ThrowsException()
{
// Act & Assert
- Assert.ThrowsException(() => new MyNumberValue(null));
+ Assert.ThrowsExactly(() => new MyNumberValue(null));
}
[TestMethod]
public void Constructor_WrongLength_ThrowsException()
{
// Act & Assert
- Assert.ThrowsException(() => new MyNumberValue(new int[10]));
- Assert.ThrowsException(() => new MyNumberValue(new int[13]));
+ Assert.ThrowsExactly(() => new MyNumberValue(new int[10]));
+ Assert.ThrowsExactly(() => new MyNumberValue(new int[13]));
}
[TestMethod]
@@ -72,9 +72,9 @@ public void FromFirstElevenDigits_ValidDigits_CreatesMyNumberValue()
public void FromFirstElevenDigits_InvalidLength_ThrowsException()
{
// Act & Assert
- Assert.ThrowsException(() =>
+ Assert.ThrowsExactly(() =>
MyNumberValue.FromFirstElevenDigits(new int[10]));
- Assert.ThrowsException(() =>
+ Assert.ThrowsExactly(() =>
MyNumberValue.FromFirstElevenDigits(null));
}
@@ -154,7 +154,7 @@ public void Parse_ValidString_ReturnsMyNumberValue()
public void Parse_InvalidString_ThrowsException()
{
// Act & Assert
- Assert.ThrowsException(() => MyNumberValue.Parse("invalid"));
+ Assert.ThrowsExactly(() => MyNumberValue.Parse("invalid"));
}
[TestMethod]
@@ -204,7 +204,7 @@ public void ToString_InvalidFormat_ThrowsException()
var myNumber = new MyNumberValue(_validMyNumber);
// Act & Assert
- Assert.ThrowsException(() => myNumber.ToString("X"));
+ Assert.ThrowsExactly(() => myNumber.ToString("X"));
}
[TestMethod]
@@ -311,14 +311,14 @@ public void ExplicitConversion_FromString_CreatesMyNumberValue()
public void ExplicitConversion_FromInvalidIntArray_ThrowsException()
{
// Act & Assert
- Assert.ThrowsException(() => (MyNumberValue)_invalidMyNumber);
+ Assert.ThrowsExactly(() => (MyNumberValue)_invalidMyNumber);
}
[TestMethod]
public void ExplicitConversion_FromInvalidString_ThrowsException()
{
// Act & Assert
- Assert.ThrowsException(() => (MyNumberValue)"invalid");
+ Assert.ThrowsExactly(() => (MyNumberValue)"invalid");
}
[TestMethod]
@@ -343,7 +343,7 @@ public void Digits_UninitializedValue_ThrowsException()
var myNumber = new MyNumberValue();
// Act & Assert
- Assert.ThrowsException(() => myNumber.Digits);
+ Assert.ThrowsExactly(() => myNumber.Digits);
}
[TestMethod]
@@ -353,7 +353,7 @@ public void ToString_UninitializedValue_ThrowsException()
var myNumber = new MyNumberValue();
// Act & Assert
- Assert.ThrowsException(() => myNumber.ToString());
+ Assert.ThrowsExactly(() => myNumber.ToString());
}
}
-}
\ No newline at end of file
+}