import JavaScriptBigIntSupport
import JavaScriptKit
import XCTest

class JavaScriptBigIntSupportTests: XCTestCase {
    func testBigIntSupport() {
        // Test signed values
        func testSignedValue(_ value: Int64, file: StaticString = #filePath, line: UInt = #line) {
            let bigInt = JSBigInt(value)
            XCTAssertEqual(bigInt.description, value.description, file: file, line: line)
            let bigInt2 = JSBigInt(_slowBridge: value)
            XCTAssertEqual(bigInt2.description, value.description, file: file, line: line)
        }

        // Test unsigned values
        func testUnsignedValue(_ value: UInt64, file: StaticString = #filePath, line: UInt = #line) {
            let bigInt = JSBigInt(unsigned: value)
            XCTAssertEqual(bigInt.description, value.description, file: file, line: line)
            let bigInt2 = JSBigInt(_slowBridge: value)
            XCTAssertEqual(bigInt2.description, value.description, file: file, line: line)
        }

        // Test specific signed values
        testSignedValue(0)
        testSignedValue(1 << 62)
        testSignedValue(-2305)

        // Test random signed values
        for _ in 0..<100 {
            testSignedValue(.random(in: .min ... .max))
        }

        // Test edge signed values
        testSignedValue(.min)
        testSignedValue(.max)

        // Test specific unsigned values
        testUnsignedValue(0)
        testUnsignedValue(1 << 62)
        testUnsignedValue(1 << 63)
        testUnsignedValue(.min)
        testUnsignedValue(.max)
        testUnsignedValue(~0)

        // Test random unsigned values
        for _ in 0..<100 {
            testUnsignedValue(.random(in: .min ... .max))
        }
    }
}