// EXEC: cjc %import-path %L %l %f --test  
// EXEC: ./main

import std.unittest.*
import std.unittest.testmacro.*
import std.io.*
import cbor4cj.*
import std.math.*

@Test
public class NegativeIntegerTest {
    public init() {
        super()
    }

    @TestCase
    public func shouldEncodeAndDecode(): Unit {
        let maxInteger = -4294967295
        var i = -1
        while (i >= maxInteger) {
            shouldEncodeAndDecode(i.toString(), NegativeInteger(i))
            i += (maxInteger / 100000)
        }
        shouldEncodeAndDecode(maxInteger.toString(), NegativeInteger(maxInteger))
        shouldEncodeAndDecode("Long.MIN_VALUE", NegativeInteger(Int64.Min))
    }

    @TestCase
    public func shouldNotAcceptPositiveValues(): Unit {
        try {
            NegativeInteger(0)
        } catch (e: CborException) {
            return
        }
        @Assert(false)
    }

    protected func shouldEncodeAndDecode(message: String, dataItem: DataItem) {
        var byteArrayOutputStream = ByteBuffer();
        var encoder = CborEncoder(byteArrayOutputStream);
        encoder.encode(dataItem);
        var bytes = byteArrayOutputStream.bytes();
        var object: DataItem = CborDecoder.decodeStatic(bytes).first.getOrThrow()
        @Assert(dataItem, object)
    }
}