'use strict';

var tap = require('tap');
var tape = require('../');
var forEach = require('for-each');
var through = require('through');

tap.test('object results', function (assert) {
    var printer = through({ objectMode: true });
    var objects = [];

    printer.write = function (obj) {
        objects.push(obj);
    };

    printer.end = function (obj) {
        if (obj) objects.push(obj);

        var todos = 0;
        var skips = 0;
        var testIds = [];
        var endIds = [];
        var asserts = 0;

        assert.equal(objects.length, 13);

        forEach(objects, function (obj) {
            if (obj.type === 'assert') {
                asserts++;
            } else if (obj.type === 'test') {
                testIds.push(obj.id);

                if (obj.skip) {
                    skips++;
                } else if (obj.todo) {
                    todos++;
                }
            } else if (obj.type === 'end') {
                endIds.push(obj.text);
                // test object should exist
                assert.notEqual(testIds.indexOf(obj.test), -1);
            }
        });

        assert.equal(asserts, 5);
        assert.equal(skips, 1);
        assert.equal(todos, 2);
        assert.equal(testIds.length, endIds.length);
        assert.end();
    };

    tape.createStream({ objectMode: true }).pipe(printer);

    tape('parent', function (t1) {
        t1.equal(true, true);
        t1.test('child1', {skip: true}, function (t2) {
            t2.equal(true, true);
            t2.equal(true, false);
            t2.end();
        });
        t1.test('child2', {todo: true}, function (t3) {
            t3.equal(true, false);
            t3.equal(true, true);
            t3.end();
        });
        t1.test('child3', {todo: true});
        t1.equal(true, true);
        t1.equal(true, true);
        t1.end();
    });
});
