diff --git a/Build.PL b/Build.PL index cab7dec..bc192d5 100755 --- a/Build.PL +++ b/Build.PL @@ -22,5 +22,10 @@ my $build = Module::Build->new( 'Pango' => 0, 'Crypt::URandom' => 0, }, + test_requires => { + 'Test::MockModule' => 0, + 'Test::Most' => 0, + 'Test::MockObject' => 0, + } ); $build->create_build_script; diff --git a/lib/JapaChar.pm b/lib/JapaChar.pm index 5024833..04660c0 100644 --- a/lib/JapaChar.pm +++ b/lib/JapaChar.pm @@ -14,7 +14,7 @@ use YAML::PP; use JapaChar::DB; use JapaChar::Characters; use Pango; -use Crypt::URandom qw( urandom ); +use JapaChar::Random; use Glib::IO; @@ -58,9 +58,7 @@ sub _new_challenge($self, $window, $type = undef) { $self->_create_main_menu($window); return; } - my $rng = urandom(4); - $rng = unpack 'L', $rng; - $rng = ($rng % 100) + 1; + my $rng = JapaChar::Random->new->get(1, 100); if ($rng > 50) { $self->_new_challenge_romanji($window, $type); return; diff --git a/lib/JapaChar/Characters.pm b/lib/JapaChar/Characters.pm index 9f71a45..7db1f61 100644 --- a/lib/JapaChar/Characters.pm +++ b/lib/JapaChar/Characters.pm @@ -10,6 +10,8 @@ use Path::Tiny; use JSON; use Data::Dumper; +use JapaChar::Random; + my $option_populated = 'populated_basic_characters'; require JapaChar::DB; require JapaChar::Schema; @@ -68,7 +70,7 @@ sub get_4_incorrect_answers( $self, $char ) { return \@bad_answers; } -sub next_review_char( $self, $type = undef ) { +sub _next_review_char( $self, $type = undef ) { my $basic_character_resultset = JapaChar::Schema->Schema->resultset('BasicCharacter'); my @chars = $basic_character_resultset->search( @@ -90,22 +92,23 @@ sub next_review_char( $self, $type = undef ) { } sub next_char( $self, $type = undef ) { - my $next_review = $self->next_review_char($type); - my $next_learning = $self->next_learning_char($type); + my $next_review = $self->_next_review_char($type); + my $next_learning = $self->_next_learning_char($type); if ( !defined $next_review ) { return $next_learning; } if ( !defined $next_learning) { return $next_review; } - my $rng = int( rand(100) ) + 1; + my $rng = JapaChar::Random->new->get(1, 100); if ( $rng > 20 ) { return $next_learning; } return $next_review; } -sub next_learning_char( $self, $type = undef ) { + +sub _next_learning_char( $self, $type = undef ) { $self->populate_basic_characters; my $basic_character_resultset = JapaChar::Schema->Schema->resultset('BasicCharacter'); diff --git a/lib/JapaChar/Random.pm b/lib/JapaChar/Random.pm new file mode 100644 index 0000000..e6456e6 --- /dev/null +++ b/lib/JapaChar/Random.pm @@ -0,0 +1,18 @@ +package JapaChar::Random; + +use v5.38.2; + +use strict; +use warnings; + +use Moo; + +use Crypt::URandom qw( urandom ); + +sub get($min = 1, $max = 100) { + my $rng = urandom(4); + $rng = unpack 'L', $rng; + $rng = ($rng % $max) + $min; + return $rng; +} +1; diff --git a/t/01-characters.t b/t/01-characters.t new file mode 100644 index 0000000..0744a52 --- /dev/null +++ b/t/01-characters.t @@ -0,0 +1,28 @@ +#!/usr/bin/env perl + +use v5.38.2; + +use strict; +use warnings; + +use Test::Most tests => 2; +use Test::MockModule; +use Path::Tiny; + +use File::Basename; + +use lib dirname(dirname(__FILE__)).'/lib'; + +use JapaChar::DB; + +BEGIN { + use_ok 'JapaChar::Characters'; +}; + +{ + my $mock_db = Test::MockModule->new('JapaChar::DB'); + $mock_db->mock(_db_path => sub { + return path(__FILE__)->parent->child('all-learned-basic-characters.db'); + }); + ok defined(JapaChar::Characters->new->next_char), 'The next char is defined.'; +} diff --git a/t/all-learned-basic-characters.db b/t/all-learned-basic-characters.db new file mode 100644 index 0000000..2bd93f2 Binary files /dev/null and b/t/all-learned-basic-characters.db differ