<?php
declare(strict_types=1);
namespace JKingWeb\Arsse;

use JKingWeb\Arsse\Misc\ValueInfo as I;
use JKingWeb\Arsse\Test\Misc\StrClass;

/** @covers \JKingWeb\Arsse\Misc\ValueInfo */
class TestValueInfo extends Test\AbstractTest {
    public function testGetIntegerInfo() {
        $tests = [
            [null,          I::NULL],
            ["",            I::NULL],
            [1,             I::VALID],
            [PHP_INT_MAX,   I::VALID],
            [1.0,           I::VALID],
            ["1.0",         I::VALID],
            ["001.0",       I::VALID],
            ["1.0e2",       I::VALID],
            ["1",           I::VALID],
            ["001",         I::VALID],
            ["1e2",         I::VALID],
            ["+1.0",        I::VALID],
            ["+001.0",      I::VALID],
            ["+1.0e2",      I::VALID],
            ["+1",          I::VALID],
            ["+001",        I::VALID],
            ["+1e2",        I::VALID],
            [0,             I::VALID | I::ZERO],
            ["0",           I::VALID | I::ZERO],
            ["000",         I::VALID | I::ZERO],
            [0.0,           I::VALID | I::ZERO],
            ["0.0",         I::VALID | I::ZERO],
            ["000.000",     I::VALID | I::ZERO],
            ["+0",          I::VALID | I::ZERO],
            ["+000",        I::VALID | I::ZERO],
            ["+0.0",        I::VALID | I::ZERO],
            ["+000.000",    I::VALID | I::ZERO],
            [-1,            I::VALID | I::NEG],
            [-1.0,          I::VALID | I::NEG],
            ["-1.0",        I::VALID | I::NEG],
            ["-001.0",      I::VALID | I::NEG],
            ["-1.0e2",      I::VALID | I::NEG],
            ["-1",          I::VALID | I::NEG],
            ["-001",        I::VALID | I::NEG],
            ["-1e2",        I::VALID | I::NEG],
            [-0,            I::VALID | I::ZERO],
            ["-0",          I::VALID | I::ZERO],
            ["-000",        I::VALID | I::ZERO],
            [-0.0,          I::VALID | I::ZERO],
            ["-0.0",        I::VALID | I::ZERO],
            ["-000.000",    I::VALID | I::ZERO],
            [false,         0],
            [true,          0],
            [INF,           0],
            [-INF,          0],
            [NAN,           0],
            [[],            0],
            ["some string", 0],
            ["           ", 0],
            [new \StdClass, 0],
            [new StrClass(""),    I::NULL],
            [new StrClass("1"),   I::VALID],
            [new StrClass("0"),   I::VALID | I::ZERO],
            [new StrClass("-1"),  I::VALID | I::NEG],
            [new StrClass("Msg"), 0],
            [new StrClass("   "), 0],
        ];
        foreach ($tests as $test) {
            list($value, $exp) = $test;
            $this->assertSame($exp, I::int($value), "Test returned ".decbin(I::int($value))." for value: ".var_export($value, true));
        }
    }
    public function testGetStringInfo() {
        $tests = [
            [null,          I::NULL],
            ["",            I::VALID | I::EMPTY],
            [1,             I::VALID],
            [PHP_INT_MAX,   I::VALID],
            [1.0,           I::VALID],
            ["1.0",         I::VALID],
            ["001.0",       I::VALID],
            ["1.0e2",       I::VALID],
            ["1",           I::VALID],
            ["001",         I::VALID],
            ["1e2",         I::VALID],
            ["+1.0",        I::VALID],
            ["+001.0",      I::VALID],
            ["+1.0e2",      I::VALID],
            ["+1",          I::VALID],
            ["+001",        I::VALID],
            ["+1e2",        I::VALID],
            [0,             I::VALID],
            ["0",           I::VALID],
            ["000",         I::VALID],
            [0.0,           I::VALID],
            ["0.0",         I::VALID],
            ["000.000",     I::VALID],
            ["+0",          I::VALID],
            ["+000",        I::VALID],
            ["+0.0",        I::VALID],
            ["+000.000",    I::VALID],
            [-1,            I::VALID],
            [-1.0,          I::VALID],
            ["-1.0",        I::VALID],
            ["-001.0",      I::VALID],
            ["-1.0e2",      I::VALID],
            ["-1",          I::VALID],
            ["-001",        I::VALID],
            ["-1e2",        I::VALID],
            [-0,            I::VALID],
            ["-0",          I::VALID],
            ["-000",        I::VALID],
            [-0.0,          I::VALID],
            ["-0.0",        I::VALID],
            ["-000.000",    I::VALID],
            [false,         0],
            [true,          0],
            [INF,           0],
            [-INF,          0],
            [NAN,           0],
            [[],            0],
            ["some string", I::VALID],
            ["           ", I::VALID | I::WHITE],
            [new \StdClass, 0],
            [new StrClass(""),    I::VALID | I::EMPTY],
            [new StrClass("1"),   I::VALID],
            [new StrClass("0"),   I::VALID],
            [new StrClass("-1"),  I::VALID],
            [new StrClass("Msg"), I::VALID],
            [new StrClass("   "), I::VALID | I::WHITE],
        ];
        foreach ($tests as $test) {
            list($value, $exp) = $test;
            $this->assertSame($exp, I::str($value), "Test returned ".decbin(I::str($value))." for value: ".var_export($value, true));
        }
    }

    public function testValidateDatabaseIdentifier() {
        $tests = [
            [null,          false, true],
            ["",            false, true],
            [1,             true,  true],
            [PHP_INT_MAX,   true,  true],
            [1.0,           true,  true],
            ["1.0",         true,  true],
            ["001.0",       true,  true],
            ["1.0e2",       true,  true],
            ["1",           true,  true],
            ["001",         true,  true],
            ["1e2",         true,  true],
            ["+1.0",        true,  true],
            ["+001.0",      true,  true],
            ["+1.0e2",      true,  true],
            ["+1",          true,  true],
            ["+001",        true,  true],
            ["+1e2",        true,  true],
            [0,             false, true],
            ["0",           false, true],
            ["000",         false, true],
            [0.0,           false, true],
            ["0.0",         false, true],
            ["000.000",     false, true],
            ["+0",          false, true],
            ["+000",        false, true],
            ["+0.0",        false, true],
            ["+000.000",    false, true],
            [-1,            false, false],
            [-1.0,          false, false],
            ["-1.0",        false, false],
            ["-001.0",      false, false],
            ["-1.0e2",      false, false],
            ["-1",          false, false],
            ["-001",        false, false],
            ["-1e2",        false, false],
            [-0,            false, true],
            ["-0",          false, true],
            ["-000",        false, true],
            [-0.0,          false, true],
            ["-0.0",        false, true],
            ["-000.000",    false, true],
            [false,         false, false],
            [true,          false, false],
            [INF,           false, false],
            [-INF,          false, false],
            [NAN,           false, false],
            [[],            false, false],
            ["some string", false, false],
            ["           ", false, false],
            [new \StdClass, false, false],
            [new StrClass(""),    false, true],
            [new StrClass("1"),   true,  true],
            [new StrClass("0"),   false, true],
            [new StrClass("-1"),  false, false],
            [new StrClass("Msg"), false, false],
            [new StrClass("   "), false, false],
        ];
        foreach ($tests as $test) {
            list($value, $exp, $expNull) = $test;
            $this->assertSame($exp, I::id($value), "Non-null test failed for value: ".var_export($value, true));
            $this->assertSame($expNull, I::id($value, true), "Null test failed for value: ".var_export($value, true));
        }
    }
}