Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/python-wasm
Path: blob/main/python/pylang/test/baselib.py
1396 views
1
# vim:fileencoding=utf-8
2
# globals: ρσ_iterator_symbol, ρσ_set_polyfill, ρσ_dict_polyfill, assrt
3
nonlocal ρσ_set_implementation, ρσ_dict_implementation
4
5
6
class CustomIterable:
7
def __init__(self, items):
8
self.items = items
9
10
def __iter__(self):
11
return iter(self.items)
12
13
14
t = []
15
q = [1, 2, 3]
16
for x in CustomIterable(q):
17
t.push(x)
18
assrt.deepEqual(q, t)
19
20
assrt.deepEqual(['a', 'b'], list('ab'))
21
assrt.ok(q is not list(q))
22
assrt.deepEqual(q, list(q))
23
assrt.ok(isinstance([], (String, list)))
24
assrt.ok(isinstance(1, int))
25
assrt.ok(not isinstance(r"%js new Number(1)", int))
26
assrt.ok(not isinstance(1.1, int))
27
assrt.ok(isinstance(1.1, float))
28
assrt.ok(not isinstance(r"%js new Number(1.1)", float))
29
m = Map()
30
m.set('a', 1)
31
assrt.equal(len(m), 1)
32
s = set()
33
s.add(1)
34
s.add(2)
35
assrt.equal(len(s), 2)
36
assrt.deepEqual(list(s), [1, 2])
37
assrt.deepEqual(s, {1, 2})
38
39
assrt.equal(chr(ord('a')), 'a')
40
assrt.equal(chr(ord('🐱')), '🐱')
41
assrt.equal(bin(3), '0b11')
42
assrt.equal(bin(-3), '-0b11')
43
assrt.equal(hex(10), '0xa')
44
assrt.equal(hex(-10), '-0xa')
45
t = []
46
for i in s:
47
t.push(i)
48
assrt.deepEqual(t, [1, 2])
49
50
t = []
51
for i in m:
52
t.push(i)
53
assrt.deepEqual(t, ['a'])
54
t = []
55
for c, i in enumerate(m):
56
t.push([c, i])
57
assrt.deepEqual(t, [[0, 'a']])
58
assrt.deepEqual(['y', 'x'], [x for x in reversed('xy')])
59
60
# Test that the iterator created by iter() is itself iterable
61
assrt.deepEqual(s, set(iter(s)))
62
63
assrt.ok('a' in m)
64
assrt.ok(1 in s)
65
assrt.ok('1' not in s)
66
67
# getattr()
68
a = {'x': 2}
69
assrt.equal(getattr(a, 'x'), 2)
70
assrt.equal(getattr(a, 'x', 1), 2)
71
assrt.equal(getattr(a, 'y', 1), 1)
72
73
74
def gety():
75
getattr(a, 'y')
76
77
78
assrt.throws(gety, AttributeError)
79
80
# int()/float()
81
assrt.equal(int('a', 16), 10)
82
83
84
def inta():
85
int('a')
86
87
88
assrt.throws(inta, ValueError)
89
assrt.equal(float('10.3'), 10.3)
90
91
92
def floata():
93
float('a')
94
95
96
assrt.throws(floata, ValueError)
97
assrt.equal(int(2 * 1e-7), 0)
98
assrt.equal(int(10 * 1e-7), 0)
99
assrt.equal(float(3 * 1e-7), 3e-7)
100
101
# sum()
102
assrt.equal(6, sum([1, 2, 3]))
103
assrt.equal(6, sum(iter([1, 2, 3])))
104
assrt.equal(5, sum([1, 2, 3], -1))
105
assrt.equal(5, sum(iter([1, 2, 3]), -1))
106
assrt.equal(sum([BigInt(2), BigInt(3)], BigInt(2)), 7)
107
assrt.equal(sum(['a', 'b'], 'x'), 'xab')
108
assrt.equal(sum([BigInt(2), BigInt(3)], BigInt(0)), 5)
109
assrt.equal(sum(range(1, 101)), 5050)
110
assrt.equal(sum(['x', 'y', 'z'], ''), 'xyz')
111
112
113
# map()/filter()/zip()
114
def double(a):
115
return a * 2
116
117
118
assrt.deepEqual(list(map(double, [1, 2])), [2, 4])
119
assrt.deepEqual(list(map(double, iter([1, 2]))), [2, 4])
120
121
122
def gt1(a):
123
return a > 1
124
125
126
assrt.deepEqual(list(filter(gt1, [1, 2])), [2])
127
assrt.deepEqual(list(filter(gt1, iter([1, 2]))), [2])
128
assrt.deepEqual(list(zip([1, 2], [3, 4])), [[1, 3], [2, 4]])
129
130
# lists
131
a = [1, 2]
132
a.extend([3, 4])
133
assrt.deepEqual(a, [1, 2, 3, 4])
134
assrt.ok(a == [1, 2, 3, 4])
135
s = set([5, 6])
136
a.extend(s)
137
assrt.deepEqual(a, [1, 2, 3, 4, 5, 6])
138
a.extend('12')
139
assrt.deepEqual(a, [1, 2, 3, 4, 5, 6, '1', '2'])
140
a = [1, 2, 3, 4]
141
for index, val in [[0, 1], [1, 2], [3, 4]]:
142
assrt.equal(a.index(val), index)
143
144
145
def a8():
146
return a.index(8)
147
148
149
assrt.throws(a8, ValueError)
150
151
152
def a11():
153
return a.index(1, 1)
154
155
156
assrt.throws(a11, ValueError)
157
158
159
def a412():
160
return a.index(4, 1, 2)
161
162
163
assrt.throws(a412, ValueError)
164
assrt.equal(1, a.index(2, 1, 2))
165
166
167
def apypop():
168
a.pypop(10)
169
170
171
assrt.throws(apypop, IndexError)
172
assrt.equal(a.pypop(-1), 4)
173
assrt.deepEqual(a, [1, 2, 3])
174
assrt.equal(a.remove(2), None)
175
assrt.deepEqual(a, [1, 3])
176
177
178
def aremove():
179
a.remove(2)
180
181
182
assrt.throws(aremove, ValueError)
183
184
a = [1, 2]
185
a.insert(0, 0)
186
assrt.deepEqual(a, [0, 1, 2])
187
a.insert(-1, 3)
188
assrt.deepEqual(a, [0, 1, 3, 2])
189
a.insert(a.length, 6)
190
assrt.deepEqual(a, [0, 1, 3, 2, 6])
191
assrt.deepEqual(a.copy(), a)
192
assrt.ok(a is not a.copy())
193
assrt.ok(a.copy().extend is not undefined)
194
a.clear()
195
assrt.equal(a.length, 0)
196
assrt.deepEqual(a.as_array(), a)
197
assrt.ok(a is not a.as_array())
198
assrt.ok(a.as_array().extend == undefined)
199
a = [1, 2, 1]
200
assrt.equal(a.count(1), 2)
201
a = [3, 2, 4, 1]
202
a.pysort()
203
assrt.deepEqual(a, [1, 2, 3, 4])
204
a.pysort(reverse=True)
205
assrt.deepEqual(a, [4, 3, 2, 1])
206
assrt.deepEqual(a, a.slice())
207
assrt.ok(a is not a.slice())
208
assrt.ok(a.slice().extend is not undefined)
209
assrt.deepEqual(a, a.concat())
210
assrt.ok(a is not a.concat())
211
assrt.ok(a.concat().extend is not undefined)
212
assrt.deepEqual(list(a[ρσ_iterator_symbol]()), a)
213
assrt.equal(a.length, a.__len__())
214
assrt.equal(a.length, len(a))
215
assrt.ok(a.__contains__(a[0]))
216
assrt.ok([x for x in [1]].extend is not undefined)
217
218
219
class C:
220
def __contains__(self, x):
221
return x == 1
222
223
224
assrt.ok(1 in C())
225
assrt.ok(2 not in C())
226
227
228
# sets
229
def test_sets():
230
a = set([1, 2, 3])
231
assrt.ok(isinstance(a, set))
232
assrt.ok(a.has(1))
233
assrt.ok(not a.has(9))
234
assrt.deepEqual(a, {1, 2, 3})
235
assrt.ok(len(a) == 3)
236
assrt.ok(a.length == 3)
237
assrt.ok(a.size == 3)
238
assrt.ok(not a.has('1'))
239
x = a.copy()
240
assrt.deepEqual(a, x)
241
assrt.ok(a is not x)
242
b, c = {}, {}
243
a.add(b)
244
assrt.ok(b in a)
245
assrt.ok(c not in a)
246
assrt.ok(None not in a)
247
a.add(None)
248
assrt.ok(None in a)
249
a.discard(None)
250
assrt.ok(None not in a)
251
a.clear()
252
assrt.ok(a.length == 0)
253
assrt.deepEqual({1, 2, 3}.difference({2}, {3}), {1})
254
a = {1, 2, 3}
255
a.difference_update({2}, {3})
256
assrt.deepEqual(a, {1})
257
assrt.deepEqual({1, 2, 3}.intersection({2, 3}, {3}), {3})
258
a = {1, 2, 3}
259
a.intersection_update({2, 3}, {3})
260
assrt.deepEqual(a, {3})
261
assrt.ok({1}.isdisjoint({2}))
262
assrt.ok(not {1}.isdisjoint({1}))
263
assrt.ok({1}.issubset({1, 2}))
264
assrt.ok({1}.issubset({1}))
265
assrt.ok(not {1}.issubset({2}))
266
assrt.ok({1, 2}.issuperset({1, 2}))
267
assrt.ok({1, 2}.issuperset({1}))
268
assrt.ok(not {1}.issuperset({2}))
269
a = set()
270
271
def apop():
272
a.pop()
273
274
assrt.throws(apop, KeyError)
275
assrt.equal({1}.pop(), 1)
276
277
def aremove():
278
a.remove(1)
279
280
assrt.throws(aremove, KeyError)
281
282
a = {1}
283
a.remove(1)
284
assrt.equal(a.length, 0)
285
assrt.deepEqual({1, 2, 3}.symmetric_difference({2, 3, 4}), {1, 4})
286
a = {1, 2, 3}
287
a.symmetric_difference_update({2, 3, 4})
288
assrt.deepEqual(a, {1, 4})
289
assrt.deepEqual({1, 2}.union({3, 4}, {1, 5}), {1, 2, 3, 4, 5})
290
a = {1}
291
a.update({1, 2})
292
assrt.deepEqual(a, {1, 2})
293
294
295
test_sets()
296
ρσ_set_implementation = ρσ_set_polyfill # noqa:undef
297
test_sets()
298
ρσ_set_implementation = Set
299
300
301
def test_dicts():
302
from __python__ import dict_literals, overload_getitem
303
assrt.deepEqual({1: 1, 2: 2}, {1: 1, 2: 2})
304
a = {1: 1, 2: 2}
305
assrt.ok(isinstance(a, dict))
306
assrt.ok(1 in a), assrt.ok(3 not in a), assrt.ok('1' not in a)
307
assrt.deepEqual(set(a), {1, 2})
308
assrt.ok(set(a) == {1, 2})
309
assrt.equal({1: 2}[1], 2)
310
311
def a1():
312
return a['1']
313
314
assrt.throws(a1, KeyError)
315
316
assrt.equal(a.length, 2), assrt.equal(len(a), 2)
317
assrt.equal(a[1], 1)
318
a[1] = 3
319
assrt.equal(a[1], 3)
320
assrt.ok(a is not a.copy()), assrt.deepEqual(a, a.copy())
321
a.clear()
322
assrt.equal(a.length, 0), assrt.deepEqual(list(a), [])
323
assrt.deepEqual(set({1: 9, 2: 8}.keys()), {1, 2})
324
assrt.deepEqual(set({1: 9, 2: 8}.values()), {8, 9})
325
items = [list_wrap(x) for x in {1: 9, 2: 8}.items()]
326
items.sort()
327
assrt.deepEqual(items, [[1, 9], [2, 8]])
328
a = {1: 1, 2: 2}
329
assrt.equal(a.get(1), 1), assrt.equal(a.get(3), None)
330
assrt.equal(a.set_default(2, 2), 2)
331
assrt.equal(a.set_default(3, 3), 3), assrt.equal(a[3], 3)
332
assrt.deepEqual(dict.fromkeys([1, 2], 3), {1: 3, 2: 3})
333
a = {1: 3, 2: 3}
334
assrt.equal(a.pop(2, 2), 3), assrt.equal(a.pop(2, 2), 2)
335
336
def apop2():
337
a.pop(2)
338
339
assrt.throws(apop2, KeyError)
340
341
assrt.deepEqual(a.popitem(), [1, 3])
342
343
def apopitem():
344
a.popitem()
345
346
assrt.throws(apopitem, KeyError)
347
348
a = {1: 1}
349
a.update({2: 2, 1: 3})
350
assrt.deepEqual(a, {1: 3, 2: 2})
351
352
353
test_dicts()
354
ρσ_dict_implementation = ρσ_dict_polyfill # noqa:undef
355
test_dicts()
356
ρσ_dict_implementation = Map
357
358
a = {1: 1}
359
b = None
360
assrt.equal(a == b, False)
361
assrt.equal(b == a, False)
362
363
a, b = range(1111111111)
364
assrt.equal(a, 0)
365
assrt.equal(b, 1)
366
assrt.equal(len(range(10)), 10)
367
assrt.equal(str(range(10)), 'range(0, 10)')
368
assrt.equal(str(range(1, 10, 2)), 'range(1, 10, 2)')
369
370
assrt.deepEqual(divmod(7, 3), [2, 1])
371
assrt.deepEqual(divmod(-7, 3), [-3, 2])
372
assrt.deepEqual(divmod(-7, -3), [2, -1])
373
assrt.deepEqual(divmod(7, -3), [-3, -2])
374
375
376
def divmodtest():
377
divmod(1, 0)
378
379
380
assrt.throws(divmodtest, ZeroDivisionError)
381
382
assrt.equal(1, min(1, 2))
383
assrt.equal(2, max(1, 2))
384
assrt.equal(2, max(range(3)))
385
assrt.equal(0, min(range(3)))
386
assrt.equal(0, min([0, 1, 2]))
387
assrt.equal(2, max([0, 1, 2]))
388
389
390
def minnone():
391
min()
392
393
394
assrt.throws(minnone, TypeError)
395
396
397
def maxnone():
398
max()
399
400
401
assrt.throws(maxnone, TypeError)
402
assrt.equal(9, max(defval=9))
403
assrt.equal(9, max([], defval=9))
404
405
406
def key(x):
407
return x.k
408
409
410
assrt.equal(1, max([{'k': 0}, {'k': 1}], key=key))
411
412
# Slicing ranges
413
assrt.equal(str(range(10)[:]), 'range(0, 10)')
414
assrt.equal(str(range(10)[-1:]), 'range(9, 10)')
415
assrt.equal(str(range(10)[:-1]), 'range(0, 9)')
416
assrt.equal(str(range(10)[5:]), 'range(5, 10)')
417
assrt.equal(str(range(3, 15, 3)[3:]), 'range(12, 15, 3)')
418
assrt.equal(str(range(3, 15, 3)[-3:]), 'range(6, 15, 3)')
419
assrt.equal(str(range(3, 15, 3)[-3:-1]), 'range(6, 12, 3)')
420
# lazy implementation for negative step
421
assrt.equal(str(range(15, 3, -3)[1:]), '[12, 9, 6]')
422
423
# Adding lists
424
assrt.equal(str([1, 2, 3] + ['a', 'b', 'c']), str([1, 2, 3, 'a', 'b', 'c']))
425
426