Skip to content

Commit 3083cc1

Browse files
committed
Added more UTs
1 parent 42522c5 commit 3083cc1

File tree

1 file changed

+179
-0
lines changed

1 file changed

+179
-0
lines changed
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
package org.hypertrace.core.documentstore.expression.impl;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNotEquals;
5+
import static org.junit.jupiter.api.Assertions.assertThrows;
6+
7+
import org.junit.jupiter.api.Test;
8+
9+
class AliasedIdentifierExpressionTest {
10+
11+
@Test
12+
void testBuilderCreatesInstance() {
13+
AliasedIdentifierExpression expression =
14+
AliasedIdentifierExpression.builder().name("column1").contextAlias("alias1").build();
15+
16+
assertEquals("column1", expression.getName());
17+
assertEquals("alias1", expression.getContextAlias());
18+
}
19+
20+
@Test
21+
void testBuilderThrowsExceptionForNullName() {
22+
assertThrows(
23+
IllegalArgumentException.class,
24+
() -> AliasedIdentifierExpression.builder().contextAlias("alias1").build());
25+
}
26+
27+
@Test
28+
void testBuilderThrowsExceptionForBlankName() {
29+
assertThrows(
30+
IllegalArgumentException.class,
31+
() -> AliasedIdentifierExpression.builder().name("").contextAlias("alias1").build());
32+
}
33+
34+
@Test
35+
void testBuilderThrowsExceptionForNullContextAlias() {
36+
assertThrows(
37+
IllegalArgumentException.class,
38+
() -> AliasedIdentifierExpression.builder().name("column1").build());
39+
}
40+
41+
@Test
42+
void testBuilderThrowsExceptionForBlankContextAlias() {
43+
assertThrows(
44+
IllegalArgumentException.class,
45+
() -> AliasedIdentifierExpression.builder().name("column1").contextAlias("").build());
46+
}
47+
48+
@Test
49+
void testEqualsWithSameNameAndContextAlias() {
50+
AliasedIdentifierExpression expr1 =
51+
AliasedIdentifierExpression.builder().name("item").contextAlias("latest").build();
52+
AliasedIdentifierExpression expr2 =
53+
AliasedIdentifierExpression.builder().name("item").contextAlias("latest").build();
54+
55+
assertEquals(expr1, expr2);
56+
assertEquals(expr1.hashCode(), expr2.hashCode());
57+
}
58+
59+
@Test
60+
void testNotEqualsWithDifferentContextAlias() {
61+
AliasedIdentifierExpression expr1 =
62+
AliasedIdentifierExpression.builder().name("item").contextAlias("latest").build();
63+
AliasedIdentifierExpression expr2 =
64+
AliasedIdentifierExpression.builder().name("item").contextAlias("oldest").build();
65+
66+
assertNotEquals(expr1, expr2);
67+
}
68+
69+
@Test
70+
void testNotEqualsWithDifferentName() {
71+
AliasedIdentifierExpression expr1 =
72+
AliasedIdentifierExpression.builder().name("item").contextAlias("latest").build();
73+
AliasedIdentifierExpression expr2 =
74+
AliasedIdentifierExpression.builder().name("product").contextAlias("latest").build();
75+
76+
assertNotEquals(expr1, expr2);
77+
}
78+
79+
@Test
80+
void testEqualsAndHashCodeVerifiesCallSuperTrue() {
81+
// This tests that @EqualsAndHashCode(callSuper = true) is working correctly
82+
// by ensuring that the superclass field 'name' is considered in equality
83+
AliasedIdentifierExpression expr1 =
84+
AliasedIdentifierExpression.builder().name("column1").contextAlias("alias1").build();
85+
AliasedIdentifierExpression expr2 =
86+
AliasedIdentifierExpression.builder().name("column1").contextAlias("alias1").build();
87+
AliasedIdentifierExpression expr3 =
88+
AliasedIdentifierExpression.builder().name("column2").contextAlias("alias1").build();
89+
90+
// Same name and alias - should be equal
91+
assertEquals(expr1, expr2);
92+
assertEquals(expr1.hashCode(), expr2.hashCode());
93+
94+
// Different name but same alias - should NOT be equal (proves callSuper = true)
95+
assertNotEquals(expr1, expr3);
96+
}
97+
98+
@Test
99+
void testNotEqualsWithIdentifierExpression() {
100+
// Even if name is the same, AliasedIdentifierExpression should not equal IdentifierExpression
101+
AliasedIdentifierExpression aliasedExpr =
102+
AliasedIdentifierExpression.builder().name("column").contextAlias("alias1").build();
103+
IdentifierExpression identExpr = IdentifierExpression.of("column");
104+
105+
assertNotEquals(aliasedExpr, identExpr);
106+
assertNotEquals(identExpr, aliasedExpr);
107+
}
108+
109+
@Test
110+
void testHashCodeConsistencyAcrossMultipleInstances() {
111+
AliasedIdentifierExpression expr1 =
112+
AliasedIdentifierExpression.builder().name("item").contextAlias("latest").build();
113+
AliasedIdentifierExpression expr2 =
114+
AliasedIdentifierExpression.builder().name("item").contextAlias("latest").build();
115+
AliasedIdentifierExpression expr3 =
116+
AliasedIdentifierExpression.builder().name("item").contextAlias("latest").build();
117+
118+
// Verify transitivity
119+
assertEquals(expr1, expr2);
120+
assertEquals(expr2, expr3);
121+
assertEquals(expr1, expr3);
122+
123+
// Verify hashCode consistency
124+
assertEquals(expr1.hashCode(), expr2.hashCode());
125+
assertEquals(expr2.hashCode(), expr3.hashCode());
126+
assertEquals(expr1.hashCode(), expr3.hashCode());
127+
}
128+
129+
@Test
130+
void testEqualsReflexive() {
131+
AliasedIdentifierExpression expr =
132+
AliasedIdentifierExpression.builder().name("column").contextAlias("alias").build();
133+
134+
assertEquals(expr, expr);
135+
}
136+
137+
@Test
138+
void testEqualsSymmetric() {
139+
AliasedIdentifierExpression expr1 =
140+
AliasedIdentifierExpression.builder().name("column").contextAlias("alias").build();
141+
AliasedIdentifierExpression expr2 =
142+
AliasedIdentifierExpression.builder().name("column").contextAlias("alias").build();
143+
144+
assertEquals(expr1, expr2);
145+
assertEquals(expr2, expr1);
146+
}
147+
148+
@Test
149+
void testToStringFormat() {
150+
AliasedIdentifierExpression expression =
151+
AliasedIdentifierExpression.builder().name("item").contextAlias("latest").build();
152+
153+
assertEquals("`latest.item`", expression.toString());
154+
}
155+
156+
@Test
157+
void testCallSuperTrueConsidersSuperclassFields() {
158+
// Create two instances with:
159+
// - Same contextAlias (own field)
160+
// - Different name (superclass field)
161+
AliasedIdentifierExpression expr1 =
162+
AliasedIdentifierExpression.builder().name("field1").contextAlias("ctx").build();
163+
AliasedIdentifierExpression expr2 =
164+
AliasedIdentifierExpression.builder().name("field2").contextAlias("ctx").build();
165+
166+
// They should NOT be equal because the superclass field 'name' is different
167+
// This proves @EqualsAndHashCode(callSuper = true) is working
168+
assertNotEquals(
169+
expr1,
170+
expr2,
171+
"Instances with same contextAlias but different superclass 'name' should not be equal");
172+
173+
// HashCodes should also be different (though not guaranteed by contract, usually are)
174+
assertNotEquals(
175+
expr1.hashCode(),
176+
expr2.hashCode(),
177+
"Instances with different superclass fields should have different hashCodes");
178+
}
179+
}

0 commit comments

Comments
 (0)