use strict; use warnings; use Test::More qw(no_plan); use Games::Nonogram::Clue; # 'on' tests # line: "X.XX.XX..." or "X.XX..XX.." or "X.XX...XX." or # "X.XX....XX" or "X..XX.XX.." or "X..XX..XX." or # "X..XX...XX" or "X...XX.XX." or "X...XX..XX" or # "X....XX.XX" or ".X.XX.XX.." or ".X.XX..XX." or # ".X.XX...XX" or ".X..XX.XX." or ".X..XX..XX" or # ".X...XX.XX" or "..X.XX.XX." or "..X.XX..XX" or # "..X..XX.XX" or "...X.XX.XX" # blocks: # ____...... # .._____... # ....._____ # ^^ ^^ (overwrapped) { my $rule = Games::Nonogram::Clue->new( size => 10, blocks => [qw( 1 2 2 )] ); ok $rule->block(0)->left == 1; ok $rule->block(0)->right == 4; ok $rule->block(1)->left == 3; ok $rule->block(1)->right == 7; ok $rule->block(2)->left == 6; ok $rule->block(2)->right == 10; # set bit 3 on # nothing should change as the bit has multiple candidates # # line: "__X_______" # blocks: # ____...... # .._____... # ....._____ $rule->on(3); $rule->update; ok $rule->block(0)->left == 1; ok $rule->block(0)->right == 4; ok $rule->block(1)->left == 3; ok $rule->block(1)->right == 7; ok $rule->block(2)->left == 6; ok $rule->block(2)->right == 10; # set bit 5 on # this time second block should shrink # and then other blocks shrink, trying to avoid overwrapping. # now bit 3 has single candidate, thus first block shrinks again, # and then, second and third follows, as the first two are settled # now. # # line: "__X_X_____" # blocks: # ..X....... # ..._X_.... # ......____ $rule->on(5); $rule->update; ok $rule->block(0)->left == 3; ok $rule->block(0)->right == 3; ok $rule->block(1)->left == 5; ok $rule->block(1)->right == 6; ok $rule->block(2)->left == 8; ok $rule->block(2)->right == 10; # first and second blocks determined # and third block shrinks # line: "..X.XX._X_" # blocks: # ..X....... # ....XX.... # ......._X_ $rule->update; ok $rule->block(0)->left == 3; ok $rule->block(0)->right == 3; ok $rule->block(1)->left == 5; ok $rule->block(1)->right == 6; ok $rule->block(2)->left == 8; ok $rule->block(2)->right == 10; } # 'off' tests with the same rule. { my $rule = Games::Nonogram::Clue->new( size => 10, blocks => [qw( 1 2 2 )] ); ok $rule->block(0)->left == 1; ok $rule->block(0)->right == 4; ok $rule->block(1)->left == 3; ok $rule->block(1)->right == 7; ok $rule->block(2)->left == 6; ok $rule->block(2)->right == 10; # set bit 3 off # # line: "__._______" # blocks: # ____...... # ...____... # ......____ $rule->off(3); $rule->update; ok $rule->block(0)->left == 1; ok $rule->block(0)->right == 4; ok $rule->block(1)->left == 4; ok $rule->block(1)->right == 7; ok $rule->block(2)->left == 7; ok $rule->block(2)->right == 10; # set bit 4 off # # line: "__.._X__X_" # blocks: # __........ # ...._X_... # ......._X_ $rule->off(4); $rule->update; ok $rule->block(0)->left == 1; ok $rule->block(0)->right == 2; ok $rule->block(1)->left == 5; ok $rule->block(1)->right == 7; ok $rule->block(2)->left == 8; ok $rule->block(2)->right == 10; }