| @safe @nogc unittest | |
| { | |
| import std.algorithm.comparison; | |
| assert(3.among(1, 42, 24, 3, 2)); | |
| if (auto pos = "bar".among("foo", "bar", "baz")) | |
| assert(pos == 2); | |
| else | |
| assert(false); | |
| // 42 is larger than 24 | |
| assert(42.among!((lhs, rhs) => lhs > rhs)(43, 24, 100) == 2); | |
| } | |
| @safe @nogc unittest | |
| { | |
| import std.algorithm.comparison; | |
| assert(3.among!(2, 3, 4)); | |
| assert("bar".among!("foo", "bar", "baz") == 2); | |
| } | |
| @system unittest | |
| { | |
| import std.algorithm.comparison; | |
| import std.algorithm.iteration : map; | |
| import std.format : format; | |
| class A | |
| { | |
| int a; | |
| this(int a) {this.a = a;} | |
| @property int i() { return a; } | |
| } | |
| interface I { } | |
| class B : I { } | |
| Object[] arr = [new A(1), new B(), null]; | |
| auto results = arr.map!(castSwitch!( | |
| (A a) => "A with a value of %d".format(a.a), | |
| (I i) => "derived from I", | |
| () => "null reference", | |
| ))(); | |
| // A is handled directly: | |
| assert(results[0] == "A with a value of 1"); | |
| // B has no handler - it is handled by the handler of I: | |
| assert(results[1] == "derived from I"); | |
| // null is handled by the null handler: | |
| assert(results[2] == "null reference"); | |
| } | |
| @system unittest | |
| { | |
| import std.algorithm.comparison; | |
| import std.exception : assertThrown; | |
| class A { } | |
| class B { } | |
| // Void handlers are allowed if they throw: | |
| assertThrown!Exception( | |
| new B().castSwitch!( | |
| (A a) => 1, | |
| (B d) { throw new Exception("B is not allowed!"); } | |
| )() | |
| ); | |
| // Void handlers are also allowed if all the handlers are void: | |
| new A().castSwitch!( | |
| (A a) { }, | |
| (B b) { assert(false); }, | |
| )(); | |
| } | |
| @safe @nogc unittest | |
| { | |
| import std.algorithm.comparison; | |
| assert(clamp(2, 1, 3) == 2); | |
| assert(clamp(0, 1, 3) == 1); | |
| assert(clamp(4, 1, 3) == 3); | |
| assert(clamp(1, 1, 1) == 1); | |
| assert(clamp(5, -1, 2u) == 2); | |
| auto x = clamp(42, uint.max, uint.max); | |
| static assert(is(typeof(x) == int)); | |
| assert(x == -1); | |
| } | |
| pure @safe unittest | |
| { | |
| import std.algorithm.comparison; | |
| int result; | |
| result = cmp("abc", "abc"); | |
| assert(result == 0); | |
| result = cmp("", ""); | |
| assert(result == 0); | |
| result = cmp("abc", "abcd"); | |
| assert(result < 0); | |
| result = cmp("abcd", "abc"); | |
| assert(result > 0); | |
| result = cmp("abc"d, "abd"); | |
| assert(result < 0); | |
| result = cmp("bbc", "abc"w); | |
| assert(result > 0); | |
| result = cmp("aaa", "aaaa"d); | |
| assert(result < 0); | |
| result = cmp("aaaa", "aaa"d); | |
| assert(result > 0); | |
| result = cmp("aaa", "aaa"d); | |
| assert(result == 0); | |
| result = cmp("aaa"d, "aaa"d); | |
| assert(result == 0); | |
| result = cmp(cast(int[])[], cast(int[])[]); | |
| assert(result == 0); | |
| result = cmp([1, 2, 3], [1, 2, 3]); | |
| assert(result == 0); | |
| result = cmp([1, 3, 2], [1, 2, 3]); | |
| assert(result > 0); | |
| result = cmp([1, 2, 3], [1L, 2, 3, 4]); | |
| assert(result < 0); | |
| result = cmp([1L, 2, 3], [1, 2]); | |
| assert(result > 0); | |
| } | |
| pure @safe unittest | |
| { | |
| import std.algorithm.comparison; | |
| int result; | |
| result = cmp!"a > b"("abc", "abc"); | |
| assert(result == 0); | |
| result = cmp!"a > b"("", ""); | |
| assert(result == 0); | |
| result = cmp!"a > b"("abc", "abcd"); | |
| assert(result < 0); | |
| result = cmp!"a > b"("abcd", "abc"); | |
| assert(result > 0); | |
| result = cmp!"a > b"("abc"d, "abd"); | |
| assert(result > 0); | |
| result = cmp!"a > b"("bbc", "abc"w); | |
| assert(result < 0); | |
| result = cmp!"a > b"("aaa", "aaaa"d); | |
| assert(result < 0); | |
| result = cmp!"a > b"("aaaa", "aaa"d); | |
| assert(result > 0); | |
| result = cmp!"a > b"("aaa", "aaa"d); | |
| assert(result == 0); | |
| result = cmp("aaa"d, "aaa"d); | |
| assert(result == 0); | |
| result = cmp!"a > b"(cast(int[])[], cast(int[])[]); | |
| assert(result == 0); | |
| result = cmp!"a > b"([1, 2, 3], [1, 2, 3]); | |
| assert(result == 0); | |
| result = cmp!"a > b"([1, 3, 2], [1, 2, 3]); | |
| assert(result < 0); | |
| result = cmp!"a > b"([1, 2, 3], [1L, 2, 3, 4]); | |
| assert(result < 0); | |
| result = cmp!"a > b"([1L, 2, 3], [1, 2]); | |
| assert(result > 0); | |
| } | |
| @safe @nogc unittest | |
| { | |
| import std.algorithm.comparison; | |
| import std.algorithm.comparison : equal; | |
| import std.math.operations : isClose; | |
| int[4] a = [ 1, 2, 4, 3 ]; | |
| assert(!equal(a[], a[1..$])); | |
| assert(equal(a[], a[])); | |
| assert(equal!((a, b) => a == b)(a[], a[])); | |
| // different types | |
| double[4] b = [ 1.0, 2, 4, 3]; | |
| assert(!equal(a[], b[1..$])); | |
| assert(equal(a[], b[])); | |
| // predicated: ensure that two vectors are approximately equal | |
| double[4] c = [ 1.0000000005, 2, 4, 3]; | |
| assert(equal!isClose(b[], c[])); | |
| } | |
| @safe unittest | |
| { | |
| import std.algorithm.comparison; | |
| import std.algorithm.comparison : equal; | |
| import std.range : iota, chunks; | |
| assert(equal!(equal!equal)( | |
| [[[0, 1], [2, 3]], [[4, 5], [6, 7]]], | |
| iota(0, 8).chunks(2).chunks(2) | |
| )); | |
| } | |
| @safe unittest | |
| { | |
| import std.algorithm.comparison; | |
| with(EditOp) | |
| { | |
| assert(levenshteinDistanceAndPath("foo", "foobar")[1] == [none, none, none, insert, insert, insert]); | |
| assert(levenshteinDistanceAndPath("banana", "fazan")[1] == [substitute, none, substitute, none, none, remove]); | |
| } | |
| } | |
| @safe unittest | |
| { | |
| import std.algorithm.comparison; | |
| import std.algorithm.iteration : filter; | |
| import std.uni : toUpper; | |
| assert(levenshteinDistance("cat", "rat") == 1); | |
| assert(levenshteinDistance("parks", "spark") == 2); | |
| assert(levenshteinDistance("abcde", "abcde") == 0); | |
| assert(levenshteinDistance("abcde", "abCde") == 1); | |
| assert(levenshteinDistance("kitten", "sitting") == 3); | |
| assert(levenshteinDistance!((a, b) => toUpper(a) == toUpper(b)) | |
| ("parks", "SPARK") == 2); | |
| assert(levenshteinDistance("parks".filter!"true", "spark".filter!"true") == 2); | |
| assert(levenshteinDistance("ID", "I♥D") == 1); | |
| } | |
| @safe unittest | |
| { | |
| import std.algorithm.comparison; | |
| string a = "Saturday", b = "Sundays"; | |
| auto p = levenshteinDistanceAndPath(a, b); | |
| assert(p[0] == 4); | |
| assert(equal(p[1], "nrrnsnnni")); | |
| } | |
| @safe @nogc unittest | |
| { | |
| import std.algorithm.comparison; | |
| int a = 5; | |
| short b = 6; | |
| double c = 2; | |
| auto d = max(a, b); | |
| assert(is(typeof(d) == int)); | |
| assert(d == 6); | |
| auto e = min(a, b, c); | |
| assert(is(typeof(e) == double)); | |
| assert(e == 2); | |
| } | |
| @safe @nogc unittest | |
| { | |
| import std.algorithm.comparison; | |
| int a = 5; | |
| short b = 6; | |
| double c = 2; | |
| auto d = min(a, b); | |
| static assert(is(typeof(d) == int)); | |
| assert(d == 5); | |
| auto e = min(a, b, c); | |
| static assert(is(typeof(e) == double)); | |
| assert(e == 2); | |
| ulong f = 0xffff_ffff_ffff; | |
| const uint g = min(f, 0xffff_0000); | |
| assert(g == 0xffff_0000); | |
| dchar h = 100; | |
| uint i = 101; | |
| static assert(is(typeof(min(h, i)) == dchar)); | |
| static assert(is(typeof(min(i, h)) == uint)); | |
| assert(min(h, i) == 100); | |
| } | |
| @safe @nogc unittest | |
| { | |
| import std.algorithm.comparison; | |
| int a = -10; | |
| uint f = 10; | |
| static assert(is(typeof(min(a, f)) == int)); | |
| assert(min(a, f) == -10); | |
| } | |
| @safe unittest | |
| { | |
| import std.algorithm.comparison; | |
| import std.datetime; | |
| assert(min(Date(2012, 12, 21), Date(1982, 1, 4)) == Date(1982, 1, 4)); | |
| assert(min(Date(1982, 1, 4), Date(2012, 12, 21)) == Date(1982, 1, 4)); | |
| assert(min(Date(1982, 1, 4), Date.min) == Date.min); | |
| assert(min(Date.min, Date(1982, 1, 4)) == Date.min); | |
| assert(min(Date(1982, 1, 4), Date.max) == Date(1982, 1, 4)); | |
| assert(min(Date.max, Date(1982, 1, 4)) == Date(1982, 1, 4)); | |
| assert(min(Date.min, Date.max) == Date.min); | |
| assert(min(Date.max, Date.min) == Date.min); | |
| } | |
| @safe @nogc unittest | |
| { | |
| import std.algorithm.comparison; | |
| int[6] x = [ 1, 5, 2, 7, 4, 3 ]; | |
| double[6] y = [ 1.0, 5, 2, 7.3, 4, 8 ]; | |
| auto m = mismatch(x[], y[]); | |
| assert(m[0] == x[3 .. $]); | |
| assert(m[1] == y[3 .. $]); | |
| auto m2 = mismatch(x[], y[], x[], y[]); | |
| assert(m2[0] == x[3 .. $]); | |
| assert(m2[1] == y[3 .. $]); | |
| assert(m2[2] == x[3 .. $]); | |
| assert(m2[3] == y[3 .. $]); | |
| } | |
| @safe unittest | |
| { | |
| import std.algorithm.comparison; | |
| string res = 2.predSwitch!"a < b"( | |
| 1, "less than 1", | |
| 5, "less than 5", | |
| 10, "less than 10", | |
| "greater or equal to 10"); | |
| assert(res == "less than 5"); | |
| //The arguments are lazy, which allows us to use predSwitch to create | |
| //recursive functions: | |
| int factorial(int n) | |
| { | |
| return n.predSwitch!"a <= b"( | |
| -1, {throw new Exception("Can not calculate n! for n < 0");}(), | |
| 0, 1, // 0! = 1 | |
| n * factorial(n - 1) // n! = n * (n - 1)! for n >= 0 | |
| ); | |
| } | |
| assert(factorial(3) == 6); | |
| //Void return expressions are allowed if they always throw: | |
| import std.exception : assertThrown; | |
| assertThrown!Exception(factorial(-9)); | |
| } | |
| @safe nothrow pure unittest | |
| { | |
| import std.algorithm.comparison; | |
| assert(isSameLength([1, 2, 3], [4, 5, 6])); | |
| assert(isSameLength([1, 2, 3], [4, 5, 6], [7, 8, 9])); | |
| assert(isSameLength([0.3, 90.4, 23.7, 119.2], [42.6, 23.6, 95.5, 6.3])); | |
| assert(isSameLength("abc", "xyz")); | |
| assert(isSameLength("abc", "xyz", [1, 2, 3])); | |
| int[] a; | |
| int[] b; | |
| assert(isSameLength(a, b)); | |
| assert(isSameLength(a, b, a, a, b, b, b)); | |
| assert(!isSameLength([1, 2, 3], [4, 5])); | |
| assert(!isSameLength([1, 2, 3], [4, 5, 6], [7, 8])); | |
| assert(!isSameLength([0.3, 90.4, 23.7], [42.6, 23.6, 95.5, 6.3])); | |
| assert(!isSameLength("abcd", "xyz")); | |
| assert(!isSameLength("abcd", "xyz", "123")); | |
| assert(!isSameLength("abcd", "xyz", "1234")); | |
| } | |
| @safe pure unittest | |
| { | |
| import std.algorithm.comparison; | |
| import std.typecons : Yes; | |
| assert(isPermutation([1, 2, 3], [3, 2, 1])); | |
| assert(isPermutation([1.1, 2.3, 3.5], [2.3, 3.5, 1.1])); | |
| assert(isPermutation("abc", "bca")); | |
| assert(!isPermutation([1, 2], [3, 4])); | |
| assert(!isPermutation([1, 1, 2, 3], [1, 2, 2, 3])); | |
| assert(!isPermutation([1, 1], [1, 1, 1])); | |
| // Faster, but allocates GC handled memory | |
| assert(isPermutation!(Yes.allocateGC)([1.1, 2.3, 3.5], [2.3, 3.5, 1.1])); | |
| assert(!isPermutation!(Yes.allocateGC)([1, 2], [3, 4])); | |
| } | |
| @safe pure unittest | |
| { | |
| import std.algorithm.comparison; | |
| const a = 1; | |
| const b = 2; | |
| auto ab = either(a, b); | |
| static assert(is(typeof(ab) == const(int))); | |
| assert(ab == a); | |
| auto c = 2; | |
| const d = 3; | |
| auto cd = either!(a => a == 3)(c, d); // use predicate | |
| static assert(is(typeof(cd) == int)); | |
| assert(cd == d); | |
| auto e = 0; | |
| const f = 2; | |
| auto ef = either(e, f); | |
| static assert(is(typeof(ef) == int)); | |
| assert(ef == f); | |
| } | |
| @safe pure unittest | |
| { | |
| import std.algorithm.comparison; | |
| immutable p = 1; | |
| immutable q = 2; | |
| auto pq = either(p, q); | |
| static assert(is(typeof(pq) == immutable(int))); | |
| assert(pq == p); | |
| assert(either(3, 4) == 3); | |
| assert(either(0, 4) == 4); | |
| assert(either(0, 0) == 0); | |
| assert(either("", "a") == ""); | |
| } | |
| @safe pure unittest | |
| { | |
| import std.algorithm.comparison; | |
| string r = null; | |
| assert(either(r, "a") == "a"); | |
| assert(either("a", "") == "a"); | |
| immutable s = [1, 2]; | |
| assert(either(s, s) == s); | |
| assert(either([0, 1], [1, 2]) == [0, 1]); | |
| assert(either([0, 1], [1]) == [0, 1]); | |
| assert(either("a", "b") == "a"); | |
| static assert(!__traits(compiles, either(1, "a"))); | |
| static assert(!__traits(compiles, either(1.0, "a"))); | |
| static assert(!__traits(compiles, either('a', "a"))); | |
| } | |