1 ## our_shell: ysh
2 ## oils_failures_allowed: 2
3
4 #### Object() creates prototype chain
5
6 func Rect_area(this) {
7 return (this.x * this.y)
8 }
9
10 var Rect = Object(null, {area: Rect_area})
11
12 var rect1 = Object(Rect, {x: 3, y: 4})
13 var rect2 = Object(Rect, {x: 10, y: 20})
14
15 # This could change to show the object?
16 # pp test_ (rect)
17
18 # TODO: This should be a bound function
19 #pp asdl_ (rect)
20 #pp (rect.area)
21 #pp (rect->area)
22
23 var area1 = rect1.area()
24 var area2 = rect2.area()
25
26 pp test_ ([rect1.x, rect1.y])
27 echo "area1 = $area1"
28
29 pp test_ ([rect2.x, rect2.y])
30 echo "area2 = $area2"
31
32 #pp test_ (rect1.nonexistent)
33
34 ## STDOUT:
35 (List) [3,4]
36 area1 = 12
37 (List) [10,20]
38 area2 = 200
39 ## END
40
41 #### prototype()
42
43 func Rect_area(this) {
44 return (this.x * this.y)
45 }
46
47 var Rect = Object(null, {area: Rect_area})
48
49 var obj = Object(Rect, {x: 3, y: 4})
50
51 pp test_ (prototype(Rect))
52 pp test_ (prototype(obj))
53
54 ## STDOUT:
55 (Null) null
56 (Obj) {"area":<Func>}
57 ## END
58
59 #### propView()
60
61 var obj = Object(null, {x: 3, y: 4})
62 var props = propView(obj)
63
64 pp test_ (props)
65
66 # object can be mutated
67 setvar props.x = 99
68
69 pp test_ (props)
70
71 var e = propView(null) # error
72
73 ## status: 3
74 ## STDOUT:
75 (Dict) {"x":3,"y":4}
76 (Dict) {"x":99,"y":4}
77 ## END
78
79 #### Mutating method lookup with ->
80
81 func inc(self, n) {
82 setvar self.i += n
83 }
84 var Counter_methods = Object(null, {'M/inc': inc})
85
86 var c = Object(Counter_methods, {i: 5})
87
88 echo $[c.i]
89 call c->inc(3)
90 echo $[c.i]
91
92 ## STDOUT:
93 5
94 8
95 ## END
96
97 #### Copy to Dict with dict(), and mutate
98
99 var rect = Object(null, {x: 3, y: 4})
100 var d = dict(rect)
101
102 pp test_ (rect)
103 pp test_ (d)
104
105 # Right now, object attributes aren't mutable! Could change this.
106 #
107 setvar rect.x = 99
108 setvar d.x = 100
109
110 pp test_ (rect)
111 pp test_ (d)
112 ## STDOUT:
113 (Obj) {"x":3,"y":4}
114 (Dict) {"x":3,"y":4}
115 (Obj) {"x":99,"y":4}
116 (Dict) {"x":100,"y":4}
117 ## END
118
119 #### setvar obj.attr = and += and ...
120
121 var rect = Object(null, {x: 3, y: 4})
122 pp test_ (rect)
123
124 setvar rect.y = 99
125 pp test_ (rect)
126
127 setvar rect.y += 3
128 pp test_ (rect)
129
130 setvar rect.x *= 5
131 pp test_ (rect)
132
133 ## STDOUT:
134 (Obj) {"x":3,"y":4}
135 (Obj) {"x":3,"y":99}
136 (Obj) {"x":3,"y":102}
137 (Obj) {"x":15,"y":102}
138 ## END
139
140 #### can't encode objects as JSON
141
142 var Rect = Object(null, {})
143
144 json write (Rect)
145 echo 'nope'
146
147 ## status: 1
148 ## STDOUT:
149 ## END
150
151 #### pretty printing of cycles
152
153 var d = {k: 42}
154 setvar d.cycle = d
155
156 pp test_ (d)
157
158 var o = Object(null, d)
159
160 pp test_ (o)
161
162 var o2 = Object(o, {z: 99})
163
164 pp test_ (o2)
165
166 ## STDOUT:
167 ## END
168
169 #### Can all builtin methods with s.upper()
170
171 var s = 'foo'
172 var x = s.upper()
173 var y = "--$[x.lower()]"
174
175 pp test_ (x)
176 pp test_ (y)
177
178 ## STDOUT:
179 (Str) "FOO"
180 (Str) "--foo"
181 ## END
182
183
184 #### Dict.keys(d), Dict.values(d), Dict.get(d, key)
185
186 var d = {a: 42, b: 99}
187
188 pp test_ (Dict.keys(d))
189 pp test_ (Dict.values(d))
190
191 pp test_ (Dict.get(d, 'key', 'default'))
192
193 # mutating methods are OK?
194 # call d->inc(x)
195
196 ## STDOUT:
197 ## END
198