﻿:: {g:g, o:o, s:s, b:b, qb:b?, d:d, qd:d?, n:n, qn:n?, r8:r8, qr8:r8?, r4:r4, qr4:r4?, i:i, qi:i?, i8:i8, qi8:i8?, i4:i4, qi4:i4?, i2:i2, qi2:i2?, i1:i1, qi1:i1?, u8:u8, qu8:u8?, u4:u4, qu4:u4?, u2:u2, qu2:u2?, u1:u1, qu1:u1?}

CastI1(g)
CastI1(o)
CastI1(s)
CastI1(b)
CastI1(d)
CastI1(n)
CastI1(r8)
CastI1(r4)
CastI1(i)
CastI1(i8)
CastI1(i4)
CastI1(i2)
CastI1(i1)
CastI1(u8)
CastI1(u4)
CastI1(u2)
CastI1(u1)
CastI1(qb)
CastI1(qd)
CastI1(qn)
CastI1(qr8)
CastI1(qr4)
CastI1(qi)
CastI1(qi8)
CastI1(qi4)
CastI1(qi2)
CastI1(qi1)
CastI1(qu8)
CastI1(qu4)
CastI1(qu2)
CastI1(qu1)

// Lifting.
:: {g:g*, o:o*, s:s*, b:b*, qb:b?*, d:d*, qd:d?*, n:n*, qn:n?*, r8:r8*, qr8:r8?*, r4:r4*, qr4:r4?*, i:i*, qi:i?*, i8:i8*, qi8:i8?*, i4:i4*, qi4:i4?*, i2:i2*, qi2:i2?*, i1:i1*, qi1:i1?*, u8:u8*, qu8:u8?*, u4:u4*, qu4:u4?*, u2:u2*, qu2:u2?*, u1:u1*, qu1:u1?*}

CastI1(g)
CastI1(o)
CastI1(s)
CastI1(b)
CastI1(d)
CastI1(n)
CastI1(r8)
CastI1(r4)
CastI1(i)
CastI1(i8)
CastI1(i4)
CastI1(i2)
CastI1(i1)
CastI1(u8)
CastI1(u4)
CastI1(u2)
CastI1(u1)
CastI1(qb)
CastI1(qd)
CastI1(qn)
CastI1(qr8)
CastI1(qr4)
CastI1(qi)
CastI1(qi8)
CastI1(qi4)
CastI1(qi2)
CastI1(qi1)
CastI1(qu8)
CastI1(qu4)
CastI1(qu2)
CastI1(qu1)

// Reduce tests

CastI1(false)
CastI1(true)

// Aliases
CastShort(i)
CastInt(i)
CastReal(i)

// Values at boundaries.
CastI1(0x80i1)
CastI2(0x80i1)
CastI4(0x80i1)
CastI8(0x80i1)

CastI1(0xFFi1)
CastI2(0xFFi1)
CastI4(0xFFi1)
CastI8(0xFFi1)

CastI1(0x8000i2)
CastI2(0x8000i2)
CastI4(0x8000i2)
CastI8(0x8000i2)

CastI1(0xFFFFi2)
CastI2(0xFFFFi2)
CastI4(0xFFFFi2)
CastI8(0xFFFFi2)

CastI1(0x80000000i4)
CastI2(0x80000000i4)
CastI4(0x80000000i4)
CastI8(0x80000000i4)

CastI1(0xFFFFFFFFi4)
CastI2(0xFFFFFFFFi4)
CastI4(0xFFFFFFFFi4)
CastI8(0xFFFFFFFFi4)

CastI1(0x8000000000000000i8)
CastI2(0x8000000000000000i8)
CastI4(0x8000000000000000i8)
CastI8(0x8000000000000000i8)

CastI1(0xFFFFFFFFFFFFFFFFi8)
CastI2(0xFFFFFFFFFFFFFFFFi8)
CastI4(0xFFFFFFFFFFFFFFFFi8)
CastI8(0xFFFFFFFFFFFFFFFFi8)

CastI1(0x7Fi1)
CastI2(0x7Fi1)
CastI4(0x7Fi1)
CastI8(0x7Fi2)

CastI1(0x7FFFi2)
CastI2(0x7FFFi2)
CastI4(0x7FFFi2)
CastI8(0x7FFFi2)

CastI1(0x7FFFFFFFi4)
CastI2(0x7FFFFFFFi4)
CastI4(0x7FFFFFFFi4)
CastI8(0x7FFFFFFFi4)

CastI1(0x7FFFFFFFFFFFFFFFi8)
CastI2(0x7FFFFFFFFFFFFFFFi8)
CastI4(0x7FFFFFFFFFFFFFFFi8)
CastI8(0x7FFFFFFFFFFFFFFFi8)

CastI2(32767.9)
CastI2(32768.8)
CastI2(-123.456)
CastI2(-0.0)

// Test proper truncation (that we round towards 0)
CastU1(0.1)
CastI1(0.1)
CastU1(-0.1)
CastI1(-0.1)
CastU2(1e-10)
CastU1(1 - 1e-10)
CastI1(1 - 1e-10)
CastU2(1 - 1e-10)
CastI2(1 - 1e-10)
CastU4(1 - 1e-10)
CastI4(1 - 1e-10)
CastU8(1 - 1e-10)
CastI8(1 - 1e-10)
CastU1(-1 + 1e-10)
CastI1(-1 + 1e-10)
CastU2(-1 + 1e-10)
CastI2(-1 + 1e-10)
CastU4(-1 + 1e-10)
CastI4(-1 + 1e-10)
CastU8(-1 + 1e-10)
CastI8(-1 + 1e-10)

// Very small/large values
CastI1(2e300)
CastI8(2e300)
CastU1(2e300)
CastU8(2e300)
CastR4(2e300)
CastR8(2e300)
CastI1(2e-310)
CastI8(2e-310)
CastU1(2e-310)
CastU8(2e-310)
CastR4(2e-310)
CastR8(2e-310)
CastI1(-2e300)
CastI8(-2e300)
CastU1(-2e300)
CastU8(-2e300)
CastR4(-2e300)
CastR8(-2e300)
CastI1(-2e-310)
CastI8(-2e-310)
CastU1(-2e-310)
CastU8(-2e-310)
CastR4(-2e-310)
CastR8(-2e-310)

CastI1(-50)
CastI1(50)
CastU1(50)
CastU1(-50)
CastR4(50)
CastR8(-50)

CastI1(Null(317i4))
CastI1(Opt(317i4))

// REVIEW: Update if/when we have ToHex to compare results easily.
CastI1(0x0123456789ABCDEF)
CastI2(0x0123456789ABCDEF)
CastI4(0x0123456789ABCDEF)
CastI8(0x0123456789ABCDEF)

CastI1(0xFEDCBA9876543210)
CastI2(0xFEDCBA9876543210)
CastI4(0xFEDCBA9876543210)
CastI8(0xFEDCBA9876543210)

CastI1(128u)
CastI1(-128u)

// Rx

CastR8(false)
CastR8(true)

CastU1(0x80i1)
CastU2(0x80i1)
CastU4(0x80i1)
CastU8(0x80i1)

CastR4(0x80i1)
CastR8(0x80i1)

CastR4(-4e40)
CastR4(4e40)
CastR4(-4e-46)
CastR4(4e-46)

CastR4(4e30)
CastR4(-4e-40)
CastR4(4e-40)

CastR8(-0.0e-10)

// NaN

CastI1(0/0)
CastI2(0/0)
CastI4(0/0)
CastI8(0/0)
CastU1(0/0)
CastU2(0/0)
CastU4(0/0)
CastU8(0/0)
CastR4(0/0)
CastR8(0/0)

// Inf

CastI1(1/0)
CastI2(1/0)
CastI4(1/0)
CastI8(1/0)
CastU1(1/0)
CastU2(1/0)
CastU4(1/0)
CastU8(1/0)
CastR4(1/0)
CastR8(1/0)

CastI1(-1/0)
CastI2(-1/0)
CastI4(-1/0)
CastI8(-1/0)
CastU1(-1/0)
CastU2(-1/0)
CastU4(-1/0)
CastU8(-1/0)
CastR4(-1/0)
CastR8(-1/0)
