Skip to content

Commit 528a74a

Browse files
committed
test: add DurationAdapter unit tests
1 parent b3b3f46 commit 528a74a

1 file changed

Lines changed: 156 additions & 0 deletions

File tree

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
package dev.objz.commandbridge.scripting.bind.adapters;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNull;
5+
import static org.junit.jupiter.api.Assertions.assertThrows;
6+
7+
import java.time.Duration;
8+
9+
import org.junit.jupiter.api.BeforeAll;
10+
import org.junit.jupiter.api.Test;
11+
12+
import dev.objz.commandbridge.scripting.bind.BindContext;
13+
import dev.objz.commandbridge.scripting.bind.ConvertContext;
14+
import dev.objz.commandbridge.scripting.platform.PlatformFeatures;
15+
import dev.objz.commandbridge.scripting.validation.ProblemSink;
16+
import dev.objz.commandbridge.scripting.yaml.YamlNode;
17+
18+
class DurationAdapterTest {
19+
20+
@BeforeAll
21+
static void installLog() {
22+
try {
23+
dev.objz.commandbridge.logging.Log.install(java.util.logging.Logger.getLogger("test"));
24+
} catch (IllegalStateException ignored) {
25+
// expected
26+
}
27+
}
28+
29+
private static ConvertContext ctx() {
30+
return new BindContext(null, new ProblemSink(), PlatformFeatures.none());
31+
}
32+
33+
@Test
34+
void parsesMilliseconds() {
35+
DurationAdapter adapter = new DurationAdapter();
36+
YamlNode node = YamlNode.scalar("500ms");
37+
Duration result = adapter.fromYaml(node, Duration.class, ctx());
38+
assertEquals(Duration.ofMillis(500), result);
39+
}
40+
41+
@Test
42+
void parsesSeconds() {
43+
DurationAdapter adapter = new DurationAdapter();
44+
YamlNode node = YamlNode.scalar("30s");
45+
Duration result = adapter.fromYaml(node, Duration.class, ctx());
46+
assertEquals(Duration.ofSeconds(30), result);
47+
}
48+
49+
@Test
50+
void parsesMinutes() {
51+
DurationAdapter adapter = new DurationAdapter();
52+
YamlNode node = YamlNode.scalar("5m");
53+
Duration result = adapter.fromYaml(node, Duration.class, ctx());
54+
assertEquals(Duration.ofMinutes(5), result);
55+
}
56+
57+
@Test
58+
void parsesHours() {
59+
DurationAdapter adapter = new DurationAdapter();
60+
YamlNode node = YamlNode.scalar("2h");
61+
Duration result = adapter.fromYaml(node, Duration.class, ctx());
62+
assertEquals(Duration.ofHours(2), result);
63+
}
64+
65+
@Test
66+
void parsesPlainNumberAsSeconds() {
67+
DurationAdapter adapter = new DurationAdapter();
68+
YamlNode node = YamlNode.scalar("60");
69+
Duration result = adapter.fromYaml(node, Duration.class, ctx());
70+
assertEquals(Duration.ofSeconds(60), result);
71+
}
72+
73+
@Test
74+
void parsesNumberValueAsMillis() {
75+
DurationAdapter adapter = new DurationAdapter();
76+
YamlNode node = YamlNode.scalar(1000L);
77+
Duration result = adapter.fromYaml(node, Duration.class, ctx());
78+
assertEquals(Duration.ofMillis(1000), result);
79+
}
80+
81+
@Test
82+
void parsesIntegerValueAsMillis() {
83+
DurationAdapter adapter = new DurationAdapter();
84+
YamlNode node = YamlNode.scalar(500);
85+
Duration result = adapter.fromYaml(node, Duration.class, ctx());
86+
assertEquals(Duration.ofMillis(500), result);
87+
}
88+
89+
@Test
90+
void returnsNullForNullValue() {
91+
DurationAdapter adapter = new DurationAdapter();
92+
YamlNode node = YamlNode.scalar(null);
93+
Duration result = adapter.fromYaml(node, Duration.class, ctx());
94+
assertNull(result);
95+
}
96+
97+
@Test
98+
void throwsForNonScalarNode() {
99+
DurationAdapter adapter = new DurationAdapter();
100+
YamlNode node = YamlNode.mapping(java.util.Map.of());
101+
assertThrows(IllegalArgumentException.class, () -> adapter.fromYaml(node, Duration.class, ctx()));
102+
}
103+
104+
@Test
105+
void throwsForEmptyString() {
106+
DurationAdapter adapter = new DurationAdapter();
107+
YamlNode node = YamlNode.scalar("");
108+
assertThrows(IllegalArgumentException.class, () -> adapter.fromYaml(node, Duration.class, ctx()));
109+
}
110+
111+
@Test
112+
void throwsForInvalidFormat() {
113+
DurationAdapter adapter = new DurationAdapter();
114+
YamlNode node = YamlNode.scalar("not-a-duration");
115+
assertThrows(NumberFormatException.class, () -> adapter.fromYaml(node, Duration.class, ctx()));
116+
}
117+
118+
@Test
119+
void caseInsensitiveUnits() {
120+
DurationAdapter adapter = new DurationAdapter();
121+
YamlNode node = YamlNode.scalar("10S");
122+
Duration result = adapter.fromYaml(node, Duration.class, ctx());
123+
assertEquals(Duration.ofSeconds(10), result);
124+
}
125+
126+
@Test
127+
void convertsToYamlSeconds() {
128+
DurationAdapter adapter = new DurationAdapter();
129+
Duration duration = Duration.ofSeconds(45);
130+
YamlNode result = adapter.toYaml(duration, Duration.class, ctx());
131+
assertEquals(YamlNode.scalar("45s"), result);
132+
}
133+
134+
@Test
135+
void convertsToYamlMillis() {
136+
DurationAdapter adapter = new DurationAdapter();
137+
Duration duration = Duration.ofMillis(500);
138+
YamlNode result = adapter.toYaml(duration, Duration.class, ctx());
139+
assertEquals(YamlNode.scalar("500ms"), result);
140+
}
141+
142+
@Test
143+
void convertsNullToYamlNull() {
144+
DurationAdapter adapter = new DurationAdapter();
145+
YamlNode result = adapter.toYaml(null, Duration.class, ctx());
146+
assertEquals(YamlNode.scalar(null), result);
147+
}
148+
149+
@Test
150+
void supportsOnlyDurationClass() {
151+
DurationAdapter adapter = new DurationAdapter();
152+
assertEquals(true, adapter.supports(Duration.class));
153+
assertEquals(false, adapter.supports(String.class));
154+
assertEquals(false, adapter.supports(Long.class));
155+
}
156+
}

0 commit comments

Comments
 (0)