import { ECPairKey } from "./ecpairkey";

describe("ECPairKey", () => {
    
    test("create keypair", () => {
        const PairKey = new ECPairKey()

        expect(PairKey.privateKey).toBeDefined()
    })
    
    test("get the public key", () => {
        const pairKey = new ECPairKey({ privateKey: "0c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d" });

        const publicKey = pairKey.getPublicKey()

        expect(publicKey).toBe("04d0de0aaeaefad02b8bdc8a01a1b8b11c696bd3d66a2c5f10780d95b7df42645cd85228a6fb29940e858e7e55842ae2bd115d1ed7cc0e82d934e929c97648cb0a")
    })

    test("get compressed public key", () => {
        let pairKey = ECPairKey.fromWif("5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ")

        const compressed = pairKey.getPublicKeyCompressed()

        expect(compressed).toBe("qWxvCXDvALEvQJriaWj7Pucs8e8N4jzNez2mnrCotqKH")
    })

    test("get private key WIF", () => {
        const pairKey = new ECPairKey({ privateKey: "0c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d" });

        expect(pairKey.getWif()).toBe("5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ");
    })

    test("get public key WIF", () => {
        const pairKey = new ECPairKey({ privateKey: "0c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d" })

        const publicWif = pairKey.getPublicWif()

        expect(publicWif).toBe("KwdMAjGmerYanjeui5SHS7JkmpZvVipYvB2LJGU1ZxJwYvP98617")
    })

    test("sign and verify signature", () => {

        let pairKey = new ECPairKey({ privateKey: "16260783e40b16731673622ac8a5b045fc3ea4af70f727f3f9e92bdd3a1ddc42" });

        let signature = pairKey.signDER("6244980fa0752e5b4643edb353fda5238a9a3d44491676788efdd25dd64855ba")

        let isValid = pairKey.verifySignature("6244980fa0752e5b4643edb353fda5238a9a3d44491676788efdd25dd64855ba", signature)

        expect(isValid).toBe(true)
    })

    test("import from wif", () => {
        let pairKey = ECPairKey.fromWif("5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ")

        expect(pairKey.privateKey).toBe("0c28fca386c7a227600b2fe50b7cae11ec86d3bf1fbe471be89827e19d72aa1d")

        let error = false
        let wifVersionError = "25JBG1P53WpDHnB1NFd9cSCZ9QdKS3fv5hqDbMte2bChDkmVhXa"
        try { pairKey = ECPairKey.fromWif(wifVersionError) } 
        catch { error = true }
        finally {
            // a validation error must occur, as the first byte, designated the version, is incorrect
            expect(error).toBe(true)
        }

        error = false
        let wifChecksumError = "5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvykx"
        try { pairKey = ECPairKey.fromWif(wifChecksumError) } catch { error = true }
        // a validation error should occur because the last 4 bytes assigned to the checksum are incorrect
        expect(error).toBe(true)
    })
    
    test("import from hex", () => {
        const pairKey = ECPairKey.fromHex({ 
            privateKey: "9d01e9e28cba0217c5826838596733b2cf86a54fff3eabcabec90a2acdc101d8", 
            network: "testnet" 
        })
        
        const address = pairKey.getAddress("p2wpkh")

        expect(address).toBe("tb1q4ppec5re8vpnm7qsmcjhkvf3gj500mwfw0yxaj")
    })

    test("get bitcoin address", () => {
        const pairKey = ECPairKey.fromWif("5KCyEgVQ93iZoJ81tYrknfpry9LopRhJgBTdMFsapamox69wdar")

        let address = pairKey.getAddress("p2pkh")

        expect(address).toBeDefined()
        expect(address).toBe("1Kj9UWTgPmzWrmHnFUx1hGzKi3A4R5e1NA")

        address = pairKey.getAddress("p2wpkh") // bech32
        expect(address).toBe("bc1qe44vaalmg0yxd56wav8xhtqp5xe30fe7mxws4z")
    })
})
