|
5 | 5 | * https://github.com/manuelbl/QrCodeGenerator |
6 | 6 | */ |
7 | 7 |
|
| 8 | +using System; |
8 | 9 | using System.Diagnostics.CodeAnalysis; |
9 | 10 | using Xunit; |
10 | 11 |
|
@@ -321,6 +322,33 @@ public void CalcColorBalance(int size, double percent, int expectedPenalty) |
321 | 322 | Assert.Equal(expectedPenalty, Penalty.CalcColorBalance(modules)); |
322 | 323 | } |
323 | 324 |
|
| 325 | + [Theory, CombinatorialData] |
| 326 | + public void CalcColorBalance_MatchesPercentageRule([CombinatorialValues(21, 29, 37, 65, 129, 177)] int size) |
| 327 | + { |
| 328 | + var totalNumber = size * size; |
| 329 | + |
| 330 | + for (var darkModules = 0; darkModules <= totalNumber; darkModules += 1) |
| 331 | + { |
| 332 | + var percent = darkModules * 100.0 / totalNumber; |
| 333 | + var expectedPenalty = 10 * (int)Math.Floor(Math.Abs(percent - 50.0) / 5.0); |
| 334 | + |
| 335 | + Assert.Equal(expectedPenalty, Penalty.CalcColorBalance(WithDarkCount(size, darkModules))); |
| 336 | + } |
| 337 | + } |
| 338 | + |
| 339 | + [Theory, CombinatorialData] |
| 340 | + public void CalcColorBalance_IsSymmetricUnderInversion([CombinatorialValues(21, 29, 37, 65, 129, 177)] int size) |
| 341 | + { |
| 342 | + var totalNumber = size * size; |
| 343 | + |
| 344 | + for (var darkModules = 0; darkModules <= totalNumber / 2; darkModules += 1) |
| 345 | + { |
| 346 | + var penalty = Penalty.CalcColorBalance(WithDarkCount(size, darkModules)); |
| 347 | + |
| 348 | + Assert.Equal(penalty, Penalty.CalcColorBalance(WithDarkCount(size, totalNumber - darkModules))); |
| 349 | + } |
| 350 | + } |
| 351 | + |
324 | 352 | [Theory, CombinatorialData] |
325 | 353 | public void CalcColorBalance_BasePenalty([CombinatorialValues(21, 29, 37, 65, 129, 177)]int size) |
326 | 354 | { |
@@ -439,6 +467,17 @@ public void CalcFinderPattern_BasePenalty([CombinatorialValues(21, 29, 37, 65, 1 |
439 | 467 | Assert.Equal(0, Penalty.CalcFinderPattern(modules)); |
440 | 468 | } |
441 | 469 |
|
| 470 | + // Creates a matrix with exactly the given number of dark modules. |
| 471 | + private static BitMatrix WithDarkCount(int size, int darkModules) |
| 472 | + { |
| 473 | + var result = new BitMatrix(size); |
| 474 | + for (var i = 0; i < darkModules; i += 1) |
| 475 | + { |
| 476 | + result.Set(i % size, i / size, true); |
| 477 | + } |
| 478 | + return result; |
| 479 | + } |
| 480 | + |
442 | 481 | private static BitMatrix Fill(int size, double percent) |
443 | 482 | { |
444 | 483 | var result = new BitMatrix(size); |
|
0 commit comments