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

use Test::More 'no_plan';

BEGIN { use_ok('Chemistry::Harmonia') };
use Chemistry::Harmonia qw(:all);

##### Test parse_chem_mix() #####

my $dt = &datest;
my $ot = &oxitest;

for my $i (0,1){
    my $p = $i ? 'zero2oxi' : '';

    for my $mix ( keys %$dt ){
	my %k = $i ? ($p => 1) : ( );
	
	is_deeply( [ @{ parse_chem_mix($mix, \%k) }, \%k ],
	    $dt->{$mix}, "$p parse test '$mix'" );
    }

    for my $mix ( keys %$ot ){
	my %k = $i ? ($p => 1) : ( );
	is_deeply( [ @{ parse_chem_mix($mix, \%k) }, \%k ],
		$ot->{ $mix }[$i],
		"$p parse test '$mix'" );
    }
}

for my $mix ('2Al = 0 0Al2O3', '2Al = 0 Al2O3', '1 FE+' ){
    is( parse_chem_mix( $mix ), undef, "parse test '$mix'" );
}

exit;


sub datest{
    return {
    '1 O2 +++;;;++,,, 2 ;; H2 = 2 +++ H2O' => [ ['O2', 'H2'], ['H2O'], {'O2' => 1, 'H2' => 2, 'H2O' => 2} ],
    '2Al 1 02 Ca Al2O3' => [ ['Al', 'O2', 'Ca'], ['Al2O3'], {'Al' => 2, 'O2' => 1} ],
    '2Al 102 Ca Al2O3' => [ ['Al', 'Ca'], ['Al2O3'], {'Al' => 2, 'Ca' => 102} ],
    '2Al 1 02 4O2 = 1 0Al2O3' => [ ['Al', 'O2'], ['OAl2O3'], {'Al' => 2, 'O2' => 4, 'OAl2O3' => 1} ],
    '2Al = 00 Al2O3' => [ ['Al'], ['O0', 'Al2O3'], {'Al' => 2} ],
    '2Al O 2 = Al2O3' => [ ['Al', 'O2'], ['Al2O3'], {'Al' => 2} ],
    '2Al O = ' => [ ['Al', 'O'], ['='], {'Al' => 2} ],
    ' = 2Al O' => [ ['=','Al'], ['O'], {'Al' => 2} ],
    '0Al = O2 Al2O3' => [ ['O2'], ['Al2O3'], {} ],
    '2Al 1 2 3 4 Ca 5 6 Al2O3 7 8 9' => [ ['Al', 'Ca'], ['Al2O3'], {'Al2O3' => 56, 'Al' => 2, 'Ca' => 1234} ],
    '2Al 1 2 3 4 Ca 5 6 Al2O3' => [ ['Al', 'Ca'], ['Al2O3'], {'Al2O3' => 56, 'Al' => 2, 'Ca' => 1234} ],
    '2Al 1 2 3 4 Ca 5 6 = Al2O3' => [ ['Al', 'Ca56'], ['Al2O3'], {'Al' => 2, 'Ca56' => 1234} ],
    '2Al 1 2 3 4 Ca 5 6 = Al2O3 CaO 9' => [ ['Al', 'Ca56'], ['Al2O3', 'CaO'], {'Al' => 2, 'Ca56' => 1234} ],
    '(SCN) 2 + H2O ' => [ ['(SCN)2'], ['H2O'], {} ],
    'Al O + 2 = Al2O3' => [ ['Al', 'O'], ['Al2O3'], {'Al2O3' => 2} ],
    'Cr( OH )  3 + NaOH = Na3[ Cr( OH )  6  ]' => [ ['Cr(OH)3', 'NaOH'], ['Na3[Cr(OH)6]'], {} ],
    }
}

sub oxitest{
    return {
    '2Al O O O O  = 0 Al2O3 1 0' => [
		[ ['Al'], ['O'], {'Al' => 2, 'O' => 1} ],
		[ ['Al', 'O'], ['Al2O3'], {'Al' => 2, 'O' => 1} ]
		],
    '2Al = 0 Al2O3 0' => [
		[ ['Al'], ['O'], {'Al' => 2} ],
		[ ['Al'], ['O', 'Al2O3'], {'Al' => 2} ]
		],
    'Al O2 = 0 Al2O3' => [
		[ ['Al'], ['O2'], {} ],
		[ ['Al', 'O2'], ['O', 'Al2O3'], {} ]
		],
    }
}