// RUN: %target-run-simple-swift // REQUIRES: executable_test import StdlibUnittest var SubstringTests = TestSuite("SubstringTests") func checkMatch(_ x: S, _ y: T, _ i: S.Index) where S.Index == T.Index, S.Iterator.Element == T.Iterator.Element, S.Iterator.Element: Equatable { expectEqual(x[i], y[i]) } SubstringTests.test("Equality") { let s = "abcdefg" let s1 = s[s.index(s.startIndex, offsetBy: 2) ..< s.index(s.startIndex, offsetBy: 4)] let s2 = s1[s1.startIndex..= s[...]) expectFalse(s > s[...]) expectFalse(s[...] < s) expectTrue(s[...] <= s) expectTrue(s[...] >= s) expectFalse(s[...] > s) expectFalse(s[...] < s[...]) expectTrue(s[...] <= s[...]) expectTrue(s[...] >= s[...]) expectFalse(s[...] > s[...]) expectTrue(s < s.dropFirst()) expectFalse(s > s.dropFirst()) expectFalse(s < s.dropLast()) expectTrue(s > s.dropLast()) expectTrue(s.dropFirst() < s.dropFirst(2)) expectFalse(s.dropFirst() > s.dropFirst(2)) expectFalse(s.dropLast() < s.dropLast(2)) expectTrue(s.dropLast() > s.dropLast(2)) expectFalse(s.dropFirst() < s.dropFirst().dropLast()) expectTrue(s.dropFirst() > s.dropFirst().dropLast()) expectTrue(s.dropFirst() > s) expectTrue(s.dropFirst() > s[...]) expectTrue(s >= s[...]) expectTrue(s.dropFirst() >= s.dropFirst()) // comparable conformance expectEqualSequence("pen,pineapple,apple,pen".split(separator: ",").sorted(), ["apple", "pen", "pen", "pineapple"]) } SubstringTests.test("CharacterView") { let s = "abcdefg" var t = s.characters.dropFirst(2) var u = t.dropFirst(2) checkMatch(s.characters, t, t.startIndex) checkMatch(s.characters, t, t.index(after: t.startIndex)) checkMatch(s.characters, t, t.index(before: t.endIndex)) checkMatch(s.characters, t, u.startIndex) checkMatch(t, u, u.startIndex) checkMatch(t, u, u.index(after: u.startIndex)) checkMatch(t, u, u.index(before: u.endIndex)) expectEqual("", String(t.dropFirst(10))) expectEqual("", String(t.dropLast(10))) expectEqual("", String(u.dropFirst(10))) expectEqual("", String(u.dropLast(10))) t.replaceSubrange(t.startIndex...t.startIndex, with: ["C"]) u.replaceSubrange(u.startIndex...u.startIndex, with: ["E"]) expectEqual(String(u), "Efg") expectEqual(String(t), "Cdefg") expectEqual(s, "abcdefg") } SubstringTests.test("UnicodeScalars") { let s = "abcdefg" var t = s.unicodeScalars.dropFirst(2) var u = t.dropFirst(2) checkMatch(s.unicodeScalars, t, t.startIndex) checkMatch(s.unicodeScalars, t, t.index(after: t.startIndex)) checkMatch(s.unicodeScalars, t, t.index(before: t.endIndex)) checkMatch(s.unicodeScalars, t, u.startIndex) checkMatch(t, u, u.startIndex) checkMatch(t, u, u.index(after: u.startIndex)) checkMatch(t, u, u.index(before: u.endIndex)) expectEqual("", String(t.dropFirst(10))) expectEqual("", String(t.dropLast(10))) expectEqual("", String(u.dropFirst(10))) expectEqual("", String(u.dropLast(10))) t.replaceSubrange(t.startIndex...t.startIndex, with: ["C"]) u.replaceSubrange(u.startIndex...u.startIndex, with: ["E"]) expectEqual(String(u), "Efg") expectEqual(String(t), "Cdefg") expectEqual(s, "abcdefg") } SubstringTests.test("UTF16View") { let s = "abcdefg" let t = s.utf16.dropFirst(2) let u = t.dropFirst(2) checkMatch(s.utf16, t, t.startIndex) checkMatch(s.utf16, t, t.index(after: t.startIndex)) checkMatch(s.utf16, t, t.index(before: t.endIndex)) checkMatch(s.utf16, t, u.startIndex) checkMatch(t, u, u.startIndex) checkMatch(t, u, u.index(after: u.startIndex)) checkMatch(t, u, u.index(before: u.endIndex)) expectEqual("", String(t.dropFirst(10))!) expectEqual("", String(t.dropLast(10))!) expectEqual("", String(u.dropFirst(10))!) expectEqual("", String(u.dropLast(10))!) } SubstringTests.test("UTF8View") { let s = "abcdefg" let t = s.utf8.dropFirst(2) let u = t.dropFirst(2) checkMatch(s.utf8, t, t.startIndex) checkMatch(s.utf8, t, t.index(after: t.startIndex)) checkMatch(s.utf8, t, u.startIndex) checkMatch(t, u, u.startIndex) checkMatch(t, u, u.index(after: u.startIndex)) expectEqual("", String(t.dropFirst(10))!) expectEqual("", String(t.dropLast(10))!) expectEqual("", String(u.dropFirst(10))!) expectEqual("", String(u.dropLast(10))!) } runAllTests()