Skip to content

Commit 9698ee1

Browse files
chore: Tests
1 parent 8cc8d13 commit 9698ee1

File tree

2 files changed

+174
-11
lines changed

2 files changed

+174
-11
lines changed

src/util/schedule.star

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ def launch(plan, schedule):
111111
)
112112
)
113113

114-
launched[item.id] = item.launch(plan, launched)
114+
launched[item.id] = item.launch(plan=plan, dependencies=launched)
115115

116116
return launched
117117

@@ -151,6 +151,21 @@ def _assert_item(item):
151151
)
152152
)
153153

154+
if not hasattr(item, "id"):
155+
fail(
156+
"schedule: Expected an item to have a property 'id', got {}".format(
157+
item, type_of_item
158+
)
159+
)
160+
161+
type_of_id = type(item.id)
162+
if type_of_id != "string":
163+
fail(
164+
"schedule: Expected an item to have an 'id' of type string but 'id' is of type {}".format(
165+
type_of_id
166+
)
167+
)
168+
154169
if not hasattr(item, "dependencies"):
155170
fail(
156171
"schedule: Expected an item to have a property 'dependencies', got {}".format(
@@ -161,22 +176,25 @@ def _assert_item(item):
161176
type_of_dependencies = type(item.dependencies)
162177
if type_of_dependencies != "list":
163178
fail(
164-
"schedule: Expected an item to have a 'dependencies' property of type list but 'dependencies' is of type".format(
179+
"schedule: Expected an item to have a 'dependencies' property of type list but 'dependencies' is of type {}".format(
165180
type_of_dependencies
166181
)
167182
)
168183

169-
has_self_as_dependency = item.id in item.dependencies
170-
if has_self_as_dependency:
171-
fail("schedule: Item {} specifies itself as its dependency".format(item.id))
172-
173-
if not hasattr(item, "id"):
184+
mistyped_dependencies = [d for d in item.dependencies if type(d) != "string"]
185+
if mistyped_dependencies:
174186
fail(
175-
"schedule: Expected an item to have a property 'id', got {}".format(
176-
item, type_of_item
187+
"schedule: Expected an item to have a 'dependencies' property of type list of strings but 'dependencies' contains {}".format(
188+
", ".join(
189+
["{} of type {}".format(d, type(d)) for d in mistyped_dependencies]
190+
)
177191
)
178192
)
179193

194+
has_self_as_dependency = item.id in item.dependencies
195+
if has_self_as_dependency:
196+
fail("schedule: Item {} specifies itself as its dependency".format(item.id))
197+
180198
if not hasattr(item, "launch"):
181199
fail(
182200
"schedule: Expected an item to have a property 'launch', got {}".format(
@@ -187,7 +205,7 @@ def _assert_item(item):
187205
type_of_launch = type(item.launch)
188206
if type_of_launch != "function":
189207
fail(
190-
"schedule: Expected an item to have a 'launch' function but 'launch' is of type".format(
208+
"schedule: Expected an item to have a 'launch' property of type function but 'launch' is of type {}".format(
191209
type_of_launch
192210
)
193211
)

test/util/schedule_test.star

Lines changed: 146 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,58 @@
11
_schedule = import_module("/src/util/schedule.star")
22

33

4-
def _default_launch():
4+
def _default_launch(plan, dependencies):
55
return None
66

77

8+
def test_util_schedule_dependency_invalid_item(plan):
9+
schedule = _schedule.create()
10+
11+
# We check for a missing id
12+
expect.fails(
13+
lambda: schedule.add(struct()),
14+
"schedule: Expected an item to have a property 'id'",
15+
)
16+
17+
# We check for a mistyped id
18+
expect.fails(
19+
lambda: schedule.add(struct(id=123)),
20+
"schedule: Expected an item to have an 'id' of type string but 'id' is of type int",
21+
)
22+
23+
# We check for missing dependencies
24+
expect.fails(
25+
lambda: schedule.add(struct(id="a", launch=_default_launch)),
26+
"schedule: Expected an item to have a property 'dependencies'",
27+
)
28+
29+
# We check for mistyped dependencies
30+
expect.fails(
31+
lambda: schedule.add(struct(id="a", launch=_default_launch, dependencies="b")),
32+
"schedule: Expected an item to have a 'dependencies' property of type list but 'dependencies' is of type string",
33+
)
34+
35+
# We check for mistyped dependencies
36+
expect.fails(
37+
lambda: schedule.add(
38+
struct(id="a", launch=_default_launch, dependencies=[123, [], {}, False])
39+
),
40+
"schedule: Expected an item to have a 'dependencies' property of type list of strings but 'dependencies' contains 123 of type int, \\[\\] of type list, \\{\\} of type dict, False of type bool",
41+
)
42+
43+
# We check for missing launch
44+
expect.fails(
45+
lambda: schedule.add(struct(id="a", dependencies=["b"])),
46+
"schedule: Expected an item to have a property 'launch'",
47+
)
48+
49+
# We check for mistyped launch
50+
expect.fails(
51+
lambda: schedule.add(struct(id="a", launch=123, dependencies=["b"])),
52+
"schedule: Expected an item to have a 'launch' property of type function but 'launch' is of type int",
53+
)
54+
55+
856
def test_util_schedule_dependency_on_self(plan):
957
schedule = _schedule.create()
1058

@@ -106,3 +154,100 @@ def test_util_schedule_simple_branching_dependencies(plan):
106154
schedule.sequence(),
107155
[item_b, item_c1, item_c3, item_c2, item_c21, item_a, item_c22, item_d],
108156
)
157+
158+
159+
def test_util_schedule_launch_empty(plan):
160+
schedule = _schedule.create()
161+
162+
# Launching an empty schedule should return an empty dict
163+
expect.eq(_schedule.launch(plan, schedule), {})
164+
165+
166+
def test_util_schedule_launch_simple(plan):
167+
schedule = _schedule.create()
168+
169+
schedule.add(
170+
_schedule.item(
171+
id="a",
172+
launch=lambda plan, dependencies: "a launched with dependencies {}".format(
173+
dependencies
174+
),
175+
)
176+
)
177+
schedule.add(
178+
_schedule.item(
179+
id="b",
180+
launch=lambda plan, dependencies: "b launched with dependencies {}".format(
181+
dependencies
182+
),
183+
dependencies=["a"],
184+
)
185+
)
186+
187+
expect.eq(
188+
_schedule.launch(plan, schedule),
189+
{
190+
"a": "a launched with dependencies {}",
191+
"b": 'b launched with dependencies {"a": "a launched with dependencies {}"}',
192+
},
193+
)
194+
195+
196+
def test_util_schedule_launch_branching(plan):
197+
schedule = _schedule.create()
198+
199+
schedule.add(
200+
_schedule.item(
201+
id="a",
202+
launch=lambda plan, dependencies: "a launched with dependencies {}".format(
203+
dependencies
204+
),
205+
)
206+
)
207+
schedule.add(
208+
_schedule.item(
209+
id="b",
210+
launch=lambda plan, dependencies: "b launched with dependencies {}".format(
211+
dependencies
212+
),
213+
dependencies=["a"],
214+
)
215+
)
216+
schedule.add(
217+
_schedule.item(
218+
id="c1",
219+
launch=lambda plan, dependencies: "c1 launched with dependencies {}".format(
220+
dependencies
221+
),
222+
dependencies=["b"],
223+
)
224+
)
225+
schedule.add(
226+
_schedule.item(
227+
id="c2",
228+
launch=lambda plan, dependencies: "c2 launched with dependencies {}".format(
229+
dependencies
230+
),
231+
dependencies=["b"],
232+
)
233+
)
234+
schedule.add(
235+
_schedule.item(
236+
id="d",
237+
launch=lambda plan, dependencies: "d launched with dependencies {}".format(
238+
dependencies
239+
),
240+
dependencies=["c1", "c2"],
241+
)
242+
)
243+
244+
expect.eq(
245+
_schedule.launch(plan, schedule),
246+
{
247+
"a": "a launched with dependencies {}",
248+
"b": 'b launched with dependencies {"a": "a launched with dependencies {}"}',
249+
"c1": 'c1 launched with dependencies {"a": "a launched with dependencies {}", "b": "b launched with dependencies {\\"a\\": \\"a launched with dependencies {}\\"}"}',
250+
"c2": 'c2 launched with dependencies {"a": "a launched with dependencies {}", "b": "b launched with dependencies {\\"a\\": \\"a launched with dependencies {}\\"}", "c1": "c1 launched with dependencies {\\"a\\": \\"a launched with dependencies {}\\", \\"b\\": \\"b launched with dependencies {\\\\\\"a\\\\\\": \\\\\\"a launched with dependencies {}\\\\\\"}\\"}"}',
251+
"d": 'd launched with dependencies {"a": "a launched with dependencies {}", "b": "b launched with dependencies {\\"a\\": \\"a launched with dependencies {}\\"}", "c1": "c1 launched with dependencies {\\"a\\": \\"a launched with dependencies {}\\", \\"b\\": \\"b launched with dependencies {\\\\\\"a\\\\\\": \\\\\\"a launched with dependencies {}\\\\\\"}\\"}", "c2": "c2 launched with dependencies {\\"a\\": \\"a launched with dependencies {}\\", \\"b\\": \\"b launched with dependencies {\\\\\\"a\\\\\\": \\\\\\"a launched with dependencies {}\\\\\\"}\\", \\"c1\\": \\"c1 launched with dependencies {\\\\\\"a\\\\\\": \\\\\\"a launched with dependencies {}\\\\\\", \\\\\\"b\\\\\\": \\\\\\"b launched with dependencies {\\\\\\\\\\\\\\"a\\\\\\\\\\\\\\": \\\\\\\\\\\\\\"a launched with dependencies {}\\\\\\\\\\\\\\"}\\\\\\"}\\"}"}',
252+
},
253+
)

0 commit comments

Comments
 (0)