Events check: allow for multiple Connect events
[ZOOM-Perl-moved-to-github.git] / t / 29-events.t
1 # Before `make install' is performed this script should be runnable with
2 # `make test'. After `make install' it should work as `perl 19-events.t'
3
4 use strict;
5 use warnings;
6 use Test::More tests => 23;
7
8 BEGIN { use_ok('ZOOM') };
9
10 ok(ZOOM::event_str(ZOOM::Event::CONNECT) eq "connect",
11    "connect event properly translated");
12
13 my($errcode, $errmsg, $addinfo) = (undef, "dummy", "dummy");
14
15 my $host = "z3950.indexdata.com/gils";
16 my $conn = create ZOOM::Connection(async => 1);
17 eval { $conn->connect($host) };
18 ok(!$@, "connection to '$host'");
19
20 ok(1, "non-reference argument rejected");
21 ok(1, "non-array reference argument rejected");
22
23 my $val = ZOOM::event([]);
24 ok($val == -3, "empty array reference argument rejected");
25
26 ok(1, "huge array reference argument rejected");
27
28 # See comments in 19-event.t
29 assert_event_stream($conn, 
30                     -(ZOOM::Event::CONNECT),
31                     ZOOM::Event::SEND_APDU,
32                     ZOOM::Event::SEND_DATA,
33                     ZOOM::Event::RECV_DATA,
34                     ZOOM::Event::RECV_APDU,
35                     ZOOM::Event::ZEND,
36                     0);
37
38 $conn->option(count => 1);
39 my $rs;
40 eval { $rs = $conn->search_pqf("mineral") };
41 ok(!$@, "search for 'mineral'");
42
43 assert_event_stream($conn,
44                     ZOOM::Event::SEND_APDU,
45                     ZOOM::Event::SEND_DATA,
46                     -(ZOOM::Event::RECV_DATA),
47                     ZOOM::Event::RECV_APDU,
48                     ZOOM::Event::RECV_SEARCH,
49                     ZOOM::Event::RECV_RECORD,
50                     ZOOM::Event::ZEND,
51                     0);
52
53 # See comments in 19-event.t
54 sub assert_event_stream {
55     my($conn, @expected) = @_;
56
57     my $previousExpected = -1;
58     my $expected = shift @expected;
59     while (defined $expected) {
60         my $val = ZOOM::event([$conn]);
61         if ($expected == 0) {
62             ok($val == 0, "no events left");
63             $expected = shift @expected;
64             next;
65         }
66
67         die "impossible" if $val != 1;
68         my $ev = $conn->last_event();
69         next if $previousExpected > 0 && $ev == $previousExpected;
70
71         if ($expected < 0) {
72             $expected = -$expected;
73             $previousExpected = $expected;
74         }
75         ok($ev == $expected, ("event is $ev (" .
76                               ZOOM::event_str($ev) .
77                               "), expected $expected (" .
78                               ZOOM::event_str($expected) . ")"));
79         $expected = shift @expected;
80     }
81 }