// -*- swift -*-
// RUN: %target-run-simple-swiftgyb
// REQUIRES: executable_test

import SwiftPrivate
import StdlibUnittest
import StdlibCollectionUnittest

var CollectionTests = TestSuite("Collection")

%{
variations = [('', 'Sequence'), ('', 'Collection'), ('Bidirectional', 'Collection')]
}%

// Test collections using value types as elements.
% for (traversal, kind) in variations:
CollectionTests.add${traversal}${kind}Tests(
  make${kind}: { (elements: [OpaqueValue<Int>]) -> LazyFilter${traversal}${kind}<Minimal${traversal}${kind}<OpaqueValue<Int>>> in
    Minimal${traversal}${kind}(elements: elements).lazy.filter { _ in return true }
  },
  wrapValue: identity,
  extractValue: identity,
  make${kind}OfEquatable: { (elements: [MinimalEquatableValue]) -> LazyFilter${traversal}${kind}<Minimal${traversal}${kind}<MinimalEquatableValue>> in
    Minimal${traversal}${kind}(elements: elements).lazy.filter { _ in return true }
  },
  wrapValueIntoEquatable: identityEq,
  extractValueFromEquatable: identityEq
)
% end

// Test collections using reference types as elements.
% for (traversal, kind) in variations:
CollectionTests.add${traversal}${kind}Tests(
  make${kind}: { (elements: [LifetimeTracked]) -> LazyFilter${traversal}${kind}<Minimal${traversal}${kind}<LifetimeTracked>> in
    // FIXME: create a better sequence and filter
    Minimal${traversal}${kind}(elements: elements).lazy.filter { _ in return true }
  },
  wrapValue: { (element: OpaqueValue<Int>) in
    LifetimeTracked(element.value, identity: element.identity)
  },
  extractValue: { (element: LifetimeTracked) in
    OpaqueValue(element.value, identity: element.identity)
  },
  make${kind}OfEquatable: { (elements: [LifetimeTracked]) -> LazyFilter${traversal}${kind}<Minimal${traversal}${kind}<LifetimeTracked>> in
    // FIXME: create a better sequence and filter
    Minimal${traversal}${kind}(elements: elements).lazy.filter { _ in return true }
  },
  wrapValueIntoEquatable: { (element: MinimalEquatableValue) in
    LifetimeTracked(element.value, identity: element.identity)
  },
  extractValueFromEquatable: { (element: LifetimeTracked) in
    MinimalEquatableValue(element.value, identity: element.identity)
  }
)
% end

// Test collection instances and iterators.
% for (traversal, kind) in variations:
CollectionTests.test("LazyFilterCollection instances (${traversal}${kind})") {
  do {
    let expected : [String] = []
    let base = ["apple", "orange", "banana", "grapefruit", "lychee"]
% if kind == 'Sequence':
    checkSequence(
      expected,
      MinimalSequence(elements: base).lazy.filter { _ in return false })
% elif traversal == '' and kind == 'Collection':
    checkForwardCollection(
      expected,
      MinimalCollection(elements: base).lazy.filter { _ in return false },
      sameValue: { $0 == $1 })
% else:
    check${traversal}${kind}(
      expected,
      Minimal${traversal}${kind}(elements: base).lazy.filter { _ in return false },
      sameValue: { $0 == $1 })
% end
  }
  do {
    let expected = ["apple", "orange", "banana", "grapefruit", "lychee"]
    let base = ["apple", "orange", "banana", "grapefruit", "lychee"]
% if kind == 'Sequence':
    checkSequence(
      expected,
      MinimalSequence(elements: base).lazy.filter { _ in return true })
% elif traversal == '' and kind == 'Collection':
    checkForwardCollection(
      expected,
      MinimalCollection(elements: base).lazy.filter { _ in return true },
      sameValue: { $0 == $1 })
% else:
    check${traversal}${kind}(
      expected,
      Minimal${traversal}${kind}(elements: base).lazy.filter { _ in return true },
      sameValue: { $0 == $1 })
% end
  }
  do {
    let predicate: (Int) -> Bool = { $0 % 3 == 0 || $0 % 5 == 0 }

    let base = randArray(500)
    var expected : [Int] = []
    for element in base where predicate(element) {
      expected.append(element)
    }

% if kind == 'Sequence':
    checkSequence(
      expected,
      MinimalSequence(elements: base).lazy.filter(predicate))
% elif traversal == '' and kind == 'Collection':
    checkOneLevelOfForwardCollection(
      expected,
      MinimalCollection(elements: base).lazy.filter(predicate),
      sameValue: { $0 == $1 })
% else:
    checkOneLevelOf${traversal}${kind}(
      expected,
      Minimal${traversal}${kind}(elements: base).lazy.filter(predicate),
      sameValue: { $0 == $1 })
% end
  }
}
% end

runAllTests()
