The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# Before `make install' is performed this script should be runnable with
# `make test' or 'prove'. After `make install' it should work
# as `perl HTML-ParseBrowser.t'

#########################

# change 'tests => 1' to 'tests => last_test_to_print';
use strict;
use warnings;
use FindBin qw($Bin);
use File::Spec;
BEGIN {
  eval { require JSON::Tiny; JSON::Tiny->import("decode_json"); 1; } ||
  eval { require JSON; JSON->import("decode_json"); 1; };
}
# 0.94 necessary for subtests and note()
use Test::More 0.94;
# plan tests => 46;
require_ok('HTML::ParseBrowser');

my $ua;
ok($ua = HTML::ParseBrowser->new(), 'constructor');
isa_ok($ua, 'HTML::ParseBrowser');

my $tests;
{
    my $json_file = File::Spec->catfile($Bin, 'corpus.json');
    local $/;
    open my $fh, '<', $json_file or
        die q(couldn't open $json_file: $!);
    my $bytes = <$fh>;
    $tests = decode_json($bytes);
}

for my $data (@$tests){
    # anything that isn't a hash is a comment
    next if('HASH' ne (ref $data));
    my $ua_string = $data->{user_agent};
    my $test_name = substr($ua_string, 0, 40) . '...';
    subtest $test_name => sub {
        plan tests => scalar keys %$data;
        $ua->Parse($ua_string);
        for my $key (keys %$data){
            # TODO: should check validity with can() but autoload prevents that currently
            is($ua->$key(), $data->{$key}, $key) or
                note "failed $key for $ua_string";
        }
    };
}

# tests that cannot yet be done via JSON

$ua->Parse('Mozilla/5.0 (Macintosh; U; PPC Mac OS X; it-IT) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.15');
ok(!defined($ua->osvers), 'no OS version for this UA string')
  or note $ua->osvers;

done_testing();