The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

use warnings;
use strict;
use Test::More tests => 34;

use Verilog::VCD qw(:all);

my $vcd;
my $expected;

# Before a VCD file is parsed, the endtime, date and version are undefined
is(get_endtime(),   undef, 'undefined endtime');
is(get_closetime(), undef, 'undefined closetime');
is(get_date(),      undef, 'undefined date');
is(get_version(),   undef, 'undefined version');

# Before a VCD file is parsed, comments array is empty
my @comms = get_decl_comments();
is_deeply(\@comms, [], 'no declaration comments yet');
@comms = get_sim_comments();
is_deeply(\@comms, [], 'no simulation comments yet');

# Before a VCD file is parsed, dumps hash is empty
my %dumps = get_dumps();
is_deeply(\%dumps, {}, 'no dumps yet');

# Sorting is needed to guard against indeterminate hash ordering
$expected = ([sort qw(
    tb.dut.in
    tb.dut.in2[7:0]
    tb.dut.out2[7:0]
    tb.dut.outa[3:0]
    tb.dut.io[1:0]
    tb.dut.out
)]);
my @sigs = list_sigs('t/vcd/vcs.evcd');
@sigs = sort @sigs;
is_deeply(\@sigs, $expected, 'sigs evcd');

$vcd = parse_vcd('t/vcd/vcs.evcd', {siglist => [('tb.dut.io[1:0]')]});

is(get_timescale(), '1ns', 'timescale = 1ns');
is(keys %{ $vcd }, 1, 'one code');
my ($code) = keys %{ $vcd };
is($code, '<4', 'code');
is(scalar @{ $vcd->{$code}{nets} }, '1', 'number of nets');
is($vcd->{$code}{nets}[0]{name}, 'io[1:0]', 'name');
is($vcd->{$code}{nets}[0]{hier}, 'tb.dut' , 'hier');
is($vcd->{$code}{nets}[0]{type}, 'port'   , 'type');
is($vcd->{$code}{nets}[0]{size}, '[1:0]'  , 'size');

my $i = 0;
for (@{ $vcd->{$code}{tv} }) {
    is(scalar @{ $_ }, '4', "number of elements in tv array $i");
    $i++;
}

my $tv = $vcd->{$code}{tv};
my @actuals = map { $_->[0] } @{ $tv };
my @expects = (qw(
    0
    9
    18
    18
    22
    27
    36
));
is_deeply(\@actuals, \@expects, 'times');

@actuals = map { $_->[1] } @{ $tv };
@expects = (qw(
    LH
    LL
    LH
    XX
    LH
    LL
    LH
));
is_deeply(\@actuals, \@expects, 'values');

@actuals = map { $_->[2] } @{ $tv };
@expects = (qw(
    60
    66
    60
    66
    60
    66
    60
));
is_deeply(\@actuals, \@expects, 'strength0');

@actuals = map { $_->[3] } @{ $tv };
@expects = (qw(
    06
    00
    06
    66
    06
    00
    06
));
is_deeply(\@actuals, \@expects, 'strength1');

is(get_endtime(),   '36', 'end time');
is(get_closetime(), '42', 'close time');

is(get_timescale(), '1ns', 'timescale = 1ns');

@comms = get_decl_comments();
is_deeply(\@comms, [('Csum: 1 4db1f6174ef0adc6')], 'declaration comments');

%dumps = get_dumps();
$expected = {(
    dumpports       => [qw(0)],
    dumpportsoff    => [qw(18)],
    dumpportson     => [qw(22)],
)};
is_deeply(\%dumps, $expected, 'several dumps');

$vcd = parse_vcd('t/vcd/vcs.evcd', {timescale => 'ps'});
is(get_closetime(), '42000', 'close time mult');
is(get_timescale(), '1ps', 'timescale = 1ps');