| # Tests of Starlark 'struct' extension. |
| # This is not a standard feature and the Go and Starlark APIs may yet change. |
| |
| load("assert.star", "assert") |
| |
| assert.eq(str(struct), "<built-in function struct>") |
| |
| # struct is a constructor for "unbranded" structs. |
| s = struct(host = "localhost", port = 80) |
| assert.eq(s, s) |
| assert.eq(s, struct(host = "localhost", port = 80)) |
| assert.ne(s, struct(host = "localhost", port = 81)) |
| assert.eq(type(s), "struct") |
| assert.eq(str(s), 'struct(host = "localhost", port = 80)') |
| assert.eq(s.host, "localhost") |
| assert.eq(s.port, 80) |
| assert.fails(lambda : s.protocol, "struct has no .protocol attribute") |
| assert.eq(dir(s), ["host", "port"]) |
| |
| # Use gensym to create "branded" struct types. |
| hostport = gensym(name = "hostport") |
| assert.eq(type(hostport), "symbol") |
| assert.eq(str(hostport), "hostport") |
| |
| # Call the symbol to instantiate a new type. |
| http = hostport(host = "localhost", port = 80) |
| assert.eq(type(http), "struct") |
| assert.eq(str(http), 'hostport(host = "localhost", port = 80)') # includes name of constructor |
| assert.eq(http, http) |
| assert.eq(http, hostport(host = "localhost", port = 80)) |
| assert.ne(http, hostport(host = "localhost", port = 443)) |
| assert.eq(http.host, "localhost") |
| assert.eq(http.port, 80) |
| assert.fails(lambda : http.protocol, "hostport struct has no .protocol attribute") |
| |
| person = gensym(name = "person") |
| bob = person(name = "bob", age = 50) |
| alice = person(name = "alice", city = "NYC") |
| assert.ne(http, bob) # different constructor symbols |
| assert.ne(bob, alice) # different fields |
| |
| hostport2 = gensym(name = "hostport") |
| assert.eq(hostport, hostport) |
| assert.ne(hostport, hostport2) # same name, different symbol |
| assert.ne(http, hostport2(host = "localhost", port = 80)) # equal fields but different ctor symbols |
| |
| # dir |
| assert.eq(dir(alice), ["city", "name"]) |
| assert.eq(dir(bob), ["age", "name"]) |
| assert.eq(dir(http), ["host", "port"]) |
| |
| # hasattr, getattr |
| assert.true(hasattr(alice, "city")) |
| assert.eq(hasattr(alice, "ageaa"), False) |
| assert.eq(getattr(alice, "city"), "NYC") |
| |
| # + |
| assert.eq(bob + bob, bob) |
| assert.eq(bob + alice, person(age = 50, city = "NYC", name = "alice")) |
| assert.eq(alice + bob, person(age = 50, city = "NYC", name = "bob")) # not commutative! a misfeature |
| assert.fails(lambda : alice + 1, "struct \\+ int") |
| assert.eq(http + http, http) |
| assert.fails(lambda : http + bob, "different constructors: hostport \\+ person") |