'use strict';

require('../auto');

var test = require('tape');
var forEach = require('for-each');

var shims = require('..');

forEach(shims, function (shim) {
	var shimTests;
	try {
		shimTests = require('./' + shim); // eslint-disable-line global-require, import/no-dynamic-require
	} catch (e) {
		test(shim + ': shimmed', { todo: true });
	}
	if (shimTests) {
		shimTests.shimmed();
	}
});

test('integration', function (t) {
	var seenMapEveryMap = [];
	var seenMapEveryEvery = [];
	var mapEveryResult = Iterator.from([1, 2, 3, 4, 5]).map(function (x) {
		seenMapEveryMap.push(x);
		return x * x;
	}).every(function (x) {
		seenMapEveryEvery.push(x);
		return x < 10;
	});
	t.equal(mapEveryResult, false, 'map + every: every predicate returned false nonzero times');
	t.deepEqual(seenMapEveryMap, [1, 2, 3, 4], 'map + every, map: all values are seen until after the first one that is > 10 when squared');
	t.deepEqual(seenMapEveryEvery, [1, 4, 9, 16], 'map + every, every: all values are seen until after the first one that is > 10 when squared');

	var seenMapSomeMap = [];
	var seenMapSomeSome = [];
	var mapSomeResult = Iterator.from([1, 2, 3, 4, 5]).map(function (x) {
		seenMapSomeMap.push(x);
		return x * x;
	}).some(function (x) {
		seenMapSomeSome.push(x);
		return x > 10;
	});
	t.equal(mapSomeResult, true, 'map + some: some predicate returned true nonzero times');
	t.deepEqual(seenMapSomeMap, [1, 2, 3, 4], 'map + some, map: all values are seen until after the first one that is > 10 when squared');
	t.deepEqual(seenMapSomeSome, [1, 4, 9, 16], 'map + some, some: all values are seen until after the first one that is > 10 when squared');

	var seenMapFind = [];
	var mapFindResult = Iterator.from([1, 2, 3, 4, 5]).map(function (x) {
		seenMapFind.push(x);
		return x * x;
	}).find(function (x) {
		return x > 10;
	});
	t.equal(mapFindResult, 16, 'map + find: find found the first mapped value over 10');
	t.deepEqual(seenMapFind, [1, 2, 3, 4], 'map + find: all values are seen until after the first one that is > 10 when squared');

	var seenFilterEvery = [];
	var filterEveryResult = Iterator.from([1, 2, 3, 4, 5]).filter(function (x) {
		seenFilterEvery.push(x);
		return x;
	}).every(function (x) {
		return x <= 3;
	});
	t.equal(filterEveryResult, false, 'filter + every: every predicate returned false nonzero times');
	t.deepEqual(seenMapFind, [1, 2, 3, 4], 'filter + every: all values are seen until after the first one that is > 10 when squared');

	t.end();
});
