1# Tests of Starlark 'struct' extension. 2# This is not a standard feature and the Go and Starlark APIs may yet change. 3 4load("assert.star", "assert") 5 6assert.eq(str(struct), "<built-in function struct>") 7 8# struct is a constructor for "unbranded" structs. 9s = struct(host = "localhost", port = 80) 10assert.eq(s, s) 11assert.eq(s, struct(host = "localhost", port = 80)) 12assert.ne(s, struct(host = "localhost", port = 81)) 13assert.eq(type(s), "struct") 14assert.eq(str(s), 'struct(host = "localhost", port = 80)') 15assert.eq(s.host, "localhost") 16assert.eq(s.port, 80) 17assert.fails(lambda : s.protocol, "struct has no .protocol attribute") 18assert.eq(dir(s), ["host", "port"]) 19 20# Use gensym to create "branded" struct types. 21hostport = gensym(name = "hostport") 22assert.eq(type(hostport), "symbol") 23assert.eq(str(hostport), "hostport") 24 25# Call the symbol to instantiate a new type. 26http = hostport(host = "localhost", port = 80) 27assert.eq(type(http), "struct") 28assert.eq(str(http), 'hostport(host = "localhost", port = 80)') # includes name of constructor 29assert.eq(http, http) 30assert.eq(http, hostport(host = "localhost", port = 80)) 31assert.ne(http, hostport(host = "localhost", port = 443)) 32assert.eq(http.host, "localhost") 33assert.eq(http.port, 80) 34assert.fails(lambda : http.protocol, "hostport struct has no .protocol attribute") 35 36person = gensym(name = "person") 37bob = person(name = "bob", age = 50) 38alice = person(name = "alice", city = "NYC") 39assert.ne(http, bob) # different constructor symbols 40assert.ne(bob, alice) # different fields 41 42hostport2 = gensym(name = "hostport") 43assert.eq(hostport, hostport) 44assert.ne(hostport, hostport2) # same name, different symbol 45assert.ne(http, hostport2(host = "localhost", port = 80)) # equal fields but different ctor symbols 46 47# dir 48assert.eq(dir(alice), ["city", "name"]) 49assert.eq(dir(bob), ["age", "name"]) 50assert.eq(dir(http), ["host", "port"]) 51 52# hasattr, getattr 53assert.true(hasattr(alice, "city")) 54assert.eq(hasattr(alice, "ageaa"), False) 55assert.eq(getattr(alice, "city"), "NYC") 56 57# + 58assert.eq(bob + bob, bob) 59assert.eq(bob + alice, person(age = 50, city = "NYC", name = "alice")) 60assert.eq(alice + bob, person(age = 50, city = "NYC", name = "bob")) # not commutative! a misfeature 61assert.fails(lambda : alice + 1, "struct \\+ int") 62assert.eq(http + http, http) 63assert.fails(lambda : http + bob, "different constructors: hostport \\+ person") 64