# -*- mode: cperl;-*-
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

use Test::More tests => 24;
use Dpkg::ErrorHandling;

use strict;
use warnings;

use_ok('Dpkg::BuildOptions');

{
    no warnings;
    # Disable warnings related to invalid values fed during
    # the tests
    report_options(quiet_warnings => 1);
}

$ENV{DEB_BUILD_OPTIONS} = 'noopt foonostripbar parallel=3 bazNOCHECK';

my $dbo = Dpkg::BuildOptions->new();
ok($dbo->has("noopt"), "has noopt");
is($dbo->get("noopt"), undef, "noopt value");
ok($dbo->has("foonostripbar"), "has foonostripbar");
is($dbo->get("foonostripbar"), undef, "foonostripbar value");
ok($dbo->has("parallel"), "has parallel");
is($dbo->get("parallel"), 3, "parallel value");
ok(!$dbo->has("bazNOCHECK"), "not has bazNOCHECK");

$dbo->reset();
$dbo->merge('no opt no-strip parallel = 5 nocheck', 'test');
ok($dbo->has('no'), "has no");
is($dbo->get('no'), undef, "no value");
ok($dbo->has('opt'), "has opt");
is($dbo->get('opt'), undef, "opt value");
ok($dbo->has('no-strip'), "has no-strip");
is($dbo->get('no-strip'), undef, "no-strip value");
ok($dbo->has('parallel'), "has parallel");
is($dbo->get('parallel'), '', "parallel value");
ok($dbo->has('nocheck'), "has nocheck");
is($dbo->get('nocheck'), undef, "nocheck value");

$dbo->reset();
$dbo->set('parallel', 5);
$dbo->set('noopt', undef);

my $env = $dbo->export();
is($env, "noopt parallel=5", "value of export");
is($ENV{DEB_BUILD_OPTIONS}, $env, 'env match return value of export');
$env = $dbo->export("OTHER_VARIABLE");
is($ENV{OTHER_VARIABLE}, $env, 'export to other variable');

$ENV{DEB_BUILD_OPTIONS} = 'foobar';
$dbo = Dpkg::BuildOptions->new();
$dbo->set("noopt", 1);
is($dbo->output(), "foobar noopt", "output");

$dbo = Dpkg::BuildOptions->new(envvar => "OTHER_VARIABLE");
is($dbo->get("parallel"), 5, "import from other variable, check parallel");
ok($dbo->has("noopt"), "import from other variable, check noopt");
