1use Test2::Bundle::Extended -target => 'Test2::Harness::Util::File::Stream';
2use File::Temp qw/tempfile/;
3# HARNESS-DURATION-SHORT
4
5use ok $CLASS;
6
7my ($wh, $filename) = tempfile("test-$$-XXXXXXXX", TMPDIR => 1);
8print $wh "";
9close($wh);
10
11ok(my $one = $CLASS->new(name => $filename), "New instance");
12$one->write("line1\n");
13$one->write("line2\n");
14$one->write("line3\n");
15$one->write("line");
16
17my $fh = $one->open_file('<');
18is(
19    [<$fh>],
20    ["line1\n", "line2\n", "line3\n", "line"],
21    "file written as expected"
22);
23
24is($one->read_line, "line1\n", "got first line");
25
26is(
27    [$one->poll],
28    [
29        "line2\n",
30        "line3\n",
31    ],
32    "Got unseen completed lines, but not incomplete line"
33);
34
35is($one->read_line, undef, "no new lines are ready");
36
37is(
38    [$one->read],
39    [
40        "line1\n",
41        "line2\n",
42        "line3\n",
43    ],
44    "Read gets lines"
45);
46
47$one->write("4\n");
48$one->write("line5");
49
50is(
51    [$one->read],
52    [
53        "line1\n",
54        "line2\n",
55        "line3\n",
56        "line4\n",
57    ],
58    "Read sees the new lines"
59);
60
61is([$one->poll], ["line4\n"], "Poll sees new line after a read");
62
63$one->write("\nline6");
64
65is($one->read_line, "line5\n", "read_line moves to the next line");
66
67is($one->read_line, undef, "no new lines are ready");
68is([$one->poll], [], "no new lines are ready");
69
70$one->set_done(1);
71
72is([$one->poll], ["line6"], "got unterminated line after 'done' was set");
73
74$one->reset;
75is(
76    [$one->read],
77    [
78        "line1\n",
79        "line2\n",
80        "line3\n",
81        "line4\n",
82        "line5\n",
83    ],
84    "read all lines but the last unterminated one"
85);
86
87is(
88    [$one->poll],
89    [
90        "line1\n",
91        "line2\n",
92        "line3\n",
93        "line4\n",
94        "line5\n",
95    ],
96    "poll all lines but the last unterminated one"
97);
98
99$one->set_done(1);
100is([$one->poll], ["line6"], "got unterminated line after 'done' was set");
101
102$one = undef;
103
104$one = $CLASS->new(name => $filename);
105$one->seek(6);
106is(
107    [$one->poll],
108    [
109        "line2\n",
110        "line3\n",
111        "line4\n",
112        "line5\n",
113    ],
114    "Was able to seek past the first item",
115);
116
117unlink($filename);
118done_testing;
119