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') }) })