go.chromium.org/luci@v0.0.0-20240309015107-7cdc2e660f33/lucicfg/graph/testdata/node.star (about) 1 trace = stacktrace() 2 3 def test_add_node_ok(): 4 g = new_graph() 5 k = g.key("parent", "par", "kind", "name") 6 g.add_node(k, props = {"prop": ["v1", "v2"]}) 7 8 g.finalize() 9 n = g.node(k) 10 11 assert.true(n != None) 12 assert.true(n) 13 assert.eq(str(n), 'kind("par/name")') 14 assert.eq(type(n), "graph.node") 15 assert.eq(n.key, k) 16 assert.eq(n.props.prop, ["v1", "v2"]) 17 assert.eq( 18 str(n.trace), 19 "Traceback (most recent call last):\n" + 20 " testdata/node.star:25:17: in <toplevel>\n" + 21 " testdata/node.star:6:15: in test_add_node_ok\n" + 22 " <builtin>: in add_node\n", 23 ) 24 25 test_add_node_ok() 26 27 def test_stringification(): 28 def key_to_node_str(*pairs): 29 g = new_graph() 30 k = g.key(*pairs) 31 g.add_node(k) 32 g.finalize() 33 return str(g.node(k)) 34 35 assert.eq(key_to_node_str("b", "b1", "kind", "name"), 'kind("b1/name")') 36 assert.eq(key_to_node_str("_skip", "skip", "kind", "name"), 'kind("name")') 37 assert.eq(key_to_node_str("@n", "ns", "b", "b1", "kind", "name"), 'kind("ns:b1/name")') 38 assert.eq(key_to_node_str("@n", "ns", "_skip", "skip", "kind", "name"), 'kind("ns:name")') 39 assert.eq(key_to_node_str("@n", "", "b", "b1", "kind", "name"), 'kind("b1/name")') 40 assert.eq(key_to_node_str("@n", "", "_skip", "skip", "kind", "name"), 'kind("name")') 41 42 test_stringification() 43 44 def test_node_can_be_used_in_sets(): 45 g = new_graph() 46 47 k1 = g.key("t1", "id1") 48 k2 = g.key("t1", "id2") 49 50 g.add_node(k1) 51 g.add_node(k2) 52 53 g.finalize() 54 55 n1 = g.node(k1) 56 n2 = g.node(k2) 57 58 s = set([n1, n2]) 59 assert.true(n1 in s) 60 61 test_node_can_be_used_in_sets() 62 63 def test_redeclaration(): 64 g = new_graph() 65 k = g.key("t1", "id1") 66 67 g.add_node(k, {}, trace = trace) 68 assert.fails( 69 lambda: g.add_node(k, {}), 70 r't1\("id1"\) is redeclared, previous declaration:\n' + 71 r"Traceback \(most recent call last\)\:\n" + 72 r" testdata/node\.star\:.\:..\: in <toplevel>\n", 73 ) 74 75 test_redeclaration() 76 77 def test_idempotent_nodes(): 78 g = new_graph() 79 k1 = g.key("t1", "id1") 80 k2 = g.key("t1", "id2") 81 k3 = g.key("t1", "id3") 82 83 # Declaring idempotent node twice with exact same props is OK. 84 g.add_node(k1, {"a": [1, 1]}, idempotent = True) 85 g.add_node(k1, {"a": [1, 1]}, idempotent = True) 86 87 # Redeclaring idempotent node as non-idempotent is not OK. 88 assert.fails( 89 lambda: g.add_node(k1, {"a": [1, 1]}, idempotent = False), 90 "redeclared", 91 ) 92 93 # Redeclaring idempotent node with different props is not OK. 94 assert.fails( 95 lambda: g.add_node(k1, {"a": [1, 2]}, idempotent = True), 96 "redeclared", 97 ) 98 99 # A node declared as non-idempotent cannot be redeclared as idempotent. 100 g.add_node(k2, idempotent = False) 101 assert.fails(lambda: g.add_node(k2, idempotent = True), "redeclared") 102 103 # A node declared as idempotent cannot be redeclared as non-idempotent. 104 g.add_node(k3, idempotent = True) 105 assert.fails(lambda: g.add_node(k3, idempotent = False), "redeclared") 106 107 test_idempotent_nodes() 108 109 def test_freezes_props(): 110 g = new_graph() 111 k = g.key("t1", "id1") 112 113 vals = ["v1", "v2"] 114 g.add_node(k, props = {"prop": vals}) 115 116 g.finalize() 117 n = g.node(k) 118 119 # Note that freezing is NOT copying, original 'vals' is also frozen now. 120 assert.fails(lambda: n.props.prop.append("z"), "cannot append to frozen list") 121 assert.fails(lambda: vals.append("z"), "cannot append to frozen list") 122 123 test_freezes_props() 124 125 def test_non_string_prop(): 126 g = new_graph() 127 k = g.key("t1", "id1") 128 assert.fails(lambda: g.add_node(k, props = {1: "2"}), "non-string key 1 in 'props'") 129 130 test_non_string_prop()