go.starlark.net@v0.0.0-20231101134539-556fd59b42f6/starlarkstruct/testdata/struct.star (about)

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