Bug 7688: (follow-up) add unit tests for C4::Serials::GetNextSeq()
authorJulian Maurice <julian.maurice@biblibre.com>
Thu, 4 Jul 2013 09:32:06 +0000 (11:32 +0200)
committerGalen Charlton <gmc@esilibrary.com>
Wed, 30 Oct 2013 00:38:28 +0000 (00:38 +0000)
These tests are split in two parts: "db dependent" and "db
independent".
GetNextSeq requires DB only when checking for irregularities.

Signed-off-by: Galen Charlton <gmc@esilibrary.com>
t/Serials/GetNextSeq.t [new file with mode: 0644]
t/db_dependent/Serials/GetNextSeq.t [new file with mode: 0644]

diff --git a/t/Serials/GetNextSeq.t b/t/Serials/GetNextSeq.t
new file mode 100644 (file)
index 0000000..fe5a3d7
--- /dev/null
@@ -0,0 +1,234 @@
+#!/usr/bin/perl
+
+use Modern::Perl;
+use Test::More tests => 43;
+use C4::Serials;
+
+# TEST CASE 1 - 1 variable, from 1 to 4
+my $subscription = {
+    lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1,
+    innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
+    skip_serialseq => 0,
+    irregularity => '',
+    locale => 'en',
+};
+my $pattern = {
+             add1 =>  1,          add2 =>  0,          add3 =>  0,
+           every1 =>  1,        every2 =>  0,        every3 =>  0,
+    whenmorethan1 =>  4, whenmorethan2 =>  0, whenmorethan3 =>  0,
+           setto1 =>  1,        setto2 =>  0,        setto3 =>  0,
+    numberingmethod => 'X: {X}',
+    numbering1 => '',
+    numbering2 => '',
+    numbering3 => '',
+};
+
+my $seq = _next_seq($subscription, $pattern);
+is($seq, 'X: 2');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: 3');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: 4');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: 1');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: 2');
+
+# TEST CASE 2 - 1 variable, use 'dayname' numbering, from 1 to 7
+$subscription = {
+    lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1,
+    innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
+    skip_serialseq => 0,
+    irregularity => '',
+    locale => 'C',
+};
+$pattern = {
+             add1 =>  1,          add2 =>  0,          add3 =>  0,
+           every1 =>  1,        every2 =>  0,        every3 =>  0,
+    whenmorethan1 =>  7, whenmorethan2 =>  0, whenmorethan3 =>  0,
+           setto1 =>  1,        setto2 =>  0,        setto3 =>  0,
+    numberingmethod => 'X: {X}',
+    numbering1 => 'dayname',
+    numbering2 => '',
+    numbering3 => '',
+};
+
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: Tuesday');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: Wednesday');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: Thursday');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: Friday');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: Saturday');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: Sunday');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: Monday');
+
+# TEST CASE 3 - 1 variable, use 'monthname' numbering, from 0 to 11 by step of 2
+$subscription = {
+    lastvalue1 => 0, lastvalue2 => 1, lastvalue3 => 1,
+    innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
+    skip_serialseq => 0,
+    irregularity => '',
+    locale => 'C',  # locale set to 'C' to ensure we'll have english strings
+};
+$pattern = {
+             add1 =>  2,          add2 =>  0,          add3 =>  0,
+           every1 =>  1,        every2 =>  0,        every3 =>  0,
+    whenmorethan1 => 11, whenmorethan2 =>  0, whenmorethan3 =>  0,
+           setto1 =>  0,        setto2 =>  0,        setto3 =>  0,
+    numberingmethod => 'X: {X}',
+    numbering1 => 'monthname',
+    numbering2 => '',
+    numbering3 => '',
+};
+
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: March');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: May');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: July');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: September');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: November');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: January');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: March');
+
+# TEST CASE 4 - 1 variable, use 'season' numbering, from 0 to 3
+# Months starts at 0, this implies subscription's lastvalue1 should be 0,
+# together with setto1 and whenmorethan1 should be 11
+$subscription = {
+    lastvalue1 => 0, lastvalue2 => 1, lastvalue3 => 1,
+    innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
+    skip_serialseq => 0,
+    irregularity => '',
+    locale => 'C',  # locale set to 'C' to ensure we'll have english strings
+};
+$pattern = {
+             add1 =>  1,          add2 =>  0,          add3 =>  0,
+           every1 =>  1,        every2 =>  0,        every3 =>  0,
+    whenmorethan1 =>  3, whenmorethan2 =>  0, whenmorethan3 =>  0,
+           setto1 =>  0,        setto2 =>  0,        setto3 =>  0,
+    numberingmethod => 'X: {X}',
+    numbering1 => 'season',
+    numbering2 => '',
+    numbering3 => '',
+};
+
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: Summer');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: Fall');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: Winter');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: Spring');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'X: Summer');
+
+# TEST CASE 5 - 2 variables, from 1 to 12, and from 1 to 4
+$subscription = {
+    lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1,
+    innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
+    skip_serialseq => 0,
+    irregularity => '',
+    locale => 'C',  # locale set to 'C' to ensure we'll have english strings
+};
+$pattern = {
+             add1 =>  1,          add2 =>  1,          add3 =>  0,
+           every1 =>  1,        every2 =>  4,        every3 =>  0,
+    whenmorethan1 =>  4, whenmorethan2 => 12, whenmorethan3 =>  0,
+           setto1 =>  1,        setto2 =>  1,        setto3 =>  0,
+    numberingmethod => 'Y: {Y}, X: {X}',
+    numbering1 => '',
+    numbering2 => '',
+    numbering3 => '',
+};
+
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Y: 1, X: 2');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Y: 1, X: 3');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Y: 1, X: 4');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Y: 2, X: 1');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Y: 2, X: 2');
+# Back to the future
+for (my $i = 0; $i < 39; $i++) {
+    $seq = _next_seq($subscription, $pattern);
+}
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Y: 12, X: 2');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Y: 12, X: 3');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Y: 12, X: 4');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Y: 1, X: 1');
+
+# TEST CASE 6 - 3 variables, from 1 to 12, from 1 to 8, and from 1 to 4
+$subscription = {
+    lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1,
+    innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
+    skip_serialseq => 0,
+    irregularity => '',
+    locale => 'C',  # locale set to 'C' to ensure we'll have english strings
+};
+$pattern = {
+             add1 =>  1,          add2 =>  1,          add3 =>  1,
+           every1 =>  1,        every2 =>  4,        every3 =>  32,
+    whenmorethan1 =>  4, whenmorethan2 =>  8, whenmorethan3 =>  12,
+           setto1 =>  1,        setto2 =>  1,        setto3 =>  1,
+    numberingmethod => 'Z: {Z}, Y: {Y}, X: {X}',
+    numbering1 => '',
+    numbering2 => '',
+    numbering3 => '',
+};
+
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Z: 1, Y: 1, X: 2');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Z: 1, Y: 1, X: 3');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Z: 1, Y: 1, X: 4');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Z: 1, Y: 2, X: 1');
+for (my $i = 0; $i < 24; $i++) {
+    $seq = _next_seq($subscription, $pattern);
+}
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Z: 1, Y: 8, X: 2');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Z: 1, Y: 8, X: 3');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Z: 1, Y: 8, X: 4');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Z: 2, Y: 1, X: 1');
+for (my $i = 0; $i < 350; $i++) {
+    $seq = _next_seq($subscription, $pattern);
+}
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Z: 12, Y: 8, X: 4');
+$seq = _next_seq($subscription, $pattern);
+is($seq, 'Z: 1, Y: 1, X: 1');
+
+
+sub _next_seq {
+    my ($subscription, $pattern) = @_;
+    my $seq;
+    ($seq, $subscription->{lastvalue1}, $subscription->{lastvalue2},
+        $subscription->{lastvalue3}, $subscription->{innerloop1},
+        $subscription->{innerloop2}, $subscription->{innerloop3}) =
+            GetNextSeq($subscription, $pattern);
+    return $seq;
+}
diff --git a/t/db_dependent/Serials/GetNextSeq.t b/t/db_dependent/Serials/GetNextSeq.t
new file mode 100644 (file)
index 0000000..a569c77
--- /dev/null
@@ -0,0 +1,278 @@
+#!/usr/bin/perl
+
+use C4::Context;
+use Test::More tests => 32;
+use Modern::Perl;
+
+my $dbh = C4::Context->dbh;
+$dbh->{RaiseError} = 1;
+$dbh->{AutoCommit} = 0;
+
+use C4::Serials::Frequency;
+use C4::Serials;
+
+my $frequency = {
+    description => "One issue per day",
+    unit => 'day',
+    issuesperunit => 1,
+    unitsperissue => 1,
+};
+my $id = AddSubscriptionFrequency($frequency);
+
+# TEST CASE 1 - 1 variable, from 1 to 4
+my $pattern = {
+             add1 =>  1,          add2 =>  0,          add3 =>  0,
+           every1 =>  1,        every2 =>  0,        every3 =>  0,
+    whenmorethan1 =>  4, whenmorethan2 =>  0, whenmorethan3 =>  0,
+           setto1 =>  1,        setto2 =>  0,        setto3 =>  0,
+    numberingmethod => 'X: {X}',
+    numbering1 => '',
+    numbering2 => '',
+    numbering3 => '',
+};
+
+my $subscription = {
+    periodicity => $id,
+    firstacquidate => '1970-01-01',
+    lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1,
+    innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
+    skip_serialseq => 1,
+    irregularity => '3;5',
+    countissuesperunit => 1,
+    locale => 'en',
+};
+my $publisheddate = $subscription->{firstacquidate};
+
+my $seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: 2');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: 4');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: 2');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: 3');
+
+# TEST CASE 2 - 1 variable, use 'dayname' numbering, from 1 to 7
+$subscription = {
+    periodicity => $id,
+    firstacquidate => '1970-01-01',
+    lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1,
+    innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
+    skip_serialseq => 1,
+    irregularity => '3;4;6',
+    countissuesperunit => 1,
+    locale => 'C',
+};
+$pattern = {
+             add1 =>  1,          add2 =>  0,          add3 =>  0,
+           every1 =>  1,        every2 =>  0,        every3 =>  0,
+    whenmorethan1 =>  7, whenmorethan2 =>  0, whenmorethan3 =>  0,
+           setto1 =>  1,        setto2 =>  0,        setto3 =>  0,
+    numberingmethod => 'X: {X}',
+    numbering1 => 'dayname',
+    numbering2 => '',
+    numbering3 => '',
+};
+
+$publisheddate = $subscription->{firstacquidate};
+
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: Tuesday');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: Friday');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: Sunday');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: Monday');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: Tuesday');
+
+# TEST CASE 3 - 1 variable, use 'monthname' numbering, from 0 to 11 by step of 2
+$subscription = {
+    periodicity => $id,
+    firstacquidate => '1970-01-01',
+    lastvalue1 => 0, lastvalue2 => 1, lastvalue3 => 1,
+    innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
+    skip_serialseq => 1,
+    irregularity => '3;4;6',
+    countissuesperunit => 1,
+    locale => 'C',
+};
+$pattern = {
+             add1 =>  2,          add2 =>  0,          add3 =>  0,
+           every1 =>  1,        every2 =>  0,        every3 =>  0,
+    whenmorethan1 => 11, whenmorethan2 =>  0, whenmorethan3 =>  0,
+           setto1 =>  0,        setto2 =>  0,        setto3 =>  0,
+    numberingmethod => 'X: {X}',
+    numbering1 => 'monthname',
+    numbering2 => '',
+    numbering3 => '',
+};
+
+$publisheddate = $subscription->{firstacquidate};
+
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: March');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: September');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: January');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: March');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: May');
+
+# TEST CASE 4 - 1 variable, use 'season' numbering, from 0 to 3
+$subscription = {
+    periodicity => $id,
+    firstacquidate => '1970-01-01',
+    lastvalue1 => 0, lastvalue2 => 1, lastvalue3 => 1,
+    innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
+    skip_serialseq => 1,
+    irregularity => '3;4;6',
+    countissuesperunit => 1,
+    locale => 'C',
+};
+$pattern = {
+             add1 =>  1,          add2 =>  0,          add3 =>  0,
+           every1 =>  1,        every2 =>  0,        every3 =>  0,
+    whenmorethan1 =>  3, whenmorethan2 =>  0, whenmorethan3 =>  0,
+           setto1 =>  0,        setto2 =>  0,        setto3 =>  0,
+    numberingmethod => 'X: {X}',
+    numbering1 => 'season',
+    numbering2 => '',
+    numbering3 => '',
+};
+
+$publisheddate = $subscription->{firstacquidate};
+
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: Summer');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: Spring');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: Fall');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: Winter');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'X: Spring');
+
+# TEST CASE 5 - 2 variables, from 1 to 12, and from 1 to 4
+$subscription = {
+    periodicity => $id,
+    firstacquidate => '1970-01-01',
+    lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1,
+    innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
+    skip_serialseq => 1,
+    irregularity => '3;4;6',
+    countissuesperunit => 1,
+    locale => 'C',
+};
+$pattern = {
+             add1 =>  1,          add2 =>  1,          add3 =>  0,
+           every1 =>  1,        every2 =>  4,        every3 =>  0,
+    whenmorethan1 =>  4, whenmorethan2 => 12, whenmorethan3 =>  0,
+           setto1 =>  1,        setto2 =>  1,        setto3 =>  0,
+    numberingmethod => 'Y: {Y}, X: {X}',
+    numbering1 => '',
+    numbering2 => '',
+    numbering3 => '',
+};
+
+$publisheddate = $subscription->{firstacquidate};
+
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'Y: 1, X: 2');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'Y: 2, X: 1');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'Y: 2, X: 3');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'Y: 2, X: 4');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'Y: 3, X: 1');
+
+# TEST CASE 6 - 3 variables, from 1 to 12, from 1 to 8, and from 1 to 4
+$subscription = {
+    periodicity => $id,
+    firstacquidate => '1970-01-01',
+    lastvalue1 => 1, lastvalue2 => 1, lastvalue3 => 1,
+    innerloop1 => 0, innerloop2 => 0, innerloop3 => 0,
+    skip_serialseq => 1,
+    irregularity => '3;4;6;110',
+    countissuesperunit => 1,
+    locale => 'C',
+};
+$pattern = {
+             add1 =>  1,          add2 =>  1,          add3 =>  1,
+           every1 =>  1,        every2 =>  4,        every3 => 32,
+    whenmorethan1 =>  4, whenmorethan2 =>  8, whenmorethan3 => 12,
+           setto1 =>  1,        setto2 =>  1,        setto3 =>  1,
+    numberingmethod => 'Z: {Z}, Y: {Y}, X: {X}',
+    numbering1 => '',
+    numbering2 => '',
+    numbering3 => '',
+};
+
+$publisheddate = $subscription->{firstacquidate};
+
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'Z: 1, Y: 1, X: 2');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'Z: 1, Y: 2, X: 1');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'Z: 1, Y: 2, X: 3');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'Z: 1, Y: 2, X: 4');
+for (my $i = 0; $i < 100; $i++) {
+    $publisheddate = GetNextDate($subscription, $publisheddate);
+    $seq = _next_seq($subscription, $pattern, $publisheddate);
+}
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'Z: 4, Y: 4, X: 1');
+# 110th is here
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'Z: 4, Y: 4, X: 3');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'Z: 4, Y: 4, X: 4');
+$publisheddate = GetNextDate($subscription, $publisheddate);
+$seq = _next_seq($subscription, $pattern, $publisheddate);
+is($seq, 'Z: 4, Y: 5, X: 1');
+
+
+$dbh->rollback;
+
+sub _next_seq {
+    my ($subscription, $pattern, $publisheddate) = @_;
+    my $seq;
+    ($seq, $subscription->{lastvalue1}, $subscription->{lastvalue2},
+        $subscription->{lastvalue3}, $subscription->{innerloop1},
+        $subscription->{innerloop2}, $subscription->{innerloop3}) =
+            GetNextSeq($subscription, $pattern, $publisheddate);
+    return $seq;
+}