maybe_ut.pyx 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. from util.generic.maybe cimport TMaybe, Nothing
  2. import pytest
  3. import unittest
  4. def _check_from_py(TMaybe[int] x):
  5. return x.Defined()
  6. def _check_to_py_value():
  7. cdef TMaybe[int] tmp = TMaybe[int](42)
  8. return tmp
  9. def _check_to_py_nothing():
  10. cdef TMaybe[int] tmp = Nothing()
  11. return tmp
  12. class TestMaybe(unittest.TestCase):
  13. def test_ctor1(self):
  14. cdef TMaybe[int] tmp = TMaybe[int]()
  15. self.assertFalse(tmp.Defined())
  16. def test_ctor2(self):
  17. cdef TMaybe[int] tmp = TMaybe[int](42)
  18. self.assertTrue(tmp.Defined())
  19. self.assertEqual(tmp.GetRef(), 42)
  20. def test_ctor3(self):
  21. cdef TMaybe[int] tmp = Nothing()
  22. self.assertFalse(tmp.Defined())
  23. def test_operator_assign(self):
  24. cdef TMaybe[int] tmp
  25. tmp = 42
  26. self.assertTrue(tmp.Defined())
  27. self.assertEqual(tmp.GetRef(), 42)
  28. def test_compare(self):
  29. cdef TMaybe[int] tmp1 = 17
  30. cdef TMaybe[int] tmp2 = 42
  31. cdef TMaybe[int] nothing
  32. # ==
  33. self.assertTrue(tmp1 == 17)
  34. self.assertTrue(tmp1 == tmp1)
  35. self.assertTrue(nothing == nothing)
  36. self.assertFalse(tmp1 == 16)
  37. self.assertFalse(tmp1 == tmp2)
  38. self.assertFalse(tmp1 == nothing)
  39. # !=
  40. self.assertTrue(tmp1 != 16)
  41. self.assertTrue(tmp1 != tmp2)
  42. self.assertTrue(tmp1 != nothing)
  43. self.assertFalse(tmp1 != 17)
  44. self.assertFalse(tmp1 != tmp1)
  45. self.assertFalse(nothing != nothing)
  46. # <
  47. self.assertTrue(nothing < tmp1)
  48. self.assertTrue(nothing < tmp2)
  49. self.assertTrue(tmp1 < tmp2)
  50. self.assertTrue(nothing < 0)
  51. self.assertTrue(tmp1 < 18)
  52. self.assertFalse(nothing < nothing)
  53. self.assertFalse(tmp1 < tmp1)
  54. self.assertFalse(tmp2 < tmp1)
  55. self.assertFalse(tmp1 < 16)
  56. # <=
  57. self.assertTrue(nothing <= nothing)
  58. self.assertTrue(nothing <= tmp1)
  59. self.assertTrue(nothing <= tmp2)
  60. self.assertTrue(tmp1 <= tmp1)
  61. self.assertTrue(tmp1 <= tmp2)
  62. self.assertTrue(nothing <= 0)
  63. self.assertTrue(tmp1 <= 18)
  64. self.assertFalse(tmp2 <= tmp1)
  65. self.assertFalse(tmp1 <= 16)
  66. # >
  67. self.assertTrue(tmp1 > nothing)
  68. self.assertTrue(tmp2 > nothing)
  69. self.assertTrue(tmp2 > tmp1)
  70. self.assertTrue(tmp1 > 16)
  71. self.assertFalse(nothing > nothing)
  72. self.assertFalse(nothing > 0)
  73. self.assertFalse(tmp1 > tmp1)
  74. self.assertFalse(tmp1 > tmp2)
  75. self.assertFalse(tmp1 > 18)
  76. # >=
  77. self.assertTrue(nothing >= nothing)
  78. self.assertTrue(tmp1 >= nothing)
  79. self.assertTrue(tmp2 >= nothing)
  80. self.assertTrue(tmp2 >= tmp1)
  81. self.assertTrue(tmp1 >= tmp1)
  82. self.assertTrue(tmp1 >= 16)
  83. self.assertFalse(nothing >= 0)
  84. self.assertFalse(tmp1 >= tmp2)
  85. self.assertFalse(tmp1 >= 18)
  86. def test_construct_in_place(self):
  87. cdef TMaybe[int] tmp
  88. tmp.ConstructInPlace(42)
  89. self.assertTrue(tmp.Defined())
  90. self.assertEqual(tmp.GetRef(), 42)
  91. def test_clear(self):
  92. cdef TMaybe[int] tmp = 42
  93. tmp.Clear()
  94. self.assertFalse(tmp.Defined())
  95. def test_defined(self):
  96. cdef TMaybe[int] tmp
  97. self.assertFalse(tmp.Defined())
  98. self.assertTrue(tmp.Empty())
  99. tmp = 42
  100. self.assertTrue(tmp.Defined())
  101. self.assertFalse(tmp.Empty())
  102. def test_check_defined(self):
  103. cdef TMaybe[int] tmp
  104. with pytest.raises(RuntimeError):
  105. tmp.CheckDefined()
  106. tmp = 42
  107. tmp.CheckDefined()
  108. def test_get(self):
  109. cdef TMaybe[int] tmp = 42
  110. cdef int* p = tmp.Get()
  111. self.assertTrue(p != NULL)
  112. self.assertEqual(p[0], 42)
  113. def test_get_ref(self):
  114. cdef TMaybe[int] tmp = 42
  115. self.assertTrue(tmp.Defined())
  116. self.assertEqual(tmp.GetRef(), 42)
  117. def test_get_or_else(self):
  118. cdef TMaybe[int] tmp = 42
  119. self.assertEqual(tmp.GetOrElse(13), 42)
  120. tmp.Clear()
  121. self.assertEqual(tmp.GetOrElse(13), 13)
  122. def test_or_else(self):
  123. cdef TMaybe[int] tmp = 42
  124. cdef TMaybe[int] nothing
  125. self.assertFalse(nothing.OrElse(nothing).Defined())
  126. self.assertEqual(tmp.OrElse(nothing).GetRef(), 42)
  127. self.assertEqual(nothing.OrElse(tmp).GetRef(), 42)
  128. self.assertEqual(tmp.OrElse(tmp).GetRef(), 42)
  129. def test_cast(self):
  130. cdef TMaybe[int] tmp = 42
  131. cdef TMaybe[char] tmp2 = tmp.Cast[char]()
  132. self.assertEqual(tmp2.GetRef(), 42)
  133. def test_swap(self):
  134. cdef TMaybe[int] tmp1 = 42
  135. cdef TMaybe[int] tmp2
  136. tmp2.Swap(tmp1)
  137. self.assertFalse(tmp1.Defined())
  138. self.assertEqual(tmp2.GetRef(), 42)
  139. def test_from_py(self):
  140. self.assertTrue(_check_from_py(42))
  141. self.assertFalse(_check_from_py(None))
  142. with self.assertRaises(TypeError):
  143. _check_from_py("ttt")
  144. def test_to_py(self):
  145. self.assertEqual(_check_to_py_value(), 42)
  146. self.assertEqual(_check_to_py_nothing(), None)