/ chariki-parent / chariki-core / src / test / java / dev / mohterbaord / chariki / AbstractCharikTest.java
AbstractCharikTest.java
1 package dev.mohterbaord.chariki; 2 3 import dev.mohterbaord.chariki.core.AbstractCharik; 4 import org.apache.commons.lang3.ArrayUtils; 5 import org.junit.jupiter.api.DisplayName; 6 import org.junit.jupiter.api.MethodOrderer; 7 import org.junit.jupiter.api.Test; 8 import org.junit.jupiter.api.TestMethodOrder; 9 10 import java.nio.charset.Charset; 11 import java.util.NoSuchElementException; 12 13 import static java.nio.charset.StandardCharsets.ISO_8859_1; 14 import static java.nio.charset.StandardCharsets.UTF_8; 15 import static org.junit.jupiter.api.Assertions.*; 16 17 @DisplayName("AbstractCharik specs") 18 @TestMethodOrder(MethodOrderer.DisplayName.class) 19 public class AbstractCharikTest { 20 21 // Charik methods 22 23 @Test 24 @DisplayName("#bytes") 25 void spec_bytes() { 26 var bytes = new byte[]{ 27 (byte) 0xf0, (byte) 0x9f, (byte) 0x8d, (byte) 0xbb 28 }; 29 var charik = charik(bytes); 30 assertAll( 31 () -> assertArrayEquals(bytes, charik.bytes()), 32 () -> assertNotSame(bytes, charik.bytes()) 33 ); 34 } 35 36 @Test 37 @DisplayName("#charset") 38 void spec_charset() { 39 var charik = new AbstractCharik(null, UTF_8) { 40 }; 41 assertEquals(UTF_8, charik.charset()); 42 } 43 44 // Sizable methods 45 46 @Test 47 @DisplayName("#size") 48 void spec_size() { 49 assertAll( 50 () -> { 51 var bytes = new byte[]{ 52 (byte) 0xf0, (byte) 0x9f, (byte) 0x8d, (byte) 0xbb 53 }; 54 assertEquals(4, charik(bytes).size()); 55 }, 56 () -> assertEquals(0, emptyCharik().size()), 57 () -> assertThrows(NullPointerException.class, () -> nullCharik().size()) 58 ); 59 } 60 61 // HexRepresentable methods 62 63 @Test 64 @DisplayName("#toHexString") 65 void spec_toHexString() { 66 assertAll( 67 () -> { 68 var bytes = new byte[]{ 69 (byte) 0xf0, (byte) 0x9f, (byte) 0x8d, (byte) 0xbb 70 }; 71 assertEquals("f0 9f 8d bb", charik(bytes).toHexString()); 72 }, 73 () -> assertTrue(emptyCharik().toHexString().isEmpty()), 74 () -> assertThrows( 75 NullPointerException.class, 76 () -> nullCharik().toHexString() 77 ) 78 ); 79 } 80 81 // Streamable<Byte> methods 82 83 @Test 84 @DisplayName("#stream") 85 void spec_stream() { 86 assertAll( 87 () -> { 88 var bytes = new byte[]{ 89 (byte) 0xf0, (byte) 0x9f, (byte) 0x8d, (byte) 0xbb 90 }; 91 assertArrayEquals( 92 bytes, 93 ArrayUtils.toPrimitive( 94 charik(bytes).stream() 95 .toArray(Byte[]::new) 96 ) 97 ); 98 }, 99 () -> assertArrayEquals( 100 new byte[0], 101 ArrayUtils.toPrimitive( 102 emptyCharik().stream() 103 .toArray(Byte[]::new) 104 ) 105 ), 106 () -> { 107 var oneByteArr = new byte[]{ (byte) 0x41 }; 108 assertArrayEquals( 109 oneByteArr, 110 ArrayUtils.toPrimitive( 111 charik(oneByteArr).stream() 112 .toArray(Byte[]::new) 113 ) 114 ); 115 }, 116 () -> assertThrows( 117 NullPointerException.class, 118 () -> nullCharik().stream() 119 ) 120 ); 121 } 122 123 // Iterable<Byte> methods 124 125 @Test 126 @DisplayName("#iterator") 127 void spec_iterator() { 128 assertAll( 129 () -> { 130 var bytes = new byte[]{ 131 (byte) 0xf0, (byte) 0x9f, (byte) 0x8d, (byte) 0xbb 132 }; 133 var it = charik(bytes).iterator(); 134 assertTrue(it.hasNext()); 135 assertEquals((byte) 0xf0, it.next()); 136 assertTrue(it.hasNext()); 137 assertEquals((byte) 0x9f, it.next()); 138 assertTrue(it.hasNext()); 139 assertEquals((byte) 0x8d, it.next()); 140 assertTrue(it.hasNext()); 141 assertEquals((byte) 0xbb, it.next()); 142 assertFalse(it.hasNext()); 143 assertThrows(NoSuchElementException.class, it::next); 144 }, 145 () -> { 146 var it = emptyCharik().iterator(); 147 assertFalse(it.hasNext()); 148 assertThrows(NoSuchElementException.class, it::next); 149 }, 150 () -> assertThrows( 151 NullPointerException.class, 152 () -> nullCharik().iterator() 153 ) 154 ); 155 } 156 157 @Test 158 @DisplayName("#spliterator") 159 void spec_spliterator() { 160 var bytes = new byte[]{ 161 (byte) 0xf0, (byte) 0x9f, (byte) 0x8d, (byte) 0xbb 162 }; 163 var sp = charik(bytes).spliterator(); 164 assertEquals(4, sp.getExactSizeIfKnown()); 165 } 166 167 // Object methods 168 169 @Test 170 @DisplayName("#toString") 171 void spec_toString() { 172 assertAll( 173 () -> { 174 var bytes = new byte[]{ 175 (byte) 0xf0, (byte) 0x9f, (byte) 0x8d, (byte) 0xbb 176 }; 177 assertEquals("\ud83c\udf7b", new AbstractCharik(bytes, UTF_8) { 178 }.toString()); 179 }, 180 () -> assertEquals("", new AbstractCharik(new byte[0], UTF_8) { 181 }.toString()), 182 () -> assertThrows( 183 NullPointerException.class, 184 () -> new AbstractCharik(null, UTF_8) { 185 }.toString() 186 ), 187 () -> { 188 var bytes = new byte[]{ 189 (byte) 0xf0, (byte) 0x9f, (byte) 0x8d, (byte) 0xbb 190 }; 191 assertThrows( 192 NullPointerException.class, 193 () -> new AbstractCharik(bytes, null) { 194 }.toString() 195 ); 196 } 197 ); 198 } 199 200 @Test 201 @DisplayName("#equals") 202 void spec_equals() { 203 assertAll( 204 () -> { 205 var bytes1 = new byte[]{ 206 (byte) 0xf0, (byte) 0x9f, (byte) 0x8d, (byte) 0xbb 207 }; 208 AbstractCharik charik1 = new AbstractCharik(bytes1, UTF_8) { 209 }; 210 var bytes2 = new byte[]{ 211 (byte) 0xf0, (byte) 0x9f, (byte) 0x8d, (byte) 0xbb 212 }; 213 AbstractCharik charik2 = new AbstractCharik(bytes2, UTF_8) { 214 }; 215 assertEquals(charik1, charik2); 216 }, 217 () -> { 218 var bytes1 = new byte[]{ 219 (byte) 0xf0, (byte) 0x9f, (byte) 0x8d, (byte) 0xbb 220 }; 221 AbstractCharik charik1 = new AbstractCharik(bytes1, UTF_8) { 222 }; 223 var bytes2 = new byte[]{ 224 (byte) 0xf0, (byte) 0x9f, (byte) 0x8e, (byte) 0xb7 225 }; 226 AbstractCharik charik2 = new AbstractCharik(bytes2, UTF_8) { 227 }; 228 assertNotEquals(charik1, charik2); 229 }, 230 () -> { 231 var bytes = new byte[]{ 232 (byte) 0xf0, (byte) 0x9f, (byte) 0x8d, (byte) 0xbb 233 }; 234 AbstractCharik charik1 = new AbstractCharik(bytes, UTF_8) { 235 }; 236 AbstractCharik charik2 = new AbstractCharik(bytes, ISO_8859_1) { 237 }; 238 assertNotEquals(charik1, charik2); 239 }, 240 () -> { 241 var bytes = new byte[]{ 242 (byte) 0xf0, (byte) 0x9f, (byte) 0x8d, (byte) 0xbb 243 }; 244 var charik = new AbstractCharik(bytes, UTF_8) { 245 }; 246 assertEquals(charik, charik); 247 }, 248 () -> { 249 var bytes = new byte[]{ 250 (byte) 0xf0, (byte) 0x9f, (byte) 0x8d, (byte) 0xbb 251 }; 252 var charik = new AbstractCharik(bytes, UTF_8) { 253 }; 254 assertFalse(charik.equals(null)); 255 }, 256 () -> { 257 var bytes = new byte[]{ 258 (byte) 0xf0, (byte) 0x9f, (byte) 0x8d, (byte) 0xbb 259 }; 260 var charik = new AbstractCharik(bytes, UTF_8) { 261 }; 262 assertFalse(charik.equals("not Charik")); 263 } 264 ); 265 } 266 267 @Test 268 @DisplayName("#hashCode") 269 void spec_hashCode() { 270 var bytes = new byte[]{ 271 (byte) 0xf0, (byte) 0x9f, (byte) 0x8d, (byte) 0xbb 272 }; 273 AbstractCharik charik1 = new AbstractCharik(bytes, UTF_8) { 274 }; 275 AbstractCharik charik2 = new AbstractCharik(bytes, UTF_8) { 276 }; 277 assertEquals(charik1.hashCode(), charik2.hashCode()); 278 } 279 280 // helpers 281 282 private AbstractCharik charik(byte[] bytes) { 283 return new AbstractCharik(bytes, null) { 284 @Override 285 public Charset charset() { 286 throw new UnsupportedOperationException(); 287 } 288 }; 289 } 290 291 private AbstractCharik emptyCharik() { 292 return new AbstractCharik(new byte[0], null) { 293 @Override 294 public Charset charset() { 295 throw new UnsupportedOperationException(); 296 } 297 }; 298 } 299 300 private AbstractCharik nullCharik() { 301 return new AbstractCharik(null, null) { 302 @Override 303 public Charset charset() { 304 throw new UnsupportedOperationException(); 305 } 306 }; 307 } 308 309 }