View Javadoc
1   /*
2    * MIT License
3    * Copyright (c) 2006-2025 JMockit developers
4    * See LICENSE file for full license text.
5    */
6   package mockit.asm.util;
7   
8   import static org.junit.jupiter.api.Assertions.assertEquals;
9   import static org.junit.jupiter.api.Assertions.assertNotNull;
10  import static org.junit.jupiter.api.Assertions.assertThrows;
11  import static org.junit.jupiter.api.Assertions.assertTrue;
12  
13  import org.junit.jupiter.api.Test;
14  
15  final class ByteVectorTest {
16  
17      @Test
18      void constructorDefaultSize() {
19          ByteVector bv = new ByteVector();
20          assertNotNull(bv.getData());
21          assertEquals(0, bv.getLength());
22      }
23  
24      @Test
25      void constructorWithInitialSize() {
26          ByteVector bv = new ByteVector(128);
27          assertNotNull(bv.getData());
28          assertEquals(0, bv.getLength());
29      }
30  
31      @Test
32      void putByteIncreasesLength() {
33          ByteVector bv = new ByteVector();
34          bv.putByte(42);
35          assertEquals(1, bv.getLength());
36          assertEquals(42, bv.getData()[0]);
37      }
38  
39      @Test
40      void putShortIncreasesLength() {
41          ByteVector bv = new ByteVector();
42          bv.putShort(0x1234);
43          assertEquals(2, bv.getLength());
44          assertEquals(0x12, bv.getData()[0] & 0xFF);
45          assertEquals(0x34, bv.getData()[1] & 0xFF);
46      }
47  
48      @Test
49      void putIntIncreasesLength() {
50          ByteVector bv = new ByteVector();
51          bv.putInt(0x12345678);
52          assertEquals(4, bv.getLength());
53          assertEquals(0x12, bv.getData()[0] & 0xFF);
54          assertEquals(0x34, bv.getData()[1] & 0xFF);
55          assertEquals(0x56, bv.getData()[2] & 0xFF);
56          assertEquals(0x78, bv.getData()[3] & 0xFF);
57      }
58  
59      @Test
60      void putLongIncreasesLength() {
61          ByteVector bv = new ByteVector();
62          bv.putLong(0x1234567890ABCDEFL);
63          assertEquals(8, bv.getLength());
64      }
65  
66      @Test
67      void putLongValueZero() {
68          ByteVector bv = new ByteVector();
69          bv.putLong(0L);
70          assertEquals(8, bv.getLength());
71          for (int i = 0; i < 8; i++) {
72              assertEquals(0, bv.getData()[i]);
73          }
74      }
75  
76      @Test
77      void putLongMaxValue() {
78          ByteVector bv = new ByteVector();
79          bv.putLong(Long.MAX_VALUE);
80          assertEquals(8, bv.getLength());
81      }
82  
83      @Test
84      void putUTF8AsciiString() {
85          ByteVector bv = new ByteVector();
86          bv.putUTF8("hello");
87          // 2 bytes for length + 5 bytes for chars
88          assertEquals(7, bv.getLength());
89      }
90  
91      @Test
92      void putUTF8EmptyString() {
93          ByteVector bv = new ByteVector();
94          bv.putUTF8("");
95          // 2 bytes for length, 0 bytes for content
96          assertEquals(2, bv.getLength());
97          assertEquals(0, bv.getData()[0]); // length high byte
98          assertEquals(0, bv.getData()[1]); // length low byte
99      }
100 
101     @Test
102     void putUTF8WithNonAsciiChars() {
103         ByteVector bv = new ByteVector();
104         // String with characters > 127 (non-ASCII)
105         bv.putUTF8("\u00e9"); // é character
106         // At minimum, the 2-byte length prefix is written
107         assertTrue(bv.getLength() >= 2);
108     }
109 
110     @Test
111     void putUTF8WithHighUnicodeChars() {
112         ByteVector bv = new ByteVector();
113         // Character > U+07FF (3 bytes in UTF-8)
114         bv.putUTF8("\u0800");
115         // At minimum, the 2-byte length prefix is written
116         assertTrue(bv.getLength() >= 2);
117     }
118 
119     @Test
120     void putUTF8TooLongThrows() {
121         ByteVector bv = new ByteVector();
122         // Create a string longer than 65535 characters
123         StringBuilder sb = new StringBuilder(65536);
124         for (int i = 0; i < 65536; i++) {
125             sb.append('a');
126         }
127         assertThrows(IllegalArgumentException.class, () -> bv.putUTF8(sb.toString()));
128     }
129 
130     @Test
131     void setLengthUpdatesLength() {
132         ByteVector bv = new ByteVector();
133         bv.putInt(0);
134         assertEquals(4, bv.getLength());
135         bv.setLength(2);
136         assertEquals(2, bv.getLength());
137     }
138 
139     @Test
140     void put11TwoBytes() {
141         ByteVector bv = new ByteVector();
142         bv.put11(0xAB, 0xCD);
143         assertEquals(2, bv.getLength());
144         assertEquals(0xAB, bv.getData()[0] & 0xFF);
145         assertEquals(0xCD, bv.getData()[1] & 0xFF);
146     }
147 
148     @Test
149     void put12ThreeBytes() {
150         ByteVector bv = new ByteVector();
151         bv.put12(0xAB, 0x1234);
152         assertEquals(3, bv.getLength());
153         assertEquals(0xAB, bv.getData()[0] & 0xFF);
154         assertEquals(0x12, bv.getData()[1] & 0xFF);
155         assertEquals(0x34, bv.getData()[2] & 0xFF);
156     }
157 
158     @Test
159     void autoEnlargeWhenFull() {
160         ByteVector bv = new ByteVector(4);
161         // Put more than 4 bytes to trigger enlargement
162         for (int i = 0; i < 10; i++) {
163             bv.putByte(i);
164         }
165         assertEquals(10, bv.getLength());
166     }
167 }