aboutsummaryrefslogtreecommitdiff
path: root/spec/outputs/test/anonymous_class_spec.lua
blob: 8f6a1226eacbb1d08159def29a11a51802aa2700 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
return describe("anonymous class", function()
	it("should create anonymous class", function()
		local AnonymousClass
		do
			local _class_0
			local _base_0 = {
				value = 100,
				getValue = function(self)
					return self.value
				end
			}
			if _base_0.__index == nil then
				_base_0.__index = _base_0
			end
			_class_0 = setmetatable({
				__init = function() end,
				__base = _base_0,
				__name = "AnonymousClass"
			}, {
				__index = _base_0,
				__call = function(cls, ...)
					local _self_0 = setmetatable({ }, _base_0)
					cls.__init(_self_0, ...)
					return _self_0
				end
			})
			_base_0.__class = _class_0
			AnonymousClass = _class_0
		end
		local instance = AnonymousClass()
		return assert.same(instance:getValue(), 100)
	end)
	it("should use assigned name", function()
		local MyClass
		do
			local _class_0
			local _base_0 = {
				value = 50
			}
			if _base_0.__index == nil then
				_base_0.__index = _base_0
			end
			_class_0 = setmetatable({
				__init = function() end,
				__base = _base_0,
				__name = "MyClass"
			}, {
				__index = _base_0,
				__call = function(cls, ...)
					local _self_0 = setmetatable({ }, _base_0)
					cls.__init(_self_0, ...)
					return _self_0
				end
			})
			_base_0.__class = _class_0
			MyClass = _class_0
		end
		local instance = MyClass()
		assert.is_true(MyClass.__name == "MyClass")
		return assert.same(instance.value, 50)
	end)
	return it("should support anonymous subclass", function()
		local Base
		do
			local _class_0
			local _base_0 = {
				baseMethod = function(self)
					return "base"
				end
			}
			if _base_0.__index == nil then
				_base_0.__index = _base_0
			end
			_class_0 = setmetatable({
				__init = function() end,
				__base = _base_0,
				__name = "Base"
			}, {
				__index = _base_0,
				__call = function(cls, ...)
					local _self_0 = setmetatable({ }, _base_0)
					cls.__init(_self_0, ...)
					return _self_0
				end
			})
			_base_0.__class = _class_0
			Base = _class_0
		end
		local Sub
		do
			local _class_0
			local _parent_0 = Base
			local _base_0 = {
				subMethod = function(self)
					return "sub"
				end
			}
			for _key_0, _val_0 in pairs(_parent_0.__base) do
				if _base_0[_key_0] == nil and _key_0:match("^__") and not (_key_0 == "__index" and _val_0 == _parent_0.__base) then
					_base_0[_key_0] = _val_0
				end
			end
			if _base_0.__index == nil then
				_base_0.__index = _base_0
			end
			setmetatable(_base_0, _parent_0.__base)
			_class_0 = setmetatable({
				__init = function(self, ...)
					return _class_0.__parent.__init(self, ...)
				end,
				__base = _base_0,
				__name = "Sub",
				__parent = _parent_0
			}, {
				__index = function(cls, name)
					local val = rawget(_base_0, name)
					if val == nil then
						local parent = rawget(cls, "__parent")
						if parent then
							return parent[name]
						end
					else
						return val
					end
				end,
				__call = function(cls, ...)
					local _self_0 = setmetatable({ }, _base_0)
					cls.__init(_self_0, ...)
					return _self_0
				end
			})
			_base_0.__class = _class_0
			if _parent_0.__inherited then
				_parent_0.__inherited(_parent_0, _class_0)
			end
			Sub = _class_0
		end
		local instance = Sub()
		assert.same(instance:baseMethod(), "base")
		return assert.same(instance:subMethod(), "sub")
	end)
end)