Packages

A model management framework supporting multi-layered abstraction structures, pluggable data layers, and arbitrary command-line transform tools.

Current section

Files

Jump to
paradigm lib testing conformance_test_suite basic_validation.ex
Raw

lib/testing/conformance_test_suite/basic_validation.ex

defmodule Paradigm.Conformance.TestSuite.BasicValidation do
defmacro __using__(_opts) do
quote do
alias Paradigm.Graph
describe "check_graph/2" do
test "validates valid graph" do
paradigm = %Paradigm{
primitive_types: %{"string" => %Paradigm.PrimitiveType{name: "String"}},
classes: %{
"class1" => %Paradigm.Class{
name: "TestClass",
properties: %{
"testProp" => %Paradigm.Property{
name: "testProp",
lower_bound: 1,
upper_bound: 1,
type: "string"
}
}
}
}
}
node = %Paradigm.Graph.Node{
id: "node1",
class: "class1",
data: %{"testProp" => "value"}
}
graph = build_graph(node)
Paradigm.Conformance.assert_conforms(graph, paradigm)
end
test "detects invalid class" do
paradigm = %Paradigm{
classes: %{}
}
node = %Paradigm.Graph.Node{id: "node1", class: "invalid_class", data: %{}}
graph = build_graph(node)
assert %Paradigm.Conformance.Result{
issues: [
%Paradigm.Conformance.Issue{
property: nil,
kind: :invalid_class,
details: %{class: "invalid_class"},
node_id: "node1"
}
]
} =
Paradigm.Conformance.check_graph(graph, paradigm)
end
test "detects abstract class" do
paradigm = %Paradigm{
classes: %{
"class1" => %Paradigm.Class{
name: "TestClass",
is_abstract: true,
properties: %{}
}
}
}
node = %Paradigm.Graph.Node{id: "node1", class: "class1", data: %{}}
graph = build_graph(node)
assert %Paradigm.Conformance.Result{
issues: [
%Paradigm.Conformance.Issue{
property: nil,
kind: :abstract_class_instantiated,
details: %{class: "class1"},
node_id: "node1"
}
]
} =
Paradigm.Conformance.check_graph(graph, paradigm)
end
test "validates inherited properties from superclass" do
paradigm = %Paradigm{
primitive_types: %{"string" => %Paradigm.PrimitiveType{name: "String"}},
classes: %{
"parent_class" => %Paradigm.Class{
name: "ParentClass",
properties: %{
"parentProp" => %Paradigm.Property{
name: "parentProp",
lower_bound: 1,
upper_bound: 1,
type: "string"
}
}
},
"child_class" => %Paradigm.Class{
name: "ChildClass",
properties: %{
"childProp" => %Paradigm.Property{
name: "childProp",
lower_bound: 1,
upper_bound: 1,
type: "string"
}
},
super_classes: ["parent_class"]
}
}
}
node = %Paradigm.Graph.Node{
id: "node1",
class: "child_class",
data: %{
"parentProp" => "parent_value",
"childProp" => "child_value"
}
}
graph = build_graph(node)
Paradigm.Conformance.assert_conforms(graph, paradigm)
# Missing inherited property
invalid_node = %Paradigm.Graph.Node{
id: "node1",
class: "child_class",
data: %{"childProp" => "child_value"}
}
invalid_graph = build_graph(invalid_node)
assert %Paradigm.Conformance.Result{
issues: [
%Paradigm.Conformance.Issue{
property: "parentProp",
kind: :missing_property,
details: %{class: "child_class"},
node_id: "node1"
}
]
} =
Paradigm.Conformance.check_graph(invalid_graph, paradigm)
end
test "validates ordered property constraints" do
paradigm = %Paradigm{
primitive_types: %{"string" => %Paradigm.PrimitiveType{name: "String"}},
classes: %{
"class1" => %Paradigm.Class{
name: "TestClass",
properties: %{
"orderedProp" => %Paradigm.Property{
name: "orderedProp",
is_ordered: true,
lower_bound: 1,
upper_bound: :infinity,
type: "string"
}
}
}
}
}
node = %Paradigm.Graph.Node{
id: "node1",
class: "class1",
data: %{"orderedProp" => ["value1", "value2", "value3"]}
}
graph = build_graph(node)
Paradigm.Conformance.assert_conforms(graph, paradigm)
end
test "detects missing required properties" do
paradigm = %Paradigm{
primitive_types: %{"string" => %Paradigm.PrimitiveType{name: "String"}},
classes: %{
"class1" => %Paradigm.Class{
name: "TestClass",
properties: %{
"testProp" => %Paradigm.Property{
name: "testProp",
type: "string"
}
}
}
}
}
node = %Paradigm.Graph.Node{id: "node1", class: "class1", data: %{}}
graph = build_graph(node)
assert %Paradigm.Conformance.Result{
issues: [
%Paradigm.Conformance.Issue{
property: "testProp",
kind: :missing_property,
details: %{class: "class1"},
node_id: "node1"
}
]
} ==
Paradigm.Conformance.check_graph(graph, paradigm)
end
test "detects extra properties" do
paradigm = %Paradigm{
classes: %{
"class1" => %Paradigm.Class{
name: "TestClass",
properties: %{}
}
}
}
node = %Paradigm.Graph.Node{
id: "node1",
class: "class1",
data: %{"extraProp" => "value"}
}
graph = build_graph(node)
assert %Paradigm.Conformance.Result{
issues: [
%Paradigm.Conformance.Issue{
property: "extraProp",
kind: :unknown_property,
details: %{class: "class1"},
node_id: "node1"
}
]
} =
Paradigm.Conformance.check_graph(graph, paradigm)
end
test "validates enumeration values" do
paradigm = %Paradigm{
classes: %{
"class1" => %Paradigm.Class{
name: "TestClass",
properties: %{
"enumProp" => %Paradigm.Property{
name: "enumProp",
type: "color_enum"
}
}
}
},
enumerations: %{
"color_enum" => %Paradigm.Enumeration{
name: "Color",
literals: ["RED", "GREEN", "BLUE"]
}
}
}
# Test valid enum value
node1 = %Paradigm.Graph.Node{
id: "node1",
class: "class1",
data: %{"enumProp" => "RED"}
}
graph1 = build_graph(node1)
Paradigm.Conformance.assert_conforms(graph1, paradigm)
# Test invalid enum value
node2 = %Paradigm.Graph.Node{
id: "node1",
class: "class1",
data: %{"enumProp" => "PURPLE"}
}
graph2 = build_graph(node2)
assert %Paradigm.Conformance.Result{
issues: [
%Paradigm.Conformance.Issue{
property: "enumProp",
kind: :invalid_enum_value,
details: %{value: "PURPLE"},
node_id: "node1"
}
]
} =
Paradigm.Conformance.check_graph(graph2, paradigm)
end
end
end
end
end