1 package emissary.test.util;
2
3 import com.ibm.icu.text.Normalizer2;
4 import org.junit.jupiter.api.Test;
5 import org.junit.jupiter.api.condition.DisabledForJreRange;
6 import org.junit.jupiter.api.condition.EnabledForJreRange;
7 import org.junit.jupiter.api.condition.JRE;
8
9 import java.nio.charset.Charset;
10 import java.nio.charset.StandardCharsets;
11
12 import static org.junit.jupiter.api.Assertions.assertEquals;
13 import static org.junit.jupiter.api.Assertions.assertNotEquals;
14 import static org.junit.jupiter.api.Assertions.assertTrue;
15
16 class ComplexUnicodeSamplesTest {
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 @Test
42 void demonstrateMetadataAboutFacePalmDude() {
43
44 String facepalm = ComplexUnicodeSamples.getFacePalmingMaleControlSkintone();
45
46
47
48
49
50
51
52 assertEquals(17, facepalm.getBytes(StandardCharsets.UTF_8).length);
53 assertEquals(facepalm, new String(facepalm.getBytes(StandardCharsets.UTF_8)));
54
55
56
57
58
59
60
61
62 assertEquals(14, facepalm.getBytes(StandardCharsets.UTF_16BE).length);
63 assertEquals(facepalm, new String(facepalm.getBytes(StandardCharsets.UTF_16BE), StandardCharsets.UTF_16BE));
64 assertEquals(14, facepalm.getBytes(StandardCharsets.UTF_16LE).length);
65 assertEquals(facepalm, new String(facepalm.getBytes(StandardCharsets.UTF_16LE), StandardCharsets.UTF_16LE));
66
67
68
69
70
71
72 assertEquals(16, facepalm.getBytes(StandardCharsets.UTF_16).length);
73 assertEquals(facepalm, new String(facepalm.getBytes(StandardCharsets.UTF_16), StandardCharsets.UTF_16));
74
75
76 assertEquals(20, facepalm.getBytes(Charset.forName("UTF-32")).length);
77 assertEquals(facepalm, new String(facepalm.getBytes(Charset.forName("UTF-32")), Charset.forName("UTF-32")));
78
79
80 assertEquals(5, facepalm.getBytes(StandardCharsets.ISO_8859_1).length);
81 assertNotEquals(facepalm, new String(facepalm.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.ISO_8859_1));
82
83
84 assertEquals(5, facepalm.codePointCount(0, facepalm.length()));
85
86
87 assertEquals(1, ComplexUnicodeSamples.countGraphemesUsingIcu4J(facepalm));
88
89
90
91
92
93
94
95
96
97
98 Normalizer2 nfcDecomp = Normalizer2.getInstance(null, "nfc", Normalizer2.Mode.DECOMPOSE);
99 Normalizer2 nfkcDecomp = Normalizer2.getInstance(null, "nfkc", Normalizer2.Mode.DECOMPOSE);
100 assertTrue(nfcDecomp.isNormalized(facepalm));
101 assertTrue(nfkcDecomp.isNormalized(facepalm));
102
103 Normalizer2 nfcComp = Normalizer2.getInstance(null, "nfc", Normalizer2.Mode.COMPOSE);
104 Normalizer2 nfkcComp = Normalizer2.getInstance(null, "nfkc", Normalizer2.Mode.COMPOSE);
105 assertTrue(nfcComp.isNormalized(facepalm));
106 assertTrue(nfkcComp.isNormalized(facepalm));
107
108 }
109
110 @Test
111 @EnabledForJreRange(min = JRE.JAVA_20, disabledReason = "This test only valid for Java 20 and later.")
112 void demonstrateMetadataAboutFacePalmDudeForJava20() {
113 String facepalm = ComplexUnicodeSamples.getFacePalmingMaleControlSkintone();
114 assertEquals(1, ComplexUnicodeSamples.countGraphemesUsingJavaBuiltInBreakIterator(facepalm));
115 }
116
117 @Test
118 @DisabledForJreRange(min = JRE.JAVA_20, disabledReason = "This test only valid for Java versions up to not including Java 20.")
119 void demonstrateMetadataAboutFacePalmDudePriorToJava20() {
120 String facepalm = ComplexUnicodeSamples.getFacePalmingMaleControlSkintone();
121 assertEquals(4, ComplexUnicodeSamples.countGraphemesUsingJavaBuiltInBreakIterator(facepalm));
122
123 }
124
125 @Test
126 @EnabledForJreRange(min = JRE.JAVA_17, disabledReason = "This test only valid for Java 17 and later.")
127 void demonstrateMetadataAboutFacePalmDudeForJava17AndLater() {
128 String facepalm = ComplexUnicodeSamples.getFacePalmingMaleControlSkintone();
129 int j = 27;
130 assertEquals(j, facepalm.repeat(j).split("\\b{g}").length);
131 }
132
133 @Test
134 @DisabledForJreRange(min = JRE.JAVA_17, disabledReason = "This test only valid for Java versions up to not including Java 17.")
135 void demonstrateMetadataAboutFacePalmDudePriorToJava17() {
136 String facepalm = ComplexUnicodeSamples.getFacePalmingMaleControlSkintone();
137 int j = 27;
138 assertEquals(j * 3, facepalm.repeat(j).split("\\b{g}").length);
139
140 }
141
142
143 }