Skip to content

Commit be4661b

Browse files
committed
Add test & refactor tests that load resources
1 parent 414182c commit be4661b

File tree

5 files changed

+61
-22
lines changed

5 files changed

+61
-22
lines changed

smithy-rules-engine/src/main/java/software/amazon/smithy/rulesengine/language/syntax/expr/Expression.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ public Type typeCheck(Scope<Type> scope) {
208208
*/
209209
public Type type() {
210210
if (cachedType == null) {
211-
throw new RuntimeException("you must call typeCheck first");
211+
throw new RuntimeException("typechecking was never invoked on this expression.");
212212
}
213213
return cachedType;
214214
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package software.amazon.smithy.rulesengine;
2+
3+
import java.io.InputStream;
4+
import software.amazon.smithy.model.node.Node;
5+
import software.amazon.smithy.model.node.ObjectNode;
6+
import software.amazon.smithy.rulesengine.language.EndpointRuleSet;
7+
8+
public class RulesetTestUtil {
9+
public static EndpointRuleSet loadRuleSet(String resourceId) {
10+
InputStream is = RulesetTestUtil.class.getClassLoader().getResourceAsStream(resourceId);
11+
assert is != null;
12+
Node node = ObjectNode.parse(is);
13+
return EndpointRuleSet.fromNode(node);
14+
}
15+
16+
public static EndpointRuleSet minimalRuleSet() {
17+
return loadRuleSet("software/amazon/smithy/rulesengine/testutil/valid-rules/minimal-ruleset.json");
18+
}
19+
20+
}

smithy-rules-engine/src/test/java/software/amazon/smithy/rulesengine/language/EndpointRuleSetTest.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import software.amazon.smithy.model.SourceLocation;
2424
import software.amazon.smithy.model.node.Node;
2525
import software.amazon.smithy.model.node.ObjectNode;
26+
import software.amazon.smithy.rulesengine.RulesetTestUtil;
2627
import software.amazon.smithy.rulesengine.language.eval.RuleEvaluator;
2728
import software.amazon.smithy.rulesengine.language.eval.Scope;
2829
import software.amazon.smithy.rulesengine.language.eval.Value;
@@ -35,17 +36,9 @@
3536
import software.amazon.smithy.utils.MapUtils;
3637

3738
class EndpointRuleSetTest {
38-
private EndpointRuleSet parse(String resource) {
39-
InputStream is = getClass().getClassLoader().getResourceAsStream(resource);
40-
assert is != null;
41-
Node node = ObjectNode.parse(is);
42-
return EndpointRuleSet.fromNode(node);
43-
}
44-
4539
@Test
4640
void testRuleEval() {
47-
EndpointRuleSet actual = parse(
48-
"software/amazon/smithy/rulesengine/testutil/valid-rules/minimal-ruleset.json");
41+
EndpointRuleSet actual = RulesetTestUtil.minimalRuleSet();
4942
Value result = RuleEvaluator.evaluate(actual, MapUtils.of(Identifier.of("Region"),
5043
Value.string("us-east-1")));
5144
Value.Endpoint expected = new Value.Endpoint.Builder(SourceLocation.none())
@@ -63,9 +56,7 @@ void testRuleEval() {
6356

6457
@Test
6558
void testMinimalRuleset() {
66-
EndpointRuleSet actual = parse(
67-
"software/amazon/smithy/rulesengine/testutil/valid-rules/minimal-ruleset.json");
68-
actual.typeCheck(new Scope<>());
59+
EndpointRuleSet actual = RulesetTestUtil.minimalRuleSet();
6960
assertEquals(EndpointRuleSet.builder()
7061
.version("1.3")
7162
.parameters(Parameters
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package software.amazon.smithy.rulesengine.language;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.io.InputStream;
6+
import java.util.List;
7+
import org.junit.jupiter.api.Test;
8+
import software.amazon.smithy.model.node.Node;
9+
import software.amazon.smithy.model.node.ObjectNode;
10+
import software.amazon.smithy.rulesengine.RulesetTestUtil;
11+
import software.amazon.smithy.rulesengine.language.EndpointRuleSet;
12+
import software.amazon.smithy.rulesengine.language.eval.Type;
13+
import software.amazon.smithy.rulesengine.language.syntax.rule.Condition;
14+
15+
public class TypeIntrospectionTest {
16+
@Test
17+
void introspectCorrectTypesForFunctions() {
18+
EndpointRuleSet actual = RulesetTestUtil.loadRuleSet(
19+
"software/amazon/smithy/rulesengine/testutil/valid-rules/substring.json");
20+
List<Condition> conditions = actual.getRules().get(0).getConditions();
21+
// stringEquals({TestCaseId}, 1)
22+
assertEquals(conditions.get(0).getFn().type(), Type.bool());
23+
24+
// output = substring({Input}, ...);
25+
assertEquals(conditions.get(1).getFn().type(), Type.optional(Type.string()));
26+
}
27+
28+
@Test
29+
void introspectCorrectTypesForGetAttr() {
30+
EndpointRuleSet actual = RulesetTestUtil.loadRuleSet(
31+
"software/amazon/smithy/rulesengine/testutil/valid-rules/get-attr-type-inference.json");
32+
// bucketArn.resourceId[2]
33+
assertEquals(actual.getRules().get(0).getConditions().get(2).getFn().type(), Type.optional(Type.string()));
34+
}
35+
}

smithy-rules-engine/src/test/java/software/amazon/smithy/rulesengine/language/eval/RuleEngineTest.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,16 @@
2323
import software.amazon.smithy.model.SourceLocation;
2424
import software.amazon.smithy.model.node.Node;
2525
import software.amazon.smithy.model.node.ObjectNode;
26+
import software.amazon.smithy.rulesengine.RulesetTestUtil;
2627
import software.amazon.smithy.rulesengine.language.EndpointRuleSet;
2728
import software.amazon.smithy.rulesengine.language.syntax.Identifier;
2829
import software.amazon.smithy.utils.MapUtils;
2930

3031
class RuleEngineTest {
3132

32-
private EndpointRuleSet parse(String resource) {
33-
InputStream is = getClass().getClassLoader().getResourceAsStream(resource);
34-
assert is != null;
35-
Node node = ObjectNode.parse(is);
36-
return EndpointRuleSet.fromNode(node);
37-
}
38-
3933
@Test
4034
void testRuleEval() {
41-
EndpointRuleSet actual = parse(
42-
"software/amazon/smithy/rulesengine/testutil/valid-rules/minimal-ruleset.json");
35+
EndpointRuleSet actual = RulesetTestUtil.minimalRuleSet();
4336
Value result = RuleEvaluator.evaluate(actual, MapUtils.of(Identifier.of("Region"),
4437
Value.string("us-east-1")));
4538
Value.Endpoint expected = new Value.Endpoint.Builder(SourceLocation.none())

0 commit comments

Comments
 (0)