// RUN: %empty-directory(%t)
// RUN: %empty-directory(%t/Inputs)
// RUN: %empty-directory(%t/rth)
// RUN: env PYTHONPATH=%S/Inputs %gyb < %s > %t/test_keypaths.swift
// RUN: env PYTHONPATH=%S/Inputs %gyb < %S/Inputs/keypaths.swift.gyb > %t/Inputs/keypaths.swift
// RUN: %rth --target-build-swift "%target-build-swift" --target-run "%target-run" --t "%t/rth" --S "%t" --s "%t/test_keypaths.swift" --lib-prefix "lib" --lib-suffix "%{target-shared-library-suffix}" --target-codesign "%target-codesign" --no-symbol-diff

// REQUIRES: executable_test

import keypaths
import StdlibUnittest

%{
from keypaths_gyb import testCases
}%

var tests = TestSuite("key path resilience")

% for (name, kind, before, after, addsAPI) in testCases:

%  if addsAPI:
#if BEFORE
%  end

%  if kind == "mutating" or kind == "nonmutating":

tests.test("AnEnum.${name}") {
  let fromModule = AnEnum.keyPath_${name}
  let formedLocally = \AnEnum.${name}

  expectEqual(fromModule, formedLocally)
}

%  elif kind == "stored":

%  else:
     %{ raise ValueError("improper test case kind") }%
%  end

%  if addsAPI:
#endif // BEFORE
%  end

% end

% for (name, kind, before, after, addsAPI) in testCases:

%  if addsAPI:
#if BEFORE
%  end

%  if kind == "mutating" or kind == "nonmutating" or kind == "stored":

tests.test("AStruct.${name}") {
  let fromModule = AStruct.keyPath_${name}
  let formedLocally = \AStruct.${name}

  expectEqual(fromModule, formedLocally)
}

%  else:
     %{ raise ValueError("improper test case kind") }%
%  end

%  if addsAPI:
#endif // BEFORE
%  end

% end

% for (name, kind, before, after, addsAPI) in testCases:

%  if addsAPI:
#if BEFORE
%  end

%  if kind == "nonmutating" or kind == "stored":

tests.test("AClass.${name}") {
  let fromModule = AClass.keyPath_${name}
  let formedLocally = \AClass.${name}

  expectEqual(fromModule, formedLocally)
}

tests.test("AFinalClass.${name}") {
  let fromModule = AFinalClass.keyPath_${name}
  let formedLocally = \AFinalClass.${name}

  expectEqual(fromModule, formedLocally)
}

%  elif kind == "mutating":

%  else:
     %{ raise ValueError("improper test case kind") }%
%  end

%  if addsAPI:
#endif
%  end

% end

runAllTests()
