Skip to content
This repository was archived by the owner on Apr 25, 2024. It is now read-only.

File tree

20 files changed

+527
-3
lines changed

20 files changed

+527
-3
lines changed

deps/K_VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5.5.4
1+
5.5.32

k-files/ctor.k

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module CTOR
2+
syntax Foo ::= one() | two() | three()
3+
endmodule

k-files/steps.k

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module STEPS-SYNTAX
2+
endmodule
3+
4+
module STEPS
5+
imports INT
6+
syntax Foo ::= foo(Int) | bar()
7+
rule foo(I) => foo(I -Int 1) requires I >Int 0
8+
rule foo(_) => bar() [owise]
9+
endmodule

package/version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.1.66
1+
0.1.67

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
44

55
[tool.poetry]
66
name = "pyk"
7-
version = "0.1.66"
7+
version = "0.1.67"
88
description = ""
99
authors = [
1010
"Runtime Verification, Inc. <[email protected]>",

src/integration_tests/kllvm/__init__.py

Whitespace-only changes.
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from pathlib import Path
2+
3+
from pyk.kllvm.parser import Parser, read_pattern
4+
5+
6+
def test_read_pattern(tmp_path: Path) -> None:
7+
# Given
8+
kore_text = 'A{}(B{}(),C{}())'
9+
kore_file = tmp_path / 'test.kore'
10+
kore_file.write_text(kore_text)
11+
12+
# When
13+
actual = read_pattern(kore_file)
14+
15+
# Then
16+
assert str(actual) == kore_text
17+
18+
19+
def test_parser_from_file(tmp_path: Path) -> None:
20+
# Given
21+
kore_text = 'A{}(B{}(),C{}())'
22+
kore_file = tmp_path / 'test.kore'
23+
kore_file.write_text(kore_text)
24+
parser = Parser(str(kore_file))
25+
26+
# When
27+
actual = parser.pattern()
28+
29+
# Then
30+
assert str(actual) == kore_text
31+
32+
33+
def test_parser_from_string() -> None:
34+
# Given
35+
kore_text = 'A{}(X : S,Y : Z,Int{}())'
36+
parser = Parser.from_string(kore_text)
37+
38+
# When
39+
actual = parser.pattern()
40+
41+
# Then
42+
assert str(actual) == kore_text
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from tempfile import NamedTemporaryFile
2+
from unittest import TestCase
3+
4+
from pyk.kllvm.ast import CompositePattern, CompositeSort, Pattern, StringPattern, VariablePattern
5+
6+
7+
class PatternTest(TestCase):
8+
def test_file_load(self) -> None:
9+
# Given
10+
test_data = (
11+
'A{}(B{}(),C{}())',
12+
'"string pattern"',
13+
'XYZ : ABC',
14+
)
15+
16+
for text in test_data:
17+
with self.subTest(text):
18+
with NamedTemporaryFile(mode='w') as f:
19+
f.write(text)
20+
f.flush()
21+
22+
# When
23+
actual = Pattern(f.name)
24+
25+
# Then
26+
self.assertEqual(str(actual), text)
27+
28+
def test_composite(self) -> None:
29+
# Given
30+
pattern = CompositePattern('F')
31+
pattern.add_argument(CompositePattern('A'))
32+
pattern.add_argument(VariablePattern('X', CompositeSort('S')))
33+
34+
# When
35+
actual = pattern.substitute({'X': CompositePattern('B')})
36+
37+
# Then
38+
self.assertEqual(str(actual), 'F{}(A{}(),B{}())')
39+
40+
def test_string(self) -> None:
41+
# Given
42+
pattern = StringPattern('abc')
43+
44+
# Then
45+
self.assertEqual(str(pattern), '"abc"')
46+
self.assertEqual(pattern.contents, 'abc')
47+
48+
def test_variable(self) -> None:
49+
# Given
50+
pattern = VariablePattern('X', CompositeSort('S'))
51+
52+
# When
53+
actual = pattern.substitute({'X': CompositePattern('A')})
54+
55+
# Then
56+
self.assertEqual(str(actual), 'A{}()')
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
from unittest import TestCase
2+
3+
from pyk.kllvm.ast import CompositeSort, SortVariable
4+
5+
6+
class SortTest(TestCase):
7+
def test_is_concrete(self) -> None:
8+
# Given
9+
test_data = (
10+
(CompositeSort('A'), True),
11+
(SortVariable('B'), False),
12+
)
13+
14+
for i, (sort, expected) in enumerate(test_data):
15+
with self.subTest(i=i):
16+
# When
17+
actual = sort.is_concrete
18+
19+
# Then
20+
self.assertEqual(actual, expected)
21+
22+
def test_name(self) -> None:
23+
# Given
24+
names = ('A', 'SortInt', '')
25+
26+
for name in names:
27+
with self.subTest(name):
28+
# When
29+
sort = CompositeSort(name)
30+
31+
# Then
32+
self.assertEqual(sort.name, name)
33+
34+
def test_str(self) -> None:
35+
# Given
36+
test_data = (
37+
(CompositeSort('A'), 'A{}'),
38+
(SortVariable('B'), 'B'),
39+
)
40+
41+
for i, (sort, expected) in enumerate(test_data):
42+
with self.subTest(i=i):
43+
# When
44+
actual = str(sort)
45+
46+
# Then
47+
self.assertEqual(actual, expected)
48+
49+
def test_add_argument(self) -> None:
50+
# Given
51+
f = CompositeSort('F')
52+
a = CompositeSort('A')
53+
b = SortVariable('B')
54+
55+
# When
56+
f.add_argument(a)
57+
f.add_argument(b)
58+
59+
# Then
60+
self.assertEqual(str(f), 'F{A{},B}')
61+
62+
def test_substitution_1(self) -> None:
63+
# Given
64+
x = SortVariable('X')
65+
a = CompositeSort('A')
66+
expected = a
67+
68+
# When
69+
actual = a.substitute({x: a})
70+
71+
# Then
72+
self.assertEqual(actual, expected)
73+
74+
def test_substitution_2(self) -> None:
75+
x = SortVariable('X')
76+
y = SortVariable('Y')
77+
a = CompositeSort('A')
78+
b = CompositeSort('B')
79+
c = CompositeSort('C')
80+
81+
original = CompositeSort('F')
82+
g1 = CompositeSort('G')
83+
g1.add_argument(x)
84+
g1.add_argument(x)
85+
g1.add_argument(b)
86+
g1.add_argument(y)
87+
original.add_argument(g1)
88+
89+
self.assertEqual(str(original), 'F{G{X,X,B{},Y}}')
90+
self.assertFalse(original.is_concrete)
91+
92+
expected = CompositeSort('F')
93+
g2 = CompositeSort('G')
94+
g2.add_argument(a)
95+
g2.add_argument(a)
96+
g2.add_argument(b)
97+
g2.add_argument(c)
98+
expected.add_argument(g2)
99+
100+
self.assertEqual(str(expected), 'F{G{A{},A{},B{},C{}}}')
101+
self.assertTrue(expected.is_concrete)
102+
103+
# When
104+
actual = original.substitute({x: a, y: c})
105+
106+
# Then
107+
self.assertEqual(actual, expected)
108+
109+
def test_equality(self) -> None:
110+
# Given
111+
a1 = CompositeSort('A')
112+
a2 = CompositeSort('A')
113+
b1 = SortVariable('B')
114+
b2 = SortVariable('B')
115+
116+
# Then
117+
self.assertIsNot(a1, a2)
118+
self.assertEqual(a1, a2)
119+
self.assertIsNot(b1, b2)
120+
self.assertEqual(b1, b2)
121+
self.assertNotEqual(a1, b1)
122+
self.assertNotEqual(a2, b2)
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
from pyk.kllvm.ast import Pattern
2+
from pyk.kllvm.parser import Parser
3+
4+
from .utils import RuntimeTest
5+
6+
7+
class StepTest(RuntimeTest):
8+
KOMPILE_MAIN_FILE = 'k-files/steps.k'
9+
10+
def test_steps_1(self) -> None:
11+
term = self.runtime.Term(start_pattern())
12+
term.step(0)
13+
self.assertEqual(str(term), foo_output(0))
14+
term.step()
15+
term.step()
16+
self.assertEqual(str(term), foo_output(2))
17+
term.step(200)
18+
self.assertEqual(str(term), bar_output())
19+
20+
def test_steps_2(self) -> None:
21+
term = self.runtime.Term(start_pattern())
22+
self.assertEqual(str(term), foo_output(0))
23+
term.step(50)
24+
self.assertEqual(str(term), foo_output(50))
25+
term.step(-1)
26+
self.assertEqual(str(term), bar_output())
27+
28+
def test_steps_3(self) -> None:
29+
term = self.runtime.Term(start_pattern())
30+
term.run()
31+
self.assertEqual(str(term), bar_output())
32+
33+
34+
def start_pattern() -> Pattern:
35+
"""
36+
<k> foo(100) </k>
37+
"""
38+
text = r"""
39+
LblinitGeneratedTopCell{}(
40+
Lbl'Unds'Map'Unds'{}(
41+
Lbl'Stop'Map{}(),
42+
Lbl'UndsPipe'-'-GT-Unds'{}(
43+
inj{SortKConfigVar{}, SortKItem{}}(\dv{SortKConfigVar{}}("$PGM")),
44+
inj{SortFoo{}, SortKItem{}}(
45+
inj{SortFoo{}, SortKItem{}}(
46+
Lblfoo'LParUndsRParUnds'STEPS'Unds'Foo'Unds'Int{}(\dv{SortInt{}}("100"))
47+
)
48+
)
49+
)
50+
)
51+
)
52+
"""
53+
return Parser.from_string(text).pattern()
54+
55+
56+
def foo_output(n: int) -> str:
57+
"""
58+
<k> foo(100 - n) </k>
59+
"""
60+
return fr"""Lbl'-LT-'generatedTop'-GT-'{{}}(Lbl'-LT-'k'-GT-'{{}}(kseq{{}}(inj{{SortFoo{{}}, SortKItem{{}}}}(Lblfoo'LParUndsRParUnds'STEPS'Unds'Foo'Unds'Int{{}}(\dv{{SortInt{{}}}}("{100-n}"))),dotk{{}}())),Lbl'-LT-'generatedCounter'-GT-'{{}}(\dv{{SortInt{{}}}}("0")))"""
61+
62+
63+
def bar_output() -> str:
64+
"""
65+
<k> bar() </k>
66+
"""
67+
return r"""Lbl'-LT-'generatedTop'-GT-'{}(Lbl'-LT-'k'-GT-'{}(kseq{}(inj{SortFoo{}, SortKItem{}}(Lblbar'LParRParUnds'STEPS'Unds'Foo{}()),dotk{}())),Lbl'-LT-'generatedCounter'-GT-'{}(\dv{SortInt{}}("0")))"""
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
from unittest import TestCase
2+
3+
from pyk.kllvm.ast import CompositeSort, Symbol, Variable
4+
5+
6+
class SymbolTest(TestCase):
7+
def test_str(self) -> None:
8+
# Given
9+
s1 = Symbol("Lbl'Plus")
10+
s2 = Symbol("Lbl'Plus")
11+
s2.add_formal_argument(CompositeSort('A'))
12+
13+
test_data = (
14+
(s1, "Lbl'Plus{}"),
15+
(s2, "Lbl'Plus{A{}}"),
16+
)
17+
18+
for i, (symbol, expected) in enumerate(test_data):
19+
with self.subTest(i=i):
20+
# When
21+
actual = str(symbol)
22+
23+
# Then
24+
self.assertEqual(actual, expected)
25+
26+
def test_equal(self) -> None:
27+
a1 = Symbol('A')
28+
a2 = Symbol('A')
29+
b1 = Symbol('B')
30+
self.assertIsNot(a1, a2)
31+
self.assertEqual(a1, a2)
32+
self.assertNotEqual(a1, b1)
33+
34+
35+
class VariableTest(TestCase):
36+
def test_variable(self) -> None:
37+
# When
38+
a = Variable('A')
39+
40+
# Then
41+
self.assertEqual(a.name, 'A')
42+
self.assertEqual(str(a), 'A')
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from pyk.kllvm.ast import CompositePattern
2+
from pyk.kllvm.runtime import compile_runtime, import_runtime
3+
4+
from .utils import RuntimeTest
5+
6+
7+
class TermTest(RuntimeTest):
8+
KOMPILE_MAIN_FILE = 'k-files/ctor.k'
9+
KOMPILE_SYNTAX_MODULE = 'CTOR'
10+
11+
def setUp(self) -> None:
12+
super().setUp()
13+
compile_runtime(self.kompiled_dir)
14+
self.runtime = import_runtime(self.kompiled_dir)
15+
16+
def test_construct(self) -> None:
17+
test_data = ('one', 'two', 'three')
18+
for ctor in test_data:
19+
with self.subTest(ctor):
20+
# Given
21+
label = f"Lbl{ctor}'LParRParUnds'CTOR'Unds'Foo"
22+
pattern = CompositePattern(label)
23+
term = self.runtime.Term(pattern)
24+
25+
# Then
26+
self.assertEqual(str(pattern), str(term))

0 commit comments

Comments
 (0)