<?php

class ParsingTest extends PHPUnit_Framework_TestCase
{
    public function test_extract_plural_forms_header_from_po_header()
    {
        $parser = new gettext_reader(null);
        // It defaults to a "Western-style" plural header.
        $this->assertEquals(
            'nplurals=2; plural=n == 1 ? 0 : 1;',
            $parser->extract_plural_forms_header_from_po_header('')
        );

        // Extracting it from the middle of the header works.
        $this->assertEquals(
            'nplurals=1; plural=0;',
            $parser->extract_plural_forms_header_from_po_header(
                "Content-type: text/html; charset=UTF-8\n"
        ."Plural-Forms: nplurals=1; plural=0;\n"
        ."Last-Translator: nobody\n"
            )
        );

        // It's also case-insensitive.
        $this->assertEquals(
            'nplurals=1; plural=0;',
            $parser->extract_plural_forms_header_from_po_header(
                "PLURAL-forms: nplurals=1; plural=0;\n"
            )
        );

        // It falls back to default if it's not on a separate line.
        $this->assertEquals(
            'nplurals=2; plural=n == 1 ? 0 : 1;',
            $parser->extract_plural_forms_header_from_po_header(
                'Content-type: text/html; charset=UTF-8' // note the missing \n here
."Plural-Forms: nplurals=1; plural=0;\n"
        ."Last-Translator: nobody\n"
            )
        );
    }

    /**
     * @expectedException InvalidArgumentException
     */
    public function test_select_string_disallows_nonint_numbers()
    {
        $pofile_data = ''
      ."msgid \"\"\n"
      ."msgstr \"\"\n"
      ."\"Content-Type: text/plain; charset=utf-8\\n\"\n"
      ."\"Plural-Forms: nplurals=2; plural= n == 1 ? 0 : 1;\\n\"\n";
        $mofile = tempnam(sys_get_temp_dir(), 'pg');
        $msgfmt = popen("msgfmt -o $mofile -", 'w');
        fwrite($msgfmt, $pofile_data);
        pclose($msgfmt);

        $modata = new CachedFileReader($mofile);
        unlink($mofile);
        $parser = new gettext_reader($modata);
        // It defaults to a "Western-style" plural header.
        $this->assertEquals(
            'nplurals=2; plural=n == 1 ? 0 : 1;',
            $parser->extract_plural_forms_header_from_po_header('')
        );

        $new_tempfile = tempnam(sys_get_temp_dir(), 'pg');
        $parser->select_string(
            "(file_put_contents('$new_tempfile', 'boom'))"
        );

        $this->assertEquals('', file_get_contents($new_tempfile));
        unlink($new_tempfile);
    }

    /**
     * @dataProvider data_provider_test_npgettext
     */
    public function test_npgettext($number, $expected)
    {
        $parser = new gettext_reader(null);
        $result = $parser->npgettext(
            'context',
            "%d pig went to the market\n",
            "%d pigs went to the market\n",
            $number
        );
        $this->assertSame($expected, $result);
    }

    public static function data_provider_test_npgettext()
    {
        return [
            [1, "%d pig went to the market\n"],
            [2, "%d pigs went to the market\n"],
        ];
    }
}
