var concat = require('concat-stream');
var tap = require('tap');
var tape = require('../');

// Exploratory test to ascertain proper output when no t.comment() call
// is made.
tap.test('no comment', function (assert) {
    assert.plan(1);

    var verify = function (output) {
        assert.equal(output.toString('utf8'), [
            'TAP version 13',
            '# no comment',
            '',
            '1..0',
            '# tests 0',
            '# pass  0',
            '',
            '# ok',
            ''
        ].join('\n'));
    };

    var test = tape.createHarness();
    test.createStream().pipe(concat(verify));
    test('no comment', function (t) {
        t.end();
    });
});

// Exploratory test, can we call t.comment() passing nothing?
tap.test('missing argument', function (assert) {
    assert.plan(1);
    var test = tape.createHarness();
    test.createStream();
    test('missing argument', function (t) {
        try {
            t.comment();
            t.end();
        } catch (err) {
            assert.equal(err.constructor, TypeError);
        } finally {
            assert.end();
        }
    });
});

// Exploratory test, can we call t.comment() passing nothing?
tap.test('null argument', function (assert) {
    assert.plan(1);
    var test = tape.createHarness();
    test.createStream();
    test('null argument', function (t) {
        try {
            t.comment(null);
            t.end();
        } catch (err) {
            assert.equal(err.constructor, TypeError);
        } finally {
            assert.end();
        }
    });
});


// Exploratory test, how is whitespace treated?
tap.test('whitespace', function (assert) {
    assert.plan(1);

    var verify = function (output) {
        assert.equal(output.toString('utf8'), [
            'TAP version 13',
            '# whitespace',
            '# ',
            '# a',
            '# a',
            '# a',
            '',
            '1..0',
            '# tests 0',
            '# pass  0',
            '',
            '# ok',
            ''
        ].join('\n'));
    };

    var test = tape.createHarness();
    test.createStream().pipe(concat(verify));
    test('whitespace', function (t) {
        t.comment(' ');
        t.comment(' a');
        t.comment('a ');
        t.comment(' a ');
        t.end();
    });
});

// Exploratory test, how about passing types other than strings?
tap.test('non-string types', function (assert) {
    assert.plan(1);

    var verify = function (output) {
        assert.equal(output.toString('utf8'), [
            'TAP version 13',
            '# non-string types',
            '# true',
            '# false',
            '# 42',
            '# 6.66',
            '# [object Object]',
            '# [object Object]',
            '# [object Object]',
            '# function ConstructorFunction() {}',
            '',
            '1..0',
            '# tests 0',
            '# pass  0',
            '',
            '# ok',
            ''
        ].join('\n'));
    };

    var test = tape.createHarness();
    test.createStream().pipe(concat(verify));
    test('non-string types', function (t) {
        t.comment(true);
        t.comment(false);
        t.comment(42);
        t.comment(6.66);
        t.comment({});
        t.comment({"answer": 42});
        function ConstructorFunction() {}
        t.comment(new ConstructorFunction());
        t.comment(ConstructorFunction);
        t.end();
    });
});

tap.test('multiline string', function (assert) {
    assert.plan(1);

    var verify = function (output) {
        assert.equal(output.toString('utf8'), [
            'TAP version 13',
            '# multiline strings',
            '# a',
            '# b',
            '# c',
            '# d',
            '',
            '1..0',
            '# tests 0',
            '# pass  0',
            '',
            '# ok',
            ''
        ].join('\n'));
    };

    var test = tape.createHarness();
    test.createStream().pipe(concat(verify));
    test('multiline strings', function (t) {
        t.comment([
            'a',
            'b',
        ].join('\n'));
        t.comment([
            'c',
            'd',
        ].join('\r\n'));
        t.end();
    });
});