v2 / vlib / v / tests / comptime / comptime_attribute_selector_test.v
45 lines · 42 sloc · 955 bytes · b39cad2f24569a6f5a9aded4a62051ecfed38fea
Raw
1@[foo: true]
2@[name: 'abc']
3@[amount: 2]
4@[abc]
5struct Abc {}
6
7fn test_comptime_for_attributes() {
8 mut res := ''
9 mut amount := 0
10 $for attr in Abc.attributes {
11 if attr.name == 'amount' && attr.has_arg && attr.kind == .number {
12 amount = attr.arg.int()
13 }
14 if attr.name == 'name' && attr.has_arg && attr.kind == .string {
15 res = attr.arg
16 }
17 }
18 res = res.repeat(amount)
19 assert res == 'abcabc'
20}
21
22fn test_attributes() {
23 $for attr in Abc.attributes {
24 if attr.has_arg && attr.kind == .string {
25 assert attr.name == 'name'
26 assert attr.arg == 'abc'
27 } else if attr.has_arg && attr.kind == .number {
28 assert attr.name == 'amount'
29 assert attr.arg == '2'
30 } else if attr.kind != .bool {
31 assert attr.name == 'abc'
32 }
33 }
34}
35
36fn test_attr_boolean() {
37 mut bool_fields := []string{}
38 $for attr in Abc.attributes {
39 if attr.kind == .bool {
40 bool_fields << attr.name
41 }
42 }
43 assert bool_fields.len == 1
44 assert bool_fields[0] == 'foo'
45}
46