123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- // Tests "core:reflect/reflect".
- // Must be run with `-collection:tests=` flag, e.g.
- // ./odin run tests/core/reflect/test_core_reflect.odin -out=tests/core/test_core_reflect -collection:tests=./tests
- package test_core_reflect
- import "core:fmt"
- import "core:reflect"
- import "core:testing"
- import tc "tests:common"
- main :: proc() {
- t := testing.T{}
- test_as_u64(&t)
- test_as_f64(&t)
- tc.report(&t)
- }
- @test
- test_as_u64 :: proc(t: ^testing.T) {
- using reflect
- {
- /* i8 */
- Datum :: struct { i: int, v: i8, e: u64 }
- @static data := []Datum{
- { 0, 0x7F, 0x7F },
- { 1, -1, 0xFFFF_FFFF_FFFF_FFFF },
- { 2, -0x80, 0xFFFF_FFFF_FFFF_FF80 },
- }
- for d, i in data {
- assert(i == d.i)
- r, valid := as_u64(d.v)
- tc.expect(t, valid, fmt.tprintf("i:%d %s(i8 %v) !valid\n", i, #procedure, d.v))
- tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i8 %v) -> %v (0x%X) != %v (0x%X)\n",
- i, #procedure, d.v, r, r, d.e, d.e))
- }
- }
- {
- /* i16 */
- Datum :: struct { i: int, v: i16, e: u64 }
- @static data := []Datum{
- { 0, 0x7FFF, 0x7FFF },
- { 1, -1, 0xFFFF_FFFF_FFFF_FFFF },
- { 2, -0x8000, 0xFFFF_FFFF_FFFF_8000 },
- }
- for d, i in data {
- assert(i == d.i)
- r, valid := as_u64(d.v)
- tc.expect(t, valid, fmt.tprintf("i:%d %s(i16 %v) !valid\n", i, #procedure, d.v))
- tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i16 %v) -> %v (0x%X) != %v (0x%X)\n",
- i, #procedure, d.v, r, r, d.e, d.e))
- }
- }
- {
- /* i32 */
- Datum :: struct { i: int, v: i32, e: u64 }
- @static data := []Datum{
- { 0, 0x7FFF_FFFF, 0x7FFF_FFFF },
- { 1, -1, 0xFFFF_FFFF_FFFF_FFFF },
- { 2, -0x8000_0000, 0xFFFF_FFFF_8000_0000 },
- }
- for d, i in data {
- assert(i == d.i)
- r, valid := as_u64(d.v)
- tc.expect(t, valid, fmt.tprintf("i:%d %s(i32 %v) !valid\n", i, #procedure, d.v))
- tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i32 %v) -> %v (0x%X) != %v (0x%X)\n",
- i, #procedure, d.v, r, r, d.e, d.e))
- }
- }
- {
- /* i64 */
- Datum :: struct { i: int, v: i64, e: u64 }
- @static data := []Datum{
- { 0, 0x7FFF_FFFF_FFFF_FFFF, 0x7FFF_FFFF_FFFF_FFFF },
- { 1, -1, 0xFFFF_FFFF_FFFF_FFFF },
- { 2, -0x8000_0000_0000_0000, 0x8000_0000_0000_0000 },
- }
- for d, i in data {
- assert(i == d.i)
- r, valid := as_u64(d.v)
- tc.expect(t, valid, fmt.tprintf("i:%d %s(i64 %v) !valid\n", i, #procedure, d.v))
- tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i64 %v) -> %v (0x%X) != %v (0x%X)\n",
- i, #procedure, d.v, r, r, d.e, d.e))
- }
- }
- {
- /* i128 */
- Datum :: struct { i: int, v: i128, e: u64 }
- @static data := []Datum{
- { 0, 0x7FFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF, 0xFFFF_FFFF_FFFF_FFFF },
- { 1, -1, 0xFFFF_FFFF_FFFF_FFFF },
- { 2, 0x8000_0000_0000_0000, 0x8000_0000_0000_0000 },
- { 3, -0x8000_0000_0000_0000, 0x8000_0000_0000_0000 },
- { 4, 0x0001_0000_0000_0000_0000, 0 },
- { 5, -0x8000_0000_0000_0000_0000_0000_0000_0000, 0 },
- }
- for d, i in data {
- assert(i == d.i)
- r, valid := as_u64(d.v)
- tc.expect(t, valid, fmt.tprintf("i:%d %s(i128 %v) !valid\n", i, #procedure, d.v))
- tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i128 %v) -> %v (0x%X) != %v (0x%X)\n",
- i, #procedure, d.v, r, r, d.e, d.e))
- }
- }
- {
- /* f16 */
- Datum :: struct { i: int, v: f16, e: u64 }
- @static data := []Datum{
- { 0, 1.2, 1 },
- { 1, 123.12, 123 },
- }
- for d, i in data {
- assert(i == d.i)
- r, valid := as_u64(d.v)
- tc.expect(t, valid, fmt.tprintf("i:%d %s(f16 %v) !valid\n", i, #procedure, d.v))
- tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(f16 %v) -> %v != %v\n", i, #procedure, d.v, r, d.e))
- }
- }
- {
- /* f32 */
- Datum :: struct { i: int, v: f32, e: u64 }
- @static data := []Datum{
- { 0, 123.3415, 123 },
- }
- for d, i in data {
- assert(i == d.i)
- r, valid := as_u64(d.v)
- tc.expect(t, valid, fmt.tprintf("i:%d %s(f32 %v) !valid\n", i, #procedure, d.v))
- tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(f32 %v) -> %v != %v\n", i, #procedure, d.v, r, d.e))
- }
- }
- {
- /* f64 */
- Datum :: struct { i: int, v: f64, e: u64 }
- @static data := []Datum{
- { 0, 12345345345.3415234234, 12345345345 },
- }
- for d, i in data {
- assert(i == d.i)
- r, valid := as_u64(d.v)
- tc.expect(t, valid, fmt.tprintf("i:%d %s(f64 %v) !valid\n", i, #procedure, d.v))
- tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(f64 %v) -> %v != %v\n", i, #procedure, d.v, r, d.e))
- }
- }
- }
- @test
- test_as_f64 :: proc(t: ^testing.T) {
- using reflect
- {
- /* i8 */
- Datum :: struct { i: int, v: i8, e: f64 }
- @static data := []Datum{
- { 0, 0x7F, 0x7F },
- { 1, -1, -1 },
- { 2, -0x80, -0x80 },
- }
- for d, i in data {
- assert(i == d.i)
- r, valid := as_f64(d.v)
- tc.expect(t, valid, fmt.tprintf("i:%d %s(i8 %v) !valid\n", i, #procedure, d.v))
- tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i8 %v) -> %v != %v\n", i, #procedure, d.v, r, d.e))
- }
- }
- {
- /* i16 */
- Datum :: struct { i: int, v: i16, e: f64 }
- @static data := []Datum{
- { 0, 0x7FFF, 0x7FFF },
- { 1, -1, -1 },
- { 2, -0x8000, -0x8000 },
- }
- for d, i in data {
- assert(i == d.i)
- r, valid := as_f64(d.v)
- tc.expect(t, valid, fmt.tprintf("i:%d %s(i16 %v) !valid\n", i, #procedure, d.v))
- tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i16 %v) -> %v != %v\n", i, #procedure, d.v, r, d.e))
- }
- }
- {
- /* i32 */
- Datum :: struct { i: int, v: i32, e: f64 }
- @static data := []Datum{
- { 0, 0x7FFF_FFFF, 0x7FFF_FFFF },
- { 1, -1, -1 },
- { 2, -0x8000_0000, -0x8000_0000 },
- }
- for d, i in data {
- assert(i == d.i)
- r, valid := as_f64(d.v)
- tc.expect(t, valid, fmt.tprintf("i:%d %s(i32 %v) !valid\n", i, #procedure, d.v))
- tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i32 %v) -> %v != %v\n", i, #procedure, d.v, r, d.e))
- }
- }
- {
- /* i64 */
- Datum :: struct { i: int, v: i64, e: f64 }
- @static data := []Datum{
- { 0, 0x7FFF_FFFF_FFFF_FFFF, 0x7FFF_FFFF_FFFF_FFFF },
- { 1, -1, -1 },
- { 2, -0x8000_0000_0000_0000, -0x8000_0000_0000_0000 },
- }
- for d, i in data {
- assert(i == d.i)
- r, valid := as_f64(d.v)
- tc.expect(t, valid, fmt.tprintf("i:%d %s(i64 %v) !valid\n", i, #procedure, d.v))
- tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i64 %v) -> %v != %v\n", i, #procedure, d.v, r, d.e))
- }
- }
- {
- /* i128 */
- Datum :: struct { i: int, v: i128, e: f64 }
- @static data := []Datum{
- { 0, 0x7FFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF, 0x7FFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF },
- { 1, -1, -1 },
- { 2, 0x8000_0000_0000_0000_0000_0000_0000, 0x8000_0000_0000_0000_0000_0000_0000 },
- { 3, -0x8000_0000_0000_0000_0000_0000_0000_0000, -0x8000_0000_0000_0000_0000_0000_0000_0000 },
- }
- for d, i in data {
- assert(i == d.i)
- r, valid := as_f64(d.v)
- tc.expect(t, valid, fmt.tprintf("i:%d %s(i128 %v) !valid\n", i, #procedure, d.v))
- tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(i128 %v) -> %v (%H) != %v (%H)\n",
- i, #procedure, d.v, r, r, d.e, d.e))
- }
- }
- {
- /* f16 */
- Datum :: struct { i: int, v: f16, e: f64 }
- @static data := []Datum{
- { 0, 1.2, 0h3FF3_3400_0000_0000 }, // Precision difference TODO: check
- { 1, 123.12, 0h405E_C800_0000_0000 }, // Precision difference TODO: check
- }
- for d, i in data {
- assert(i == d.i)
- r, valid := as_f64(d.v)
- tc.expect(t, valid, fmt.tprintf("i:%d %s(f16 %v) !valid\n", i, #procedure, d.v))
- tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(f16 %v (%H)) -> %v (%H) != %v (%H)\n",
- i, #procedure, d.v, d.v, r, r, d.e, d.e))
- }
- }
- {
- /* f32 */
- Datum :: struct { i: int, v: f32, e: f64 }
- @static data := []Datum{
- { 0, 123.3415, 0h405E_D5DB_2000_0000 }, // Precision difference TODO: check
- }
- for d, i in data {
- assert(i == d.i)
- r, valid := as_f64(d.v)
- tc.expect(t, valid, fmt.tprintf("i:%d %s(f32 %v) !valid\n", i, #procedure, d.v))
- tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(f32 %v (%H)) -> %v (%H) != %v (%H)\n",
- i, #procedure, d.v, d.v, r, r, d.e, d.e))
- }
- }
- {
- /* f64 */
- Datum :: struct { i: int, v: f64, e: f64 }
- @static data := []Datum{
- { 0, 12345345345.3415234234, 12345345345.3415234234 },
- }
- for d, i in data {
- assert(i == d.i)
- r, valid := as_f64(d.v)
- tc.expect(t, valid, fmt.tprintf("i:%d %s(f64 %v) !valid\n", i, #procedure, d.v))
- tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(f64 %v) -> %v != %v\n", i, #procedure, d.v, r, d.e))
- }
- }
- }
|