test_core_reflect.odin 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. // Tests "core:reflect/reflect".
  2. // Must be run with `-collection:tests=` flag, e.g.
  3. // ./odin run tests/core/reflect/test_core_reflect.odin -out=tests/core/test_core_reflect -collection:tests=./tests
  4. package test_core_reflect
  5. import "core:fmt"
  6. import "core:reflect"
  7. import "core:testing"
  8. import tc "tests:common"
  9. main :: proc() {
  10. t := testing.T{}
  11. test_as_u64(&t)
  12. test_as_f64(&t)
  13. tc.report(&t)
  14. }
  15. @test
  16. test_as_u64 :: proc(t: ^testing.T) {
  17. using reflect
  18. {
  19. /* i8 */
  20. Datum :: struct { i: int, v: i8, e: u64 }
  21. @static data := []Datum{
  22. { 0, 0x7F, 0x7F },
  23. { 1, -1, 0xFFFF_FFFF_FFFF_FFFF },
  24. { 2, -0x80, 0xFFFF_FFFF_FFFF_FF80 },
  25. }
  26. for d, i in data {
  27. assert(i == d.i)
  28. r, valid := as_u64(d.v)
  29. tc.expect(t, valid, fmt.tprintf("i:%d %s(i8 %v) !valid\n", i, #procedure, d.v))
  30. tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i8 %v) -> %v (0x%X) != %v (0x%X)\n",
  31. i, #procedure, d.v, r, r, d.e, d.e))
  32. }
  33. }
  34. {
  35. /* i16 */
  36. Datum :: struct { i: int, v: i16, e: u64 }
  37. @static data := []Datum{
  38. { 0, 0x7FFF, 0x7FFF },
  39. { 1, -1, 0xFFFF_FFFF_FFFF_FFFF },
  40. { 2, -0x8000, 0xFFFF_FFFF_FFFF_8000 },
  41. }
  42. for d, i in data {
  43. assert(i == d.i)
  44. r, valid := as_u64(d.v)
  45. tc.expect(t, valid, fmt.tprintf("i:%d %s(i16 %v) !valid\n", i, #procedure, d.v))
  46. tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i16 %v) -> %v (0x%X) != %v (0x%X)\n",
  47. i, #procedure, d.v, r, r, d.e, d.e))
  48. }
  49. }
  50. {
  51. /* i32 */
  52. Datum :: struct { i: int, v: i32, e: u64 }
  53. @static data := []Datum{
  54. { 0, 0x7FFF_FFFF, 0x7FFF_FFFF },
  55. { 1, -1, 0xFFFF_FFFF_FFFF_FFFF },
  56. { 2, -0x8000_0000, 0xFFFF_FFFF_8000_0000 },
  57. }
  58. for d, i in data {
  59. assert(i == d.i)
  60. r, valid := as_u64(d.v)
  61. tc.expect(t, valid, fmt.tprintf("i:%d %s(i32 %v) !valid\n", i, #procedure, d.v))
  62. tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i32 %v) -> %v (0x%X) != %v (0x%X)\n",
  63. i, #procedure, d.v, r, r, d.e, d.e))
  64. }
  65. }
  66. {
  67. /* i64 */
  68. Datum :: struct { i: int, v: i64, e: u64 }
  69. @static data := []Datum{
  70. { 0, 0x7FFF_FFFF_FFFF_FFFF, 0x7FFF_FFFF_FFFF_FFFF },
  71. { 1, -1, 0xFFFF_FFFF_FFFF_FFFF },
  72. { 2, -0x8000_0000_0000_0000, 0x8000_0000_0000_0000 },
  73. }
  74. for d, i in data {
  75. assert(i == d.i)
  76. r, valid := as_u64(d.v)
  77. tc.expect(t, valid, fmt.tprintf("i:%d %s(i64 %v) !valid\n", i, #procedure, d.v))
  78. tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i64 %v) -> %v (0x%X) != %v (0x%X)\n",
  79. i, #procedure, d.v, r, r, d.e, d.e))
  80. }
  81. }
  82. {
  83. /* i128 */
  84. Datum :: struct { i: int, v: i128, e: u64 }
  85. @static data := []Datum{
  86. { 0, 0x7FFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF, 0xFFFF_FFFF_FFFF_FFFF },
  87. { 1, -1, 0xFFFF_FFFF_FFFF_FFFF },
  88. { 2, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000 },
  89. { 3, -0x8000_0000_0000_0000, 0x8000_0000_0000_0000 },
  90. { 4, 0x0001_0000_0000_0000_0000, 0 },
  91. { 5, -0x8000_0000_0000_0000_0000_0000_0000_0000, 0 },
  92. }
  93. for d, i in data {
  94. assert(i == d.i)
  95. r, valid := as_u64(d.v)
  96. tc.expect(t, valid, fmt.tprintf("i:%d %s(i128 %v) !valid\n", i, #procedure, d.v))
  97. tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i128 %v) -> %v (0x%X) != %v (0x%X)\n",
  98. i, #procedure, d.v, r, r, d.e, d.e))
  99. }
  100. }
  101. {
  102. /* f16 */
  103. Datum :: struct { i: int, v: f16, e: u64 }
  104. @static data := []Datum{
  105. { 0, 1.2, 1 },
  106. { 1, 123.12, 123 },
  107. }
  108. for d, i in data {
  109. assert(i == d.i)
  110. r, valid := as_u64(d.v)
  111. tc.expect(t, valid, fmt.tprintf("i:%d %s(f16 %v) !valid\n", i, #procedure, d.v))
  112. tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(f16 %v) -> %v != %v\n", i, #procedure, d.v, r, d.e))
  113. }
  114. }
  115. {
  116. /* f32 */
  117. Datum :: struct { i: int, v: f32, e: u64 }
  118. @static data := []Datum{
  119. { 0, 123.3415, 123 },
  120. }
  121. for d, i in data {
  122. assert(i == d.i)
  123. r, valid := as_u64(d.v)
  124. tc.expect(t, valid, fmt.tprintf("i:%d %s(f32 %v) !valid\n", i, #procedure, d.v))
  125. tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(f32 %v) -> %v != %v\n", i, #procedure, d.v, r, d.e))
  126. }
  127. }
  128. {
  129. /* f64 */
  130. Datum :: struct { i: int, v: f64, e: u64 }
  131. @static data := []Datum{
  132. { 0, 12345345345.3415234234, 12345345345 },
  133. }
  134. for d, i in data {
  135. assert(i == d.i)
  136. r, valid := as_u64(d.v)
  137. tc.expect(t, valid, fmt.tprintf("i:%d %s(f64 %v) !valid\n", i, #procedure, d.v))
  138. tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(f64 %v) -> %v != %v\n", i, #procedure, d.v, r, d.e))
  139. }
  140. }
  141. }
  142. @test
  143. test_as_f64 :: proc(t: ^testing.T) {
  144. using reflect
  145. {
  146. /* i8 */
  147. Datum :: struct { i: int, v: i8, e: f64 }
  148. @static data := []Datum{
  149. { 0, 0x7F, 0x7F },
  150. { 1, -1, -1 },
  151. { 2, -0x80, -0x80 },
  152. }
  153. for d, i in data {
  154. assert(i == d.i)
  155. r, valid := as_f64(d.v)
  156. tc.expect(t, valid, fmt.tprintf("i:%d %s(i8 %v) !valid\n", i, #procedure, d.v))
  157. tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i8 %v) -> %v != %v\n", i, #procedure, d.v, r, d.e))
  158. }
  159. }
  160. {
  161. /* i16 */
  162. Datum :: struct { i: int, v: i16, e: f64 }
  163. @static data := []Datum{
  164. { 0, 0x7FFF, 0x7FFF },
  165. { 1, -1, -1 },
  166. { 2, -0x8000, -0x8000 },
  167. }
  168. for d, i in data {
  169. assert(i == d.i)
  170. r, valid := as_f64(d.v)
  171. tc.expect(t, valid, fmt.tprintf("i:%d %s(i16 %v) !valid\n", i, #procedure, d.v))
  172. tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i16 %v) -> %v != %v\n", i, #procedure, d.v, r, d.e))
  173. }
  174. }
  175. {
  176. /* i32 */
  177. Datum :: struct { i: int, v: i32, e: f64 }
  178. @static data := []Datum{
  179. { 0, 0x7FFF_FFFF, 0x7FFF_FFFF },
  180. { 1, -1, -1 },
  181. { 2, -0x8000_0000, -0x8000_0000 },
  182. }
  183. for d, i in data {
  184. assert(i == d.i)
  185. r, valid := as_f64(d.v)
  186. tc.expect(t, valid, fmt.tprintf("i:%d %s(i32 %v) !valid\n", i, #procedure, d.v))
  187. tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i32 %v) -> %v != %v\n", i, #procedure, d.v, r, d.e))
  188. }
  189. }
  190. {
  191. /* i64 */
  192. Datum :: struct { i: int, v: i64, e: f64 }
  193. @static data := []Datum{
  194. { 0, 0x7FFF_FFFF_FFFF_FFFF, 0x7FFF_FFFF_FFFF_FFFF },
  195. { 1, -1, -1 },
  196. { 2, -0x8000_0000_0000_0000, -0x8000_0000_0000_0000 },
  197. }
  198. for d, i in data {
  199. assert(i == d.i)
  200. r, valid := as_f64(d.v)
  201. tc.expect(t, valid, fmt.tprintf("i:%d %s(i64 %v) !valid\n", i, #procedure, d.v))
  202. tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i64 %v) -> %v != %v\n", i, #procedure, d.v, r, d.e))
  203. }
  204. }
  205. {
  206. /* i128 */
  207. Datum :: struct { i: int, v: i128, e: f64 }
  208. @static data := []Datum{
  209. { 0, 0x7FFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF, 0x7FFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF },
  210. { 1, -1, -1 },
  211. { 2, 0x8000_0000_0000_0000_0000_0000_0000, 0x8000_0000_0000_0000_0000_0000_0000 },
  212. { 3, -0x8000_0000_0000_0000_0000_0000_0000_0000, -0x8000_0000_0000_0000_0000_0000_0000_0000 },
  213. }
  214. for d, i in data {
  215. assert(i == d.i)
  216. r, valid := as_f64(d.v)
  217. tc.expect(t, valid, fmt.tprintf("i:%d %s(i128 %v) !valid\n", i, #procedure, d.v))
  218. tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i128 %v) -> %v (%H) != %v (%H)\n",
  219. i, #procedure, d.v, r, r, d.e, d.e))
  220. }
  221. }
  222. {
  223. /* f16 */
  224. Datum :: struct { i: int, v: f16, e: f64 }
  225. @static data := []Datum{
  226. { 0, 1.2, 0h3FF3_3400_0000_0000 }, // Precision difference TODO: check
  227. { 1, 123.12, 0h405E_C800_0000_0000 }, // Precision difference TODO: check
  228. }
  229. for d, i in data {
  230. assert(i == d.i)
  231. r, valid := as_f64(d.v)
  232. tc.expect(t, valid, fmt.tprintf("i:%d %s(f16 %v) !valid\n", i, #procedure, d.v))
  233. tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(f16 %v (%H)) -> %v (%H) != %v (%H)\n",
  234. i, #procedure, d.v, d.v, r, r, d.e, d.e))
  235. }
  236. }
  237. {
  238. /* f32 */
  239. Datum :: struct { i: int, v: f32, e: f64 }
  240. @static data := []Datum{
  241. { 0, 123.3415, 0h405E_D5DB_2000_0000 }, // Precision difference TODO: check
  242. }
  243. for d, i in data {
  244. assert(i == d.i)
  245. r, valid := as_f64(d.v)
  246. tc.expect(t, valid, fmt.tprintf("i:%d %s(f32 %v) !valid\n", i, #procedure, d.v))
  247. tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(f32 %v (%H)) -> %v (%H) != %v (%H)\n",
  248. i, #procedure, d.v, d.v, r, r, d.e, d.e))
  249. }
  250. }
  251. {
  252. /* f64 */
  253. Datum :: struct { i: int, v: f64, e: f64 }
  254. @static data := []Datum{
  255. { 0, 12345345345.3415234234, 12345345345.3415234234 },
  256. }
  257. for d, i in data {
  258. assert(i == d.i)
  259. r, valid := as_f64(d.v)
  260. tc.expect(t, valid, fmt.tprintf("i:%d %s(f64 %v) !valid\n", i, #procedure, d.v))
  261. tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(f64 %v) -> %v != %v\n", i, #procedure, d.v, r, d.e))
  262. }
  263. }
  264. }