mirror of
https://github.com/luxfi/safe-ios.git
synced 2026-10-30 15:19:20 +00:00
128 lines
5.4 KiB
Swift
128 lines
5.4 KiB
Swift
//
|
|
// Copyright © 2018 Gnosis Ltd. All rights reserved.
|
|
//
|
|
|
|
import XCTest
|
|
import BigInt
|
|
@testable import Multisig
|
|
|
|
class ContractTests: XCTestCase {
|
|
|
|
let contract = Contract(.zero)
|
|
|
|
func test_selectorToMethodId() {
|
|
let selector = "abc()".data(using: .ascii)!
|
|
let expectedHash = EthHasher.hash(selector)
|
|
let methodCall = expectedHash.prefix(4)
|
|
XCTAssertEqual(contract.method("abc()"), methodCall)
|
|
}
|
|
|
|
func test_whenEncodingUInt_thenEncodesInto32Bytes() {
|
|
let rawValue = Data(repeating: 0, count: 32 - 160 / 8) + Data(repeating: 0xff, count: 160 / 8)
|
|
let expectedValue = BigUInt(2).power(160) - 1
|
|
XCTAssertEqual(contract.encodeUInt(expectedValue), rawValue)
|
|
}
|
|
|
|
func test_whenEncodingUIntTooBig_thenTakesRightmost32Bytes() {
|
|
let tooBig = BigUInt(2).power(512) - 1
|
|
let remainder = BigUInt(2).power(256) - 1
|
|
XCTAssertEqual(contract.encodeUInt(tooBig), contract.encodeUInt(remainder))
|
|
}
|
|
|
|
func test_whenDecodingUInt160_thenDecodesAsBigInt() {
|
|
let expectedValue = BigUInt(2).power(160) - 1
|
|
XCTAssertEqual(contract.decodeUInt(contract.encodeUInt(expectedValue)), expectedValue)
|
|
}
|
|
func test_whenDecodingUIntEmptyData_thenReturns0() {
|
|
XCTAssertEqual(contract.decodeUInt(Data()), 0)
|
|
}
|
|
|
|
func test_whenEncodingTupleUInt_thenEncodesToData() {
|
|
let values = (0..<3).map { i in BigUInt(2) ^ (1 + i) }
|
|
let rawValues = values.map { contract.encodeUInt($0) }.reduce(into: Data()) { $0.append($1) }
|
|
XCTAssertEqual(rawValues.count, 3 * 32)
|
|
|
|
XCTAssertEqual(contract.encodeTupleUInt(values), rawValues)
|
|
}
|
|
|
|
func test_whenDataIsEmpty_thenDecodingReturnsEmptyValue() {
|
|
XCTAssertEqual(contract.decodeArrayAddress(Data()), [])
|
|
XCTAssertEqual(contract.decodeArrayUInt(Data()), [])
|
|
XCTAssertEqual(contract.decodeTupleUInt(Data(), 0), [])
|
|
XCTAssertEqual(contract.decodeTupleUInt(Data(), 1), [])
|
|
}
|
|
|
|
func test_whenDecodingTupleOfStaticTypes_thenDecodesAsArray() {
|
|
let values = (0..<3).map { i in BigUInt(2) ^ (1 + i) }
|
|
XCTAssertEqual(contract.decodeTupleUInt(contract.encodeTupleUInt(values), values.count), values)
|
|
}
|
|
|
|
func test_whenEncodingArrayUInt_thenEncodesToData() {
|
|
let values = (0..<3).map { i in BigUInt(2) ^ (1 + i) }
|
|
let offsetToData = contract.encodeUInt(32)
|
|
let count = contract.encodeUInt(3)
|
|
let items = values.map { contract.encodeUInt($0) }.reduce(into: Data()) { $0.append($1) }
|
|
let rawValues = offsetToData + count + items
|
|
XCTAssertEqual(contract.encodeArrayUInt(values), rawValues)
|
|
}
|
|
|
|
func test_whenDecodingArrayOfUInts_thenReturnsArray() {
|
|
let values = [BigUInt(1), BigUInt(2), BigUInt(3)]
|
|
XCTAssertEqual(contract.decodeArrayUInt(contract.encodeArrayUInt(values)), values)
|
|
}
|
|
|
|
func test_whenEncodesDecodesAddress_thenUsesUInt() {
|
|
let values = [Address(1), Address(2)]
|
|
let uints: [BigUInt] = [1, 2]
|
|
XCTAssertEqual(contract.encodeArrayAddress(values), contract.encodeArrayUInt(uints))
|
|
}
|
|
|
|
func test_whenDecodesAddress_thenReturnsIt() {
|
|
let rawValue = contract.encodeUInt(1)
|
|
XCTAssertEqual(contract.decodeAddress(rawValue), Address(1))
|
|
}
|
|
|
|
func test_whenEncodesAddress_thenReturnsData() {
|
|
XCTAssertEqual(contract.encodeAddress(Address(1)), contract.encodeUInt(1))
|
|
}
|
|
|
|
func test_whenEncodesDecodesBool_thenDoesItCorrectly() {
|
|
XCTAssertEqual(contract.encodeBool(true), contract.encodeUInt(1))
|
|
XCTAssertEqual(contract.encodeBool(false), contract.encodeUInt(0))
|
|
XCTAssertEqual(contract.decodeBool(Data()), false)
|
|
XCTAssertEqual(contract.decodeBool(contract.encodeUInt(123)), true)
|
|
XCTAssertEqual(contract.decodeBool(contract.encodeUInt(1)), true)
|
|
XCTAssertEqual(contract.decodeBool(contract.encodeUInt(0)), false)
|
|
}
|
|
|
|
func test_encodeBytes() {
|
|
let shorterThan32Bytes = Data([0x01])
|
|
let exactly32Bytes = Data(repeating: 0xa, count: 32)
|
|
let multipleOf32Bytes = Data(repeating: 0xb, count: 64)
|
|
let remainderShorterThan32Bytes = Data(repeating: 0xc, count: 33)
|
|
|
|
XCTAssertEqual(contract.encodeBytes(shorterThan32Bytes),
|
|
contract.encodeUInt(BigUInt(shorterThan32Bytes.count)) +
|
|
shorterThan32Bytes.rightPadded(to: 32))
|
|
|
|
XCTAssertEqual(contract.encodeBytes(exactly32Bytes),
|
|
contract.encodeUInt(BigUInt(exactly32Bytes.count)) +
|
|
exactly32Bytes)
|
|
|
|
XCTAssertEqual(contract.encodeBytes(multipleOf32Bytes),
|
|
contract.encodeUInt(BigUInt(multipleOf32Bytes.count)) +
|
|
multipleOf32Bytes)
|
|
|
|
XCTAssertEqual(contract.encodeBytes(remainderShorterThan32Bytes),
|
|
contract.encodeUInt(BigUInt(remainderShorterThan32Bytes.count)) +
|
|
remainderShorterThan32Bytes.rightPadded(to: 64))
|
|
|
|
XCTAssertEqual(contract.decodeBytes(contract.encodeBytes(shorterThan32Bytes)), shorterThan32Bytes)
|
|
XCTAssertEqual(contract.decodeBytes(contract.encodeBytes(exactly32Bytes)), exactly32Bytes)
|
|
XCTAssertEqual(contract.decodeBytes(contract.encodeBytes(multipleOf32Bytes)), multipleOf32Bytes)
|
|
XCTAssertEqual(contract.decodeBytes(contract.encodeBytes(remainderShorterThan32Bytes)), remainderShorterThan32Bytes)
|
|
|
|
}
|
|
|
|
}
|