import { expect } from 'chai'; import { compile } from '../examples/node/revive.js'; import { fileURLToPath } from 'url'; import path from 'path'; import fs from 'fs'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); function loadFixture(fixture) { const fixturePath = path.resolve(__dirname, `../fixtures/${fixture}`); return JSON.parse(fs.readFileSync(fixturePath, 'utf-8')); } describe('Compile Function Tests', function () { it('should successfully compile valid Solidity code', async function () { const standardInput = loadFixture('storage.json') const result = await compile(standardInput); expect(result).to.be.a('string'); const output = JSON.parse(result); expect(output).to.have.property('contracts'); expect(output.contracts['fixtures/storage.sol']).to.have.property('Storage'); expect(output.contracts['fixtures/storage.sol'].Storage).to.have.property('abi'); expect(output.contracts['fixtures/storage.sol'].Storage).to.have.property('evm'); expect(output.contracts['fixtures/storage.sol'].Storage.evm).to.have.property('bytecode'); }); if (typeof globalThis.Bun == 'undefined') { // Running this test with Bun on a Linux host causes: // RuntimeError: Out of bounds memory access (evaluating 'getWasmTableEntry(index)(a1, a2, a3, a4, a5)') // Once this issue is resolved, the test will be re-enabled. it('should successfully compile large Solidity code', async function () { const standardInput = loadFixture('token.json') const result = await compile(standardInput); expect(result).to.be.a('string'); const output = JSON.parse(result); expect(output).to.have.property('contracts'); expect(output.contracts['fixtures/token.sol']).to.have.property('MyToken'); expect(output.contracts['fixtures/token.sol'].MyToken).to.have.property('abi'); expect(output.contracts['fixtures/token.sol'].MyToken).to.have.property('evm'); expect(output.contracts['fixtures/token.sol'].MyToken.evm).to.have.property('bytecode'); }); it("should successfully compile a valid Solidity contract that instantiates the token contracts", async function () { const standardInput = loadFixture("instantiate_tokens.json"); const result = await compile(standardInput); expect(result).to.be.a("string"); const output = JSON.parse(result); expect(output).to.have.property("contracts"); expect(output.contracts["fixtures/instantiate_tokens.sol"]).to.have.property( "TokensFactory", ); expect(output.contracts["fixtures/instantiate_tokens.sol"].TokensFactory).to.have.property( "abi", ); expect(output.contracts["fixtures/instantiate_tokens.sol"].TokensFactory).to.have.property( "evm", ); expect( output.contracts["fixtures/instantiate_tokens.sol"].TokensFactory.evm, ).to.have.property("bytecode"); }); } it('should throw an error for invalid Solidity code', async function () { const standardInput = loadFixture('invalid_contract_content.json') const result = await compile(standardInput); expect(result).to.be.a('string'); const output = JSON.parse(result); expect(output).to.have.property('errors'); expect(output.errors).to.be.an('array'); expect(output.errors.length).to.be.greaterThan(0); expect(output.errors[0].type).to.exist; expect(output.errors[0].type).to.contain("ParserError"); }); it('should return not found error for missing imports', async function () { const standardInput = loadFixture('missing_import.json') const result = await compile(standardInput); const output = JSON.parse(result); expect(output).to.have.property('errors'); expect(output.errors).to.be.an('array'); expect(output.errors.length).to.be.greaterThan(0); expect(output.errors[0].message).to.exist; expect(output.errors[0].message).to.include('Source "nonexistent/console.sol" not found'); }); it("should successfully compile a valid Solidity contract that instantiates another contract", async function () { const standardInput = loadFixture("instantiate.json"); const result = await compile(standardInput); expect(result).to.be.a("string"); const output = JSON.parse(result); expect(output).to.have.property("contracts"); expect(output.contracts["fixtures/instantiate.sol"]).to.have.property( "ChildContract", ); expect(output.contracts["fixtures/instantiate.sol"].ChildContract).to.have.property( "abi", ); expect(output.contracts["fixtures/instantiate.sol"].ChildContract).to.have.property( "evm", ); expect( output.contracts["fixtures/instantiate.sol"].ChildContract.evm, ).to.have.property("bytecode"); expect(output.contracts["fixtures/instantiate.sol"]).to.have.property( "MainContract", ); expect(output.contracts["fixtures/instantiate.sol"].MainContract).to.have.property( "abi", ); expect(output.contracts["fixtures/instantiate.sol"].MainContract).to.have.property( "evm", ); expect( output.contracts["fixtures/instantiate.sol"].MainContract.evm, ).to.have.property("bytecode"); }); });