150 lines
4.1 KiB
Nim
Raw Normal View History

2021-11-30 15:14:57 +01:00
import std/unittest
import pkg/questionable/results
2021-11-30 15:14:57 +01:00
import contractabi
import ./examples
2022-09-12 14:30:31 +02:00
type SomeDistinctType = distinct uint16
2022-09-12 14:30:57 +02:00
func `==`*(a, b: SomeDistinctType): bool =
uint16(a) == uint16(b)
2022-09-12 14:30:31 +02:00
2021-11-30 15:14:57 +01:00
suite "ABI decoding":
proc checkDecode[T](value: T) =
let encoded = AbiEncoder.encode(value)
check !AbiDecoder.decode(encoded, T) == value
2021-11-30 15:14:57 +01:00
proc checkDecode(T: type) =
checkDecode(T.example)
checkDecode(T.low)
checkDecode(T.high)
test "decodes uint8, uint16, 32, 64":
checkDecode(uint8)
checkDecode(uint16)
checkDecode(uint32)
checkDecode(uint64)
2021-12-09 10:38:34 +01:00
test "decodes int8, int16, int32, int64":
checkDecode(int8)
checkDecode(int16)
checkDecode(int32)
checkDecode(int64)
test "fails to decode when reading past end":
var encoded = AbiEncoder.encode(uint8.example)
encoded.delete(encoded.len-1)
let decoded = AbiDecoder.decode(encoded, uint8)
check decoded.error.msg == "reading past end"
test "fails to decode when trailing bytes remain":
var encoded = AbiEncoder.encode(uint8.example)
encoded.add(byte.example)
let decoded = AbiDecoder.decode(encoded, uint8)
check decoded.error.msg == "unread trailing bytes found"
test "fails to decode when padding does not consist of zeroes":
var encoded = AbiEncoder.encode(uint8.example)
encoded[3] = 42'u8
let decoded = AbiDecoder.decode(encoded, uint8)
check decoded.error.msg == "invalid padding found"
2021-11-30 15:14:57 +01:00
test "decodes booleans":
checkDecode(false)
checkDecode(true)
test "fails to decode boolean when value is not 0 or 1":
let encoded = AbiEncoder.encode(2'u8)
check AbiDecoder.decode(encoded, bool).error.msg == "invalid boolean value"
2021-11-30 15:14:57 +01:00
test "decodes ranges":
type SomeRange = range[0x0000'u16..0xAAAA'u16]
checkDecode(SomeRange(42))
checkDecode(SomeRange.low)
checkDecode(SomeRange.high)
test "fails to decode when value not in range":
type SomeRange = range[0x0000'u16..0xAAAA'u16]
let encoded = AbiEncoder.encode(0xFFFF'u16)
let decoded = AbiDecoder.decode(encoded, SomeRange)
check decoded.error.msg == "value not in range"
2021-11-30 15:14:57 +01:00
test "decodes enums":
type SomeEnum = enum
one = 1
two = 2
checkDecode(one)
checkDecode(two)
test "fails to decode enum when encountering invalid value":
type SomeEnum = enum
one = 1
two = 2
let encoded = AbiEncoder.encode(3'u8)
check AbiDecoder.decode(encoded, SomeEnum).error.msg == "invalid enum value"
2021-11-30 15:14:57 +01:00
test "decodes stints":
checkDecode(UInt128)
checkDecode(UInt256)
2021-12-09 10:38:34 +01:00
checkDecode(Int128)
checkDecode(Int256)
2021-11-30 15:14:57 +01:00
2022-01-19 09:16:22 +01:00
test "decodes addresses":
checkDecode(Address.example)
2021-11-30 15:14:57 +01:00
test "decodes byte arrays":
checkDecode([1'u8, 2'u8, 3'u8])
checkDecode(array[32, byte].example)
checkDecode(array[33, byte].example)
test "decodes byte sequences":
checkDecode(@[1'u8, 2'u8, 3'u8])
checkDecode(@(array[32, byte].example))
checkDecode(@(array[33, byte].example))
test "decodes tuples":
let a = true
let b = @[1'u8, 2'u8, 3'u8]
let c = 0xAABBCCDD'u32
let d = @[4'u8, 5'u8, 6'u8]
2021-12-01 11:40:12 +01:00
checkDecode( (a, b, c, d) )
2021-11-30 15:14:57 +01:00
test "decodes nested tuples":
let a = true
let b = @[1'u8, 2'u8, 3'u8]
let c = 0xAABBCCDD'u32
let d = @[4'u8, 5'u8, 6'u8]
2021-12-01 11:40:12 +01:00
checkDecode( (a, b, (c, d)) )
2021-11-30 15:14:57 +01:00
test "reads elements after dynamic tuple":
let a = @[1'u8, 2'u8, 3'u8]
let b = 0xAABBCCDD'u32
2021-12-01 11:40:12 +01:00
checkDecode( ((a,), b) )
2021-11-30 15:14:57 +01:00
test "reads elements after static tuple":
let a = 0x123'u16
let b = 0xAABBCCDD'u32
2021-12-01 11:40:12 +01:00
checkDecode( ((a,), b) )
2021-11-30 15:14:57 +01:00
test "reads static tuple inside dynamic tuple":
let a = @[1'u8, 2'u8, 3'u8]
let b = 0xAABBCCDD'u32
2021-12-01 11:40:12 +01:00
checkDecode( (a, (b,)) )
2021-11-30 15:14:57 +01:00
test "reads empty tuples":
2021-12-01 11:40:12 +01:00
checkDecode( ((),) )
2021-11-30 15:14:57 +01:00
2021-11-30 16:22:52 +01:00
test "decodes sequences":
checkDecode(@[seq[byte].example, seq[byte].example])
test "decodes arrays with static elements":
checkDecode([array[32, byte].example, array[32, byte].example])
test "decodes arrays with dynamic elements":
checkDecode([seq[byte].example, seq[byte].example])
2021-11-30 16:23:24 +01:00
test "decodes strings":
checkDecode("hello!☺")
2022-09-12 14:30:31 +02:00
test "decodes distinct types as their base type":
checkDecode(SomeDistinctType(0xAABB'u16))