'use strict';

const fs = require('fs');
const expect = require('chai').expect;
const { makeVcdStream } = require('../bin/vcd');

describe('wasm iverilog', () => {
    it('small vcd', async () => {
        const vcdstream = await makeVcdStream();
        const arraybuffer = fs.readFileSync('./test/samples/iverilog.small.vcd');
        const answers = JSON.parse(fs.readFileSync('./test/samples/iverilog.small.json'));
        
        vcdstream.consume(arraybuffer);
        const info = vcdstream.getBasicInfo();
        const values = info.signalValues;

        // task 1
        expect(Object.keys(values)).to.have.length.above(0);

        // task 2
        expect(info.vcdInfo.date.trim()).to.eq('Thu Jul 22 22:29:56 2021');
        expect(info.vcdInfo.version.trim()).to.eq('Icarus Verilog');

        // task 3
        for (const key of Object.keys(answers)) {
            const ans = answers[key];
            expect(values[key]).to.not.be.undefined;
            expect(values[key]).to.deep.eq(ans);
        }
    });

    it('large vcd', async () => {
        const vcdstream = await makeVcdStream();
        const arraybuffer = fs.readFileSync('./test/samples/iverilog.large.vcd');
        // const answers = JSON.parse(fs.readFileSync('./test/samples/iverilog.large.json'));
        
        vcdstream.consume(arraybuffer);
        const info = vcdstream.getBasicInfo();
        const values = info.signalValues;

        // task 1
        expect(Object.keys(values)).to.have.length.above(0);
        expect(values['*']).to.not.be.undefined;
        expect(values['+']).to.not.be.undefined;

        console.log(info.signalValues['*']);

        // task 2
        // expect(info.vcdInfo.date.trim()).to.eq('Sat Apr 20 20:06:14 2024');
        // expect(info.vcdInfo.version.trim()).to.eq('Icarus Verilog');
        // expect(info.vcdInfo.timescale.trim()).to.eq('1ns');

        // // task 2
        // for (const key of Object.keys(answers)) {
        //     const ans = answers[key];
        //     expect(values[key]).to.not.be.undefined;
        //     expect(values[key]).to.deep.eq(ans);
        // }
    });
});
