]> Dogcows Code - chaz/p5-File-KDBX/blobdiff - t/iterator.t
Add iterator
[chaz/p5-File-KDBX] / t / iterator.t
diff --git a/t/iterator.t b/t/iterator.t
new file mode 100755 (executable)
index 0000000..02d4733
--- /dev/null
@@ -0,0 +1,101 @@
+#!/usr/bin/env perl
+
+use warnings;
+use strict;
+
+use lib 't/lib';
+use TestCommon;
+
+use File::KDBX::Iterator;
+use File::KDBX::Entry;
+use File::KDBX::Util qw(:load);
+use Iterator::Simple qw(:all);
+use Test::More;
+
+subtest 'Basic' => sub {
+    my $it = File::KDBX::Iterator->new(1..10);
+
+    is $it->(), 1, 'Get next item (1)';
+    is $it->(), 2, 'Get next item (2)';
+    $it->unget(-5);
+    is $it->(), -5, 'Unget';
+    is $it->peek, 3, 'Peek at next';
+    is $it->(), 3, 'Get next item (3)';
+    is $it->count, 7, 'Get current size';
+
+    my $limited = $it->limit(3);
+    is $limited->count, 3, 'Get current size';
+    my $enum = ienumerate $limited;
+    is_deeply $enum->to_array, [[0, 4], [1, 5], [2, 6]], 'Use Iterator::Simple functions';
+
+    is $it->(), 7, 'Original iterator is drained by composing iterator';
+
+    is $it->next(sub { $_ == 9 }), 9, 'Find next matching item';
+    is $it->next, 10, 'Item got skipped while finding next match';
+    is $it->peek, undef, 'No more items (peek)';
+    is $it->next, undef, 'No more items (next)';
+
+    $it->(qw{10 20 30});
+    is_deeply [$it->each], [qw{10 20 30}], 'Fill buffer and get each item (list)';
+    is $it->(), undef, 'Empty';
+
+    $it->(my $buffer = [qw{a b c}]);
+    my @each;
+    $it->each(sub { push @each, $_ });
+    is_deeply \@each, [qw{a b c}], 'Fill buffer and get each item (function)';
+    is_deeply $buffer, [], 'Buffer is empty';
+};
+
+subtest 'Sorting' => sub {
+    my $new_it = sub {
+        File::KDBX::Iterator->new(
+            File::KDBX::Entry->new(label => 'foo', icon_id => 1),
+            File::KDBX::Entry->new(label => 'bar', icon_id => 5),
+            File::KDBX::Entry->new(label => 'BaZ', icon_id => 3),
+            File::KDBX::Entry->new(label => 'qux', icon_id => 2),
+            File::KDBX::Entry->new(label => 'Muf', icon_id => 4),
+        );
+    };
+
+    my @sort = (label => collate => 0);
+
+    my $it = $new_it->();
+    is_deeply $it->sort_by(@sort)->map(sub { $_->label })->to_array,
+        [qw{BaZ Muf bar foo qux}], 'Sort text ascending';
+
+    $it = $new_it->();
+    is_deeply $it->sort_by(@sort, case => 0)->map(sub { $_->label })->to_array,
+        [qw{bar BaZ foo Muf qux}], 'Sort text ascending, ignore-case';
+
+    $it = $new_it->();
+    is_deeply $it->sort_by(@sort, ascending => 0)->map(sub { $_->label })->to_array,
+        [qw{qux foo bar Muf BaZ}], 'Sort text descending';
+
+    $it = $new_it->();
+    is_deeply $it->sort_by(@sort, ascending => 0, case => 0)->map(sub { $_->label })->to_array,
+        [qw{qux Muf foo BaZ bar}], 'Sort text descending, ignore-case';
+
+    SKIP: {
+        plan skip_all => 'Unicode::Collate required to test collation sorting'
+            if !try_load_optional('Unicode::Collate');
+
+        # FIXME I'm missing something....
+        # $it = $new_it->();
+        # is_deeply $it->sort_by('label')->map(sub { $_->label })->to_array,
+        #     [qw{BaZ Muf bar foo qux}], 'Sort text ascending using Unicode::Collate';
+
+        $it = $new_it->();
+        is_deeply $it->sort_by('label', case => 0)->map(sub { $_->label })->to_array,
+            [qw{bar BaZ foo Muf qux}], 'Sort text ascending, ignore-case using Unicode::Collate';
+    }
+
+    $it = $new_it->();
+    is_deeply $it->nsort_by('icon_id')->map(sub { $_->label })->to_array,
+        [qw{foo qux BaZ Muf bar}], 'Sort text numerically, ascending';
+
+    $it = $new_it->();
+    is_deeply $it->nsort_by('icon_id', ascending => 0)->map(sub { $_->label })->to_array,
+        [qw{bar Muf BaZ qux foo}], 'Sort text numerically, descending';
+};
+
+done_testing;
This page took 0.023627 seconds and 4 git commands to generate.