blob: 12e5c1816e0aa4059980c6586270859943560438 [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:23: in <toplevel>\n'
+ ' testdata/node.star:7: in test_add_node_ok\n')
test_add_node_ok()
def test_private_kind():
g = new_graph()
k = g.key('_skipped', 'skipped', 'kind', 'name')
g.add_node(k)
g.finalize()
assert.eq(str(g.node(k)), 'kind("name")')
test_private_kind()
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\:1\: 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()