<?php

require './test.php';
require '../src/TokenStream.php';
$tokenStream = new TokenStream("<?php\ndie();");
group('get', function () use($tokenStream) {
    test(streamEqual($tokenStream->get(1, 2), array(new Token(T_EXIT, 'die'), new Token(T_OPEN_ROUND, '('))), true, 'get(int, int)');
});
group('extract', function () use($tokenStream) {
    $tokenStream = clone $tokenStream;
    test(streamEqual($tokenStream->extract(1, 2), array(new Token(T_EXIT, 'die'), new Token(T_OPEN_ROUND, '('))), true, 'return value of extract(int, int)');
    test(streamEqual($tokenStream->get(0, count($tokenStream) - 1), array(new Token(T_OPEN_TAG, "<?php\n"), new Token(T_CLOSE_ROUND, ')'), new Token(T_SEMICOLON, ';'))), true, 'stream change of extract(int, int)');
    test(tokenEqual($tokenStream->extract(2), new Token(T_SEMICOLON, ';')), true, 'return value of extract(int)');
    test(streamEqual($tokenStream->get(0, count($tokenStream) - 1), array(new Token(T_OPEN_TAG, "<?php\n"), new Token(T_CLOSE_ROUND, ')'))), true, 'stream change of extract(int)');
});
group('append', function () use($tokenStream) {
    $tokenStream = clone $tokenStream;
    $tokenStream->append(array(new Token(T_WHITESPACE, "\n"), '{', '}', array(';')));
    test((string) $tokenStream, "<?php\ndie();\n{};", 'append token array');
    $tokenStream->append(';');
    test((string) $tokenStream, "<?php\ndie();\n{};;", 'append single token');
});
group('insert', function () use($tokenStream) {
    $tokenStream = clone $tokenStream;
    $tokenStream->insert(1, array('{', '}', array(';', new Token(T_WHITESPACE, "\n"))));
    test((string) $tokenStream, "<?php\n{};\ndie();", 'insert token array');
    $tokenStream->insert(4, ';');
    test((string) $tokenStream, "<?php\n{};;\ndie();", 'insert single token');
});
<?php

require './test.php';
require '../src/TokenStream.php';
group('empty stream', function () {
    $tokenStream = new TokenStream();
    test(count($tokenStream), 0, 'argumentless');
    $tokenStream = new TokenStream('');
    test(count($tokenStream), 0, 'empty string');
});
group('source', function () {
    test(streamEqual(new TokenStream("<?php\ndie();"), array(new Token(T_OPEN_TAG, "<?php\n"), new Token(T_EXIT, 'die'), new Token(T_OPEN_ROUND, '('), new Token(T_CLOSE_ROUND, ')'), new Token(T_SEMICOLON, ';'))), true, 'normal source');
    test(streamEqual(new TokenStream("<?php namespace\\A"), array(new Token(T_OPEN_TAG, "<?php "), new Token(T_NAMESPACE, 'namespace'), new Token(T_NS_SEPARATOR, '\\'), new Token(T_STRING, 'A'))), true, 'source with 5.3 tokens');
});