<?php
namespace Composer\Test\Util;

use Composer\TestCase;
use Composer\Util\SpdxLicenseIdentifier;

class SpdxLicenseIdentifierTest extends TestCase
{
    public static function provideValidLicenses()
    {
        $valid = array_merge(
            array(
                "MIT",
                "NONE",
                "NOASSERTION",
                "LicenseRef-3",
                array("LGPL-2.0", "GPL-3.0+"),
                "(LGPL-2.0 or GPL-3.0+)",
                "(EUDatagrid and GPL-3.0+)",
            ),
            json_decode(file_get_contents(__DIR__ . '/../../../../res/spdx-identifier.json'))
        );

        foreach ($valid as &$r) {
            $r = array($r);
        }

        return $valid;
    }

    public static function provideInvalidLicenses()
    {
        return array(
            array(""),
            array(array()),
            array("The system pwns you"),
            array("()"),
            array("(MIT)"),
            array("MIT NONE"),
            array("MIT (MIT and MIT)"),
            array("(MIT and MIT) MIT"),
            array(array("LGPL-2.0", "The system pwns you")),
            array("and GPL-3.0+"),
            array("EUDatagrid and GPL-3.0+"),
            array("(GPL-3.0 and GPL-2.0 or GPL-3.0+)"),
            array("(EUDatagrid and GPL-3.0+ and  )"),
            array("(EUDatagrid xor GPL-3.0+)"),
            array("(MIT Or MIT)"),
            array("(NONE or MIT)"),
            array("(NOASSERTION or MIT)"),
        );
    }

    public static function provideInvalidArgument()
    {
        return array(
            array(null),
            array(new \stdClass),
            array(array(new \stdClass)),
            array(array("mixed", new \stdClass)),
            array(array(new \stdClass, new \stdClass)),
        );
    }

    /**
     * @dataProvider provideValidLicenses
     * @param $license
     */
    public function testValidate($license)
    {
        $validator = new SpdxLicenseIdentifier();
        $this->assertTrue($validator->validate($license));
    }

    /**
     * @dataProvider provideInvalidLicenses
     * @param string|array $invalidLicense
     */
    public function testInvalidLicenses($invalidLicense)
    {
        $validator = new SpdxLicenseIdentifier();
        $this->assertFalse($validator->validate($invalidLicense));
    }

    /**
     * @dataProvider provideInvalidArgument
     * @expectedException InvalidArgumentException
     */
    public function testInvalidArgument($invalidArgument)
    {
        $validator = new SpdxLicenseIdentifier();
        $validator->validate($invalidArgument);
    }
}