blob: 10b3d871ee96d92e25998ba916d7ff92126a16b4 [file] [log] [blame]
trace = stacktrace()
def test_add_node_ok():
g = new_graph()
k = g.key("parent", "par", "kind", "name")
g.add_node(k, props = {"prop": ["v1", "v2"]})
g.finalize()
n = g.node(k)
assert.true(n != None)
assert.true(n)
assert.eq(str(n), 'kind("par/name")')
assert.eq(type(n), "graph.node")
assert.eq(n.key, k)
assert.eq(n.props.prop, ["v1", "v2"])
assert.eq(
str(n.trace),
"Traceback (most recent call last):\n" +
" testdata/node.star:25:17: in <toplevel>\n" +
" testdata/node.star:6:15: in test_add_node_ok\n" +
" <builtin>: in add_node\n",
)
test_add_node_ok()
def test_stringification():
def key_to_node_str(*pairs):
g = new_graph()
k = g.key(*pairs)
g.add_node(k)
g.finalize()
return str(g.node(k))
assert.eq(key_to_node_str("b", "b1", "kind", "name"), 'kind("b1/name")')
assert.eq(key_to_node_str("_skip", "skip", "kind", "name"), 'kind("name")')
assert.eq(key_to_node_str("@n", "ns", "b", "b1", "kind", "name"), 'kind("ns:b1/name")')
assert.eq(key_to_node_str("@n", "ns", "_skip", "skip", "kind", "name"), 'kind("ns:name")')
assert.eq(key_to_node_str("@n", "", "b", "b1", "kind", "name"), 'kind("b1/name")')
assert.eq(key_to_node_str("@n", "", "_skip", "skip", "kind", "name"), 'kind("name")')
test_stringification()
def test_node_can_be_used_in_sets():
g = new_graph()
k1 = g.key("t1", "id1")
k2 = g.key("t1", "id2")
g.add_node(k1)
g.add_node(k2)
g.finalize()
n1 = g.node(k1)
n2 = g.node(k2)
s = set([n1, n2])
assert.true(n1 in s)
test_node_can_be_used_in_sets()
def test_redeclaration():
g = new_graph()
k = g.key("t1", "id1")
g.add_node(k, {}, trace = trace)
assert.fails(
lambda: g.add_node(k, {}),
r't1\("id1"\) is redeclared, previous declaration:\n' +
r"Traceback \(most recent call last\)\:\n" +
r" testdata/node\.star\:.\:..\: in <toplevel>\n",
)
test_redeclaration()
def test_idempotent_nodes():
g = new_graph()
k1 = g.key("t1", "id1")
k2 = g.key("t1", "id2")
k3 = g.key("t1", "id3")
# Declaring idempotent node twice with exact same props is OK.
g.add_node(k1, {"a": [1, 1]}, idempotent = True)
g.add_node(k1, {"a": [1, 1]}, idempotent = True)
# Redeclaring idempotent node as non-idempotent is not OK.
assert.fails(
lambda: g.add_node(k1, {"a": [1, 1]}, idempotent = False),
"redeclared",
)
# Redeclaring idempotent node with different props is not OK.
assert.fails(
lambda: g.add_node(k1, {"a": [1, 2]}, idempotent = True),
"redeclared",
)
# A node declared as non-idempotent cannot be redeclared as idempotent.
g.add_node(k2, idempotent = False)
assert.fails(lambda: g.add_node(k2, idempotent = True), "redeclared")
# A node declared as idempotent cannot be redeclared as non-idempotent.
g.add_node(k3, idempotent = True)
assert.fails(lambda: g.add_node(k3, idempotent = False), "redeclared")
test_idempotent_nodes()
def test_freezes_props():
g = new_graph()
k = g.key("t1", "id1")
vals = ["v1", "v2"]
g.add_node(k, props = {"prop": vals})
g.finalize()
n = g.node(k)
# Note that freezing is NOT copying, original 'vals' is also frozen now.
assert.fails(lambda: n.props.prop.append("z"), "cannot append to frozen list")
assert.fails(lambda: vals.append("z"), "cannot append to frozen list")
test_freezes_props()
def test_non_string_prop():
g = new_graph()
k = g.key("t1", "id1")
assert.fails(lambda: g.add_node(k, props = {1: "2"}), "non-string key 1 in 'props'")
test_non_string_prop()