11package com .thealgorithms .io ;
22
33import static org .junit .jupiter .api .Assertions .assertEquals ;
4- import static org .junit .jupiter .api .Assertions .assertThrows ;
54
65import java .io .ByteArrayInputStream ;
76import java .io .IOException ;
87import org .junit .jupiter .api .Test ;
98
109class BufferedReaderTest {
11-
1210 @ Test
13- void testPeeks () throws IOException {
14- final String text = "Hello!\n World!" ;
15- final byte [] bytes = text .getBytes ();
11+ public void testPeeks () throws IOException {
12+ String text = "Hello!\n World!" ;
13+ int len = text .length ();
14+ byte [] bytes = text .getBytes ();
15+
16+ ByteArrayInputStream input = new ByteArrayInputStream (bytes );
17+ BufferedReader reader = new BufferedReader (input );
1618
17- final BufferedReader reader = new BufferedReader (new ByteArrayInputStream (bytes ));
19+ // read the first letter
20+ assertEquals ('H' , reader .read ());
21+ len --;
22+ assertEquals (len , reader .available ());
1823
19- // Pointer at start: [H]
20- assertEquals ('H' , reader .peek (1 ));
21- assertEquals ('e' , reader .peek (2 ));
22- assertEquals ('l' , reader .peek (3 ));
24+ // position: H[e]llo!\nWorld!
25+ // reader.read() will be == 'e'
26+ assertEquals ('l' , reader .peek (1 ));
27+ assertEquals ('l' , reader .peek (2 )); // second l
28+ assertEquals ('o' , reader .peek (3 ));
2329 }
2430
2531 @ Test
26- void testMixes () throws IOException {
27- final String text = "Hello!\n World!" ;
28- final byte [] bytes = text .getBytes ();
32+ public void testMixes () throws IOException {
33+ String text = "Hello!\n World!" ;
34+ int len = text .length ();
35+ byte [] bytes = text .getBytes ();
2936
30- final BufferedReader reader = new BufferedReader (new ByteArrayInputStream (bytes ));
37+ ByteArrayInputStream input = new ByteArrayInputStream (bytes );
38+ BufferedReader reader = new BufferedReader (input );
3139
32- // Read first character
33- assertEquals ('H' , reader .read ());
40+ // read the first letter
41+ assertEquals ('H' , reader .read ()); // first letter
42+ len --;
3443
35- // Pointer now at 'e'
36- assertEquals ('e' , reader .peek (1 ));
37- assertEquals ('e' , reader .read ());
44+ assertEquals ('l' , reader .peek (1 )); // third later (second letter after 'H')
45+ assertEquals ('e' , reader .read ()); // second letter
46+ len --;
47+ assertEquals (len , reader .available ());
3848
39- // Pointer at first 'l'
40- assertEquals ('l ' , reader .peek (1 ));
41- assertEquals ('l ' , reader .peek (2 ));
42- assertEquals ('o ' , reader .peek (3 ));
49+ // position: H[e]llo!\nWorld!
50+ assertEquals ('o ' , reader .peek (2 )); // second l
51+ assertEquals ('! ' , reader .peek (3 ));
52+ assertEquals ('\n ' , reader .peek (4 ));
4353
44- assertEquals ('l' , reader .read ());
45- assertEquals ('o' , reader .peek (1 ));
54+ assertEquals ('l' , reader .read ()); // third letter
55+ assertEquals ('o' , reader .peek (1 )); // fourth letter
4656
47- // Move to EOF safely
48- while (reader .read () != -1 ) {
49- // consume remaining
57+ for (int i = 0 ; i < 6 ; i ++) {
58+ reader .read ();
59+ }
60+ try {
61+ System .out .println ((char ) reader .peek (4 ));
62+ } catch (Exception ignored ) {
63+ System .out .println ("[cached intentional error]" );
64+ // intentional, for testing purpose
5065 }
51-
52- // Exception when peeking beyond available
53- assertThrows (IOException .class , () -> reader .peek (1 ));
5466 }
5567
5668 @ Test
57- void testBlockPractical () throws IOException {
58- final String text = "!Hello\n World!" ;
59- final byte [] bytes = text .getBytes ();
69+ public void testBlockPractical () throws IOException {
70+ String text = "!Hello\n World!" ;
71+ byte [] bytes = text .getBytes ();
72+ int len = bytes .length ;
6073
61- final BufferedReader reader = new BufferedReader (new ByteArrayInputStream (bytes ));
74+ ByteArrayInputStream input = new ByteArrayInputStream (bytes );
75+ BufferedReader reader = new BufferedReader (input );
6276
63- // Peek before reading
64- assertEquals ('!' , reader .peek ());
77+ assertEquals ('H' , reader .peek ());
78+ assertEquals ('!' , reader .read ()); // read the first letter
79+ len --;
6580
66- // Read first character
67- assertEquals ('!' , reader .read ());
68-
69- // Read next block (default buffer size = 5 → "Hello")
81+ // this only reads the next 5 bytes (Hello) because
82+ // the default buffer size = 5
7083 assertEquals ("Hello" , new String (reader .readBlock ()));
84+ len -= 5 ;
85+ assertEquals (reader .available (), len );
7186
72- // Continue reading
87+ // maybe kind of a practical demonstration / use case
7388 if (reader .read () == '\n' ) {
7489 assertEquals ('W' , reader .read ());
7590 assertEquals ('o' , reader .read ());
7691
92+ // the rest of the blocks
7793 assertEquals ("rld!" , new String (reader .readBlock ()));
7894 } else {
79- throw new IOException ("Unexpected stream state" );
95+ // should not reach
96+ throw new IOException ("Something not right" );
8097 }
8198 }
82-
83- @ Test
84- void testEndOfFile () throws IOException {
85- final byte [] bytes = "A" .getBytes ();
86- final BufferedReader reader = new BufferedReader (new ByteArrayInputStream (bytes ));
87-
88- assertEquals ('A' , reader .read ());
89- assertEquals (-1 , reader .read ()); // EOF check
90- }
91- }
99+ }
0 commit comments