PageRenderTime 57ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/Languages/IronPython/Tests/test_index.py

http://github.com/IronLanguages/main
Python | 442 lines | 405 code | 22 blank | 15 comment | 18 complexity | 7c81c543c68d5124aca4e810ad0e88a5 MD5 | raw file
Possible License(s): CPL-1.0, BSD-3-Clause, ISC, GPL-2.0, MPL-2.0-no-copyleft-exception
  1. #####################################################################################
  2. #
  3. # Copyright (c) Microsoft Corporation. All rights reserved.
  4. #
  5. # This source code is subject to terms and conditions of the Apache License, Version 2.0. A
  6. # copy of the license can be found in the License.html file at the root of this distribution. If
  7. # you cannot locate the Apache License, Version 2.0, please send an email to
  8. # ironpy@microsoft.com. By using this source code in any fashion, you are agreeing to be bound
  9. # by the terms of the Apache License, Version 2.0.
  10. #
  11. # You must not remove this notice, or any other, from this software.
  12. #
  13. #
  14. #####################################################################################
  15. import sys
  16. from iptest.assert_util import *
  17. if is_cli or is_silverlight:
  18. import System
  19. import System.Collections
  20. load_iron_python_test()
  21. from IronPythonTest import *
  22. @skip('win32')
  23. def test_string():
  24. x = System.Array.CreateInstance(System.String, 2)
  25. x[0]="Hello"
  26. x[1]="Python"
  27. Assert(x[0] == "Hello")
  28. Assert(x[1] == "Python")
  29. @skip('win32')
  30. def test_hashtable():
  31. hashtables = [System.Collections.Generic.Dictionary[object, object]()]
  32. if not is_silverlight: # Hashtable isn't available in Silverlight
  33. if is_netstandard:
  34. import clr
  35. clr.AddReference("System.Collections.NonGeneric")
  36. hashtables.append(System.Collections.Hashtable())
  37. for x in hashtables:
  38. x["Hi"] = "Hello"
  39. x[1] = "Python"
  40. x[10,] = "Tuple Int"
  41. x["String",] = "Tuple String"
  42. x[2.4,] = "Tuple Double"
  43. Assert(x["Hi"] == "Hello")
  44. Assert(x[1] == "Python")
  45. Assert(x[(10,)] == "Tuple Int")
  46. Assert(x[("String",)] == "Tuple String")
  47. Assert(x[(2.4,)] == "Tuple Double")
  48. success=False
  49. try:
  50. x[1,2] = 10
  51. except TypeError, e:
  52. success=True
  53. Assert(success)
  54. x[(1,2)] = "Tuple key in hashtable"
  55. Assert(x[1,2,] == "Tuple key in hashtable")
  56. @skip('win32')
  57. def test_multidim_array():
  58. md = System.Array.CreateInstance(System.Int32, 2, 2, 2)
  59. for i in range(2):
  60. for j in range(2):
  61. for k in range(2):
  62. md[i,j,k] = i+j+k
  63. for i in range(2):
  64. for j in range(2):
  65. for k in range(2):
  66. Assert(md[i,j,k] == i+j+k)
  67. @skip('win32')
  68. def test_array():
  69. # verify that slicing an array returns an array of the proper type
  70. from System import Array
  71. data = Array[int]( (2,3,4,5,6) )
  72. AreEqual(type(data[:0]), Array[int])
  73. AreEqual(type(data[0:3:2]), Array[int])
  74. def test_dict():
  75. d = dict()
  76. d[1,2,3,4,5] = 12345
  77. Assert(d[1,2,3,4,5] == d[(1,2,3,4,5)])
  78. Assert(d[1,2,3,4,5] == 12345)
  79. Assert(d[(1,2,3,4,5)] == 12345)
  80. d = {None:23}
  81. del d[None]
  82. AreEqual(d, {})
  83. @skip('win32')
  84. def test_custom_indexable():
  85. i = Indexable()
  86. i[10] = "Hello Integer"
  87. i["String"] = "Hello String"
  88. i[2.4] = "Hello Double"
  89. Assert(i[10] == "Hello Integer")
  90. Assert(i["String"] == "Hello String")
  91. Assert(i[2.4] == "Hello Double")
  92. indexes = (10, "String", 2.4)
  93. for a in indexes:
  94. for b in indexes:
  95. complicated = "Complicated " + str(a) + " " + str(b)
  96. i[a,b] = complicated
  97. Assert(i[a,b] == complicated)
  98. @skip('win32')
  99. def test_property_access():
  100. x = PropertyAccessClass()
  101. for i in range(3):
  102. Assert(x[i] == i)
  103. for j in range(3):
  104. x[i, j] = i + j
  105. Assert(x[i, j] == i + j)
  106. for k in range(3):
  107. x[i, j, k] = i + j + k
  108. Assert(x[i, j, k] == i + j + k)
  109. @skip('win32')
  110. def test_multiple_indexes():
  111. x = MultipleIndexes()
  112. def get_value(*i):
  113. value = ""
  114. append = False
  115. for v in i:
  116. if append:
  117. value = value + " : "
  118. value = value + str(v)
  119. append = True
  120. return value
  121. def get_tuple_value(*i):
  122. return get_value("Indexing as tuple", *i)
  123. def get_none(*i):
  124. return None
  125. def verify_values(mi, gv, gtv):
  126. for i in i_idx:
  127. Assert(x[i] == gv(i))
  128. Assert(x[i,] == gtv(i))
  129. for j in j_idx:
  130. Assert(x[i,j] == gv(i,j))
  131. Assert(x[i,j,] == gtv(i,j))
  132. for k in k_idx:
  133. Assert(x[i,j,k] == gv(i,j,k))
  134. Assert(x[i,j,k,] == gtv(i,j,k))
  135. for l in l_idx:
  136. Assert(x[i,j,k,l] == gv(i,j,k,l))
  137. Assert(x[i,j,k,l,] == gtv(i,j,k,l))
  138. for m in m_idx:
  139. Assert(x[i,j,k,l,m] == gv(i,j,k,l,m))
  140. Assert(x[i,j,k,l,m,] == gtv(i,j,k,l,m))
  141. i_idx = ("Hi", 2.5, 34)
  142. j_idx = (0, "*", "@")
  143. k_idx = range(3)
  144. l_idx = ("Sun", "Moon", "Star")
  145. m_idx = ((9,8,7), (6,5,4,3,2), (4,))
  146. for i in i_idx:
  147. x[i] = get_value(i)
  148. for j in j_idx:
  149. x[i,j] = get_value(i,j)
  150. for k in k_idx:
  151. x[i,j,k] = get_value(i,j,k)
  152. for l in l_idx:
  153. x[i,j,k,l] = get_value(i,j,k,l)
  154. for m in m_idx:
  155. x[i,j,k,l,m] = get_value(i,j,k,l,m)
  156. verify_values(x, get_value, get_none)
  157. for i in i_idx:
  158. x[i,] = get_tuple_value(i)
  159. for j in j_idx:
  160. x[i,j,] = get_tuple_value(i,j)
  161. for k in k_idx:
  162. x[i,j,k,] = get_tuple_value(i,j,k)
  163. for l in l_idx:
  164. x[i,j,k,l,] = get_tuple_value(i,j,k,l)
  165. for m in m_idx:
  166. x[i,j,k,l,m,] = get_tuple_value(i,j,k,l,m)
  167. verify_values(x, get_value, get_tuple_value)
  168. @skip('win32')
  169. def test_indexable_list():
  170. a = IndexableList()
  171. for i in range(5):
  172. result = a.Add(i)
  173. for i in range(5):
  174. AreEqual(a[str(i)], i)
  175. @skip('win32')
  176. def test_generic_function():
  177. # all should succeed at indexing
  178. x = GenMeth.StaticMeth[int, int]
  179. x = GenMeth.StaticMeth[int]
  180. x = GenMeth.StaticMeth[(int, int)]
  181. x = GenMeth.StaticMeth[(int,)]
  182. def test_getorsetitem_override():
  183. class old_base: pass
  184. for base in [object, list, dict, int, str, tuple, float, long, complex, old_base]:
  185. class foo(base):
  186. def __getitem__(self, index):
  187. return index
  188. def __setitem__(self, index, value):
  189. self.res = (index, value)
  190. a = foo()
  191. AreEqual(a[1], 1)
  192. AreEqual(a[1,2], (1,2))
  193. AreEqual(a[1,2,3], (1,2,3))
  194. AreEqual(a[(1, 2)], (1, 2))
  195. AreEqual(a[(5,)], (5,))
  196. AreEqual(a[6,], (6,))
  197. a[1] = 23
  198. AreEqual(a.res, (1,23))
  199. a[1,2] = 23
  200. AreEqual(a.res, ((1,2),23))
  201. a[1,2,3] = 23
  202. AreEqual(a.res, ((1,2,3),23))
  203. a[(1, 2)] = "B"; AreEqual(a.res, ((1, 2), "B"))
  204. a[(5,)] = "D"; AreEqual(a.res, ((5,), "D"))
  205. a[6,] = "E"; AreEqual(a.res, ((6,), "E"))
  206. def test_getorsetitem_super():
  207. tests = [ # base type, constructor arg, result of index 0
  208. (list,(1,2,3,4,5), 1),
  209. (dict,{0:2, 3:4, 5:6, 7:8}, 2),
  210. (str,'abcde', 'a'),
  211. (tuple, (1,2,3,4,5), 1),]
  212. for testInfo in tests:
  213. base = testInfo[0]
  214. arg = testInfo[1]
  215. zero = testInfo[2]
  216. class foo(base):
  217. def __getitem__(self, index):
  218. if isinstance(index, tuple):
  219. return base.__getitem__(self, index[0])
  220. return base.__getitem__(self, index)
  221. def __setitem__(self, index, value):
  222. if isinstance(index, tuple):
  223. base.__setitem__(self, index[0], value)
  224. else:
  225. base.__setitem__(self, index, value)
  226. a = foo(arg)
  227. AreEqual(a[0], zero)
  228. a = foo(arg)
  229. AreEqual(a[0,1], zero)
  230. a = foo(arg)
  231. AreEqual(a[0,1,2], zero)
  232. a = foo(arg)
  233. AreEqual(a[(0,)], zero)
  234. a = foo(arg)
  235. AreEqual(a[(0,1)], zero)
  236. a = foo(arg)
  237. AreEqual(a[(0,1,2)], zero)
  238. if hasattr(base, '__setitem__'):
  239. a[0] = 'x'
  240. AreEqual(a[0], 'x')
  241. a[0,1] = 'y'
  242. AreEqual(a[0,1], 'y')
  243. a[0,1,2] = 'z'
  244. AreEqual(a[0,1,2], 'z')
  245. a[(0,)] = 'x'
  246. AreEqual(a[(0,)], 'x')
  247. a[(0,1)] = 'y'
  248. AreEqual(a[(0,1)], 'y')
  249. a[(0,1,2)] = 'z'
  250. AreEqual(a[(0,1,2)], 'z')
  251. def test_getorsetitem_slice():
  252. tests = [ # base type, constructor arg, result of index 0
  253. (list,(1,2,3,4,5), 1, lambda x: [x]),
  254. (str,'abcde', 'a', lambda x: x),
  255. (tuple, (1,2,3,4,5), 1, lambda x: (x,)),]
  256. for testInfo in tests:
  257. base = testInfo[0]
  258. arg = testInfo[1]
  259. zero = testInfo[2]
  260. resL = testInfo[3]
  261. class foo(base):
  262. def __getitem__(self, index):
  263. if isinstance(index, tuple):
  264. return base.__getitem__(self, index[0])
  265. return base.__getitem__(self, index)
  266. def __setitem__(self, index, value):
  267. if isinstance(index, tuple):
  268. base.__setitem__(self, index[0], value)
  269. else:
  270. base.__setitem__(self, index, value)
  271. a = foo(arg)
  272. AreEqual(a[0:1], resL(zero))
  273. a = foo(arg)
  274. AreEqual(a[0:1, 1:2], resL(zero))
  275. a = foo(arg)
  276. AreEqual(a[0:1, 1:2, 2:3], resL(zero))
  277. a = foo(arg)
  278. AreEqual(a[(slice(0,1),)], resL(zero))
  279. a = foo(arg)
  280. AreEqual(a[(slice(0,1),slice(1,2))], resL(zero))
  281. a = foo(arg)
  282. AreEqual(a[(slice(0,1),slice(1,2),slice(2,3))], resL(zero))
  283. if hasattr(base, '__setitem__'):
  284. a[0:1] = 'x'
  285. AreEqual(a[0:1], ['x'])
  286. a[0:1,1:2] = 'y'
  287. AreEqual(a[0:1,1:2], ['y'])
  288. a[0:1,1:2,2:3] = 'z'
  289. AreEqual(a[0:1,1:2,2:3], ['z'])
  290. a[(slice(0,1),)] = 'x'
  291. AreEqual(a[(slice(0,1),)], ['x'])
  292. a[(slice(0,1),slice(1,2))] = 'y'
  293. AreEqual(a[(slice(0,1),slice(1,2))], ['y'])
  294. a[(slice(0,1),slice(1,2),slice(2,3))] = 'z'
  295. AreEqual(a[(slice(0,1),slice(1,2),slice(2,3))], ['z'])
  296. def test_index_by_tuple():
  297. class indexable:
  298. def __getitem__(self, index):
  299. return index
  300. def __setitem__(self, index, value):
  301. self.index = index
  302. self.value = value
  303. i = indexable()
  304. AreEqual(i["Hi"], "Hi")
  305. AreEqual(i[(1, 2)], (1, 2))
  306. AreEqual(i[3, 4], (3, 4))
  307. AreEqual(i[(5,)], (5,))
  308. AreEqual(i[6,], (6,))
  309. i["Hi"] = "A"; AreEqual(i.index, "Hi"); AreEqual(i.value, "A")
  310. i[(1, 2)] = "B"; AreEqual(i.index, (1, 2)); AreEqual(i.value, "B")
  311. i[3, 4] = "C"; AreEqual(i.index, (3, 4)); AreEqual(i.value, "C")
  312. i[(5,)] = "D"; AreEqual(i.index, (5,)); AreEqual(i.value, "D")
  313. i[6,] = "E"; AreEqual(i.index, (6,)); AreEqual(i.value, "E")
  314. def test_assignment_order():
  315. # declare types to log the execution ordering
  316. class Q:
  317. def __init__(self):
  318. self.log = ""
  319. # we're just doing assignment, so don't define a __getitem__
  320. def __setitem__(self, idx, val):
  321. self.log += "(idx=%s, val=%s)" % ( idx, val)
  322. c=Q()
  323. def f():
  324. c[0]=1 # do a side effect to log execution order of f()
  325. return 'x'
  326. # Now execute the interesting statement. This has side-effects in c.log to log execution order.
  327. c[5]=c[2]=f()
  328. # now check that order is as expected
  329. # - assignments should occur from left to right
  330. # - rhs expression is evalled first, and should only be executed once,
  331. AreEqual(c.log, "(idx=0, val=1)(idx=5, val=x)(idx=2, val=x)")
  332. def test_custom_indexer():
  333. class cust_index(object):
  334. def __init__(self, index):
  335. self.index = index
  336. def __index__(self):
  337. return self.index
  338. for sliceable in [x(range(5)) for x in (list, tuple)]:
  339. AreEqual(sliceable[cust_index(0L)], 0)
  340. AreEqual(sliceable[cust_index(0)], 0)
  341. AreEqual(list(sliceable[cust_index(0L) : cust_index(3L)]), [0, 1, 2])
  342. AreEqual(list(sliceable[cust_index(0) : cust_index(3)]), [0, 1, 2])
  343. # dictionary indexing shouldn't be affected
  344. x = cust_index(42)
  345. d = {x:3}
  346. AreEqual(d[x], 3)
  347. for key in d.keys():
  348. AreEqual(key, x)
  349. if is_cli:
  350. from System.Collections.Generic import List
  351. List[int]
  352. @skip('win32')
  353. def test_csharp_enumeration():
  354. a = CSharpEnumerable()
  355. for method in ('GetEnumerableOfInt', 'GetEnumerableOfObject', 'GetEnumerable',
  356. 'GetEnumeratorOfInt', 'GetEnumeratorOfObject', 'GetEnumerator'):
  357. sum = 0
  358. for i in getattr(a, method)():
  359. sum = sum + i
  360. AreEqual(sum, 6)
  361. def test_error():
  362. l = []
  363. AssertErrorWithPartialMessage(TypeError, "'builtin_function_or_method' object is not subscriptable", lambda: l.append[float](1.0))
  364. AssertErrorWithPartialMessage(TypeError, "'int' object is not subscriptable", lambda: 1[2])
  365. def test_cp19350_index_restrictions():
  366. global keyValue
  367. class X(object):
  368. def __setitem__(self, key, value):
  369. global keyValue
  370. keyValue = key
  371. def f(a, b):
  372. X()[a, b] = object()
  373. f(1, 2)
  374. AreEqual(keyValue, (1, 2))
  375. f('one', 'two')
  376. AreEqual(keyValue, ('one', 'two'))
  377. run_test(__name__)