import pattern_core
def test_pattern_inspection():
atomic = pattern_core.Pattern.point("hello")
assert atomic.length() == 0
assert atomic.size() == 1
assert atomic.depth() == 0
assert atomic.is_atomic() is True
child1 = pattern_core.Pattern.point("child1")
child2 = pattern_core.Pattern.point("child2")
parent = pattern_core.Pattern.pattern("parent", [child1, child2])
assert parent.length() == 2
assert parent.size() == 3 assert parent.depth() == 1
assert parent.is_atomic() is False
grandchild = pattern_core.Pattern.point("grandchild")
nested_child = pattern_core.Pattern.pattern("nested", [grandchild])
deep_parent = pattern_core.Pattern.pattern("root", [nested_child])
assert deep_parent.depth() == 2
assert deep_parent.size() == 3
def test_pattern_queries():
pattern = pattern_core.Pattern.pattern("root", [
pattern_core.Pattern.point("hello"),
pattern_core.Pattern.point("world"),
pattern_core.Pattern.point("python")
])
assert pattern.any_value(lambda v: "o" in v) is True
assert pattern.any_value(lambda v: "z" in v) is False
assert pattern.all_values(lambda v: isinstance(v, str)) is True
filtered = pattern.filter(lambda p: len(p.value) > 4)
assert len(filtered) == 3
found = pattern.find_first(lambda p: p.value.startswith("w"))
assert found is not None
assert found.value == "world"
pattern2 = pattern_core.Pattern.pattern("root", [
pattern_core.Pattern.point("hello"),
pattern_core.Pattern.point("world"),
pattern_core.Pattern.point("python")
])
assert pattern.matches(pattern2) is True
subpattern = pattern_core.Pattern.point("hello")
assert pattern.contains(subpattern) is True
def test_pattern_transformations():
pattern = pattern_core.Pattern.pattern("hello", [
pattern_core.Pattern.point("world"),
pattern_core.Pattern.point("python")
])
upper = pattern.map(str.upper)
assert upper.value == "HELLO"
assert upper.elements[0].value == "WORLD"
assert upper.elements[1].value == "PYTHON"
result = pattern.fold("", lambda acc, v: acc + v + " ")
assert "hello world python " in result
def test_pattern_combination():
p1 = pattern_core.Pattern.point("hello")
p2 = pattern_core.Pattern.point(" world")
combined = p1.combine(p2)
assert combined.value == "hello world"
p3 = pattern_core.Pattern.pattern("a", [
pattern_core.Pattern.point("b"),
pattern_core.Pattern.point("c")
])
p4 = pattern_core.Pattern.pattern("d", [
pattern_core.Pattern.point("e")
])
result = p3.combine(p4)
assert result.value == "ad"
assert len(result.elements) == 3
def test_pattern_comonad():
pattern = pattern_core.Pattern.pattern("root", [
pattern_core.Pattern.pattern("a", [
pattern_core.Pattern.point("x")
]),
pattern_core.Pattern.point("b")
])
assert pattern.extract() == "root"
depths = pattern.extend(lambda p: p.depth())
assert depths.value == 2 assert depths.elements[0].value == 1 assert depths.elements[1].value == 0
depths2 = pattern.depth_at()
assert depths2.value == 2
assert depths2.elements[0].value == 1
sizes = pattern.size_at()
assert sizes.value == 4 assert sizes.elements[0].value == 2 assert sizes.elements[1].value == 1
indices = pattern.indices_at()
assert indices.value == [] assert indices.elements[0].value == [0] assert indices.elements[1].value == [1]
def test_pattern_subject_operations():
subject1 = pattern_core.Subject(
identity="alice",
labels={"Person"},
properties={"name": pattern_core.Value.string("Alice")}
)
subject2 = pattern_core.Subject(
identity="bob",
labels={"Person"},
properties={"name": pattern_core.Value.string("Bob")}
)
pattern = pattern_core.Pattern.pattern(
subject1,
[pattern_core.Pattern.point(subject2)]
)
assert pattern.length() == 1
assert pattern.size() == 2
assert pattern.depth() == 1
assert pattern.any_value(lambda s: s.identity == "bob") is True
assert pattern.all_values(lambda s: "Person" in s.get_labels()) is True
def add_label(s):
s.add_label("Employee")
return s
mapped = pattern.map(add_label)
assert mapped.value.has_label("Employee") is True