algorithm: import searching publically
This commit is contained in:
97
tests/tanya/algorithm/tests/comparison.d
Normal file
97
tests/tanya/algorithm/tests/comparison.d
Normal file
@ -0,0 +1,97 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
module tanya.algorithm.tests.comparison;
|
||||
|
||||
import tanya.algorithm.comparison;
|
||||
import tanya.math;
|
||||
import tanya.range;
|
||||
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
static assert(!is(typeof(min(1, 1UL))));
|
||||
}
|
||||
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
assert(min(5, 3) == 3);
|
||||
assert(min(4, 4) == 4);
|
||||
assert(min(5.2, 3.0) == 3.0);
|
||||
|
||||
assert(min(5.2, double.nan) == 5.2);
|
||||
assert(min(double.nan, 3.0) == 3.0);
|
||||
assert(isNaN(min(double.nan, double.nan)));
|
||||
}
|
||||
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
assert(min(cast(ubyte[]) []).empty);
|
||||
}
|
||||
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
static assert(!is(typeof(max(1, 1UL))));
|
||||
}
|
||||
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
assert(max(5, 3) == 5);
|
||||
assert(max(4, 4) == 4);
|
||||
assert(max(5.2, 3.0) == 5.2);
|
||||
|
||||
assert(max(5.2, double.nan) == 5.2);
|
||||
assert(max(double.nan, 3.0) == 3.0);
|
||||
assert(isNaN(max(double.nan, double.nan)));
|
||||
}
|
||||
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
assert(max(cast(ubyte[]) []).empty);
|
||||
}
|
||||
|
||||
// min/max compare const and mutable structs.
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
static struct S
|
||||
{
|
||||
int s;
|
||||
|
||||
int opCmp(typeof(this) that) const @nogc nothrow pure @safe
|
||||
{
|
||||
return this.s - that.s;
|
||||
}
|
||||
}
|
||||
{
|
||||
const s1 = S(1);
|
||||
assert(min(s1, S(2)).s == 1);
|
||||
assert(max(s1, S(2)).s == 2);
|
||||
}
|
||||
{
|
||||
auto s2 = S(2), s3 = S(3);
|
||||
assert(min(s2, s3).s == 2);
|
||||
assert(max(s2, s3).s == 3);
|
||||
}
|
||||
}
|
||||
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
static struct OpCmp(int value)
|
||||
{
|
||||
int opCmp(OpCmp) @nogc nothrow pure @safe
|
||||
{
|
||||
return value;
|
||||
}
|
||||
}
|
||||
{
|
||||
OpCmp!(-1)[1] range;
|
||||
assert(compare(range[], range[]) < 0);
|
||||
}
|
||||
{
|
||||
OpCmp!1[1] range;
|
||||
assert(compare(range[], range[]) > 0);
|
||||
}
|
||||
{
|
||||
OpCmp!0[1] range;
|
||||
assert(compare(range[], range[]) == 0);
|
||||
}
|
||||
}
|
127
tests/tanya/algorithm/tests/iteration.d
Normal file
127
tests/tanya/algorithm/tests/iteration.d
Normal file
@ -0,0 +1,127 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
module tanya.algorithm.tests.iteration;
|
||||
|
||||
import tanya.algorithm.iteration;
|
||||
import tanya.range;
|
||||
import tanya.test.stub;
|
||||
|
||||
// length is unknown when taking from a range without length
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
static struct R
|
||||
{
|
||||
mixin InputRangeStub;
|
||||
}
|
||||
auto actual = take(R(), 100);
|
||||
|
||||
static assert(!hasLength!(typeof(actual)));
|
||||
}
|
||||
|
||||
// Takes minimum length if the range length > n
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
auto range = take(cast(int[]) null, 8);
|
||||
assert(range.length == 0);
|
||||
}
|
||||
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
const int[9] range = [1, 2, 3, 4, 5, 6, 7, 8, 9];
|
||||
{
|
||||
auto slice = take(range[], 8)[1 .. 3];
|
||||
|
||||
assert(slice.length == 2);
|
||||
assert(slice.front == 2);
|
||||
assert(slice.back == 3);
|
||||
}
|
||||
{
|
||||
auto slice = takeExactly(range[], 8)[1 .. 3];
|
||||
|
||||
assert(slice.length == 2);
|
||||
assert(slice.front == 2);
|
||||
assert(slice.back == 3);
|
||||
}
|
||||
}
|
||||
|
||||
// Elements are accessible in reverse order
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
const int[3] given = [1, 2, 3];
|
||||
auto actual = retro(given[]);
|
||||
|
||||
assert(actual.back == given[].front);
|
||||
assert(actual[0] == 3);
|
||||
assert(actual[2] == 1);
|
||||
|
||||
actual.popBack();
|
||||
assert(actual.back == 2);
|
||||
assert(actual[1] == 2);
|
||||
|
||||
// Check slicing.
|
||||
auto slice = retro(given[])[1 .. $];
|
||||
assert(slice.length == 2 && slice.front == 2 && slice.back == 1);
|
||||
}
|
||||
|
||||
// Elements can be assigned
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
int[4] given = [1, 2, 3, 4];
|
||||
auto actual = retro(given[]);
|
||||
|
||||
actual.front = 5;
|
||||
assert(given[].back == 5);
|
||||
|
||||
actual.back = 8;
|
||||
assert(given[].front == 8);
|
||||
|
||||
actual[2] = 10;
|
||||
assert(given[1] == 10);
|
||||
}
|
||||
|
||||
// Singleton range is bidirectional and random-access
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
static assert(isBidirectionalRange!(typeof(singleton('a'))));
|
||||
static assert(isRandomAccessRange!(typeof(singleton('a'))));
|
||||
|
||||
assert({ char a; return isBidirectionalRange!(typeof(singleton(a))); });
|
||||
assert({ char a; return isRandomAccessRange!(typeof(singleton(a))); });
|
||||
}
|
||||
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
char a = 'a';
|
||||
auto single = singleton(a);
|
||||
|
||||
assert(single.front == 'a');
|
||||
assert(single.back == 'a');
|
||||
assert(single[0] == 'a');
|
||||
assert(single.length == 1);
|
||||
assert(!single.empty);
|
||||
}
|
||||
|
||||
// popFront makes SingletonByRef empty
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
char a = 'a';
|
||||
auto single = singleton(a);
|
||||
|
||||
single.popFront();
|
||||
assert(single.empty);
|
||||
assert(single.length == 0);
|
||||
assert(single.empty);
|
||||
}
|
||||
|
||||
// popBack makes SingletonByRef empty
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
char a = 'b';
|
||||
auto single = singleton(a);
|
||||
|
||||
single.popBack();
|
||||
assert(single.empty);
|
||||
assert(single.length == 0);
|
||||
assert(single.empty);
|
||||
}
|
128
tests/tanya/algorithm/tests/mutation.d
Normal file
128
tests/tanya/algorithm/tests/mutation.d
Normal file
@ -0,0 +1,128 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
module tanya.algorithm.tests.mutation;
|
||||
|
||||
import tanya.algorithm.mutation;
|
||||
import tanya.range;
|
||||
import tanya.test.stub;
|
||||
|
||||
// Returns advanced target
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
int[5] input = [1, 2, 3, 4, 5];
|
||||
assert(copy(input[3 .. 5], input[]).front == 3);
|
||||
}
|
||||
|
||||
// Copies overlapping arrays
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
import tanya.algorithm.comparison : equal;
|
||||
|
||||
int[6] actual = [1, 2, 3, 4, 5, 6];
|
||||
const int[6] expected = [1, 2, 1, 2, 3, 4];
|
||||
|
||||
copy(actual[0 .. 4], actual[2 .. 6]);
|
||||
assert(equal(actual[], expected[]));
|
||||
}
|
||||
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
static assert(is(typeof(copy((ubyte[]).init, (ushort[]).init))));
|
||||
static assert(!is(typeof(copy((ushort[]).init, (ubyte[]).init))));
|
||||
}
|
||||
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
static struct OutPutRange
|
||||
{
|
||||
int value;
|
||||
|
||||
void opCall(int value) @nogc nothrow pure @safe
|
||||
in (this.value == 0)
|
||||
{
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
int[1] source = [5];
|
||||
OutPutRange target;
|
||||
|
||||
assert(copy(source[], target).value == 5);
|
||||
}
|
||||
|
||||
// [] is called where possible
|
||||
@nogc nothrow pure @system unittest
|
||||
{
|
||||
static struct Slice
|
||||
{
|
||||
bool* slicingCalled;
|
||||
|
||||
int front() @nogc nothrow pure @safe
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void front(int) @nogc nothrow pure @safe
|
||||
{
|
||||
}
|
||||
|
||||
void popFront() @nogc nothrow pure @safe
|
||||
{
|
||||
}
|
||||
|
||||
bool empty() @nogc nothrow pure @safe
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void opIndexAssign(int) @nogc nothrow pure @safe
|
||||
{
|
||||
*this.slicingCalled = true;
|
||||
}
|
||||
}
|
||||
bool slicingCalled;
|
||||
auto range = Slice(&slicingCalled);
|
||||
fill(range, 0);
|
||||
assert(slicingCalled);
|
||||
}
|
||||
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
NonCopyable[] nonCopyable;
|
||||
initializeAll(nonCopyable);
|
||||
}
|
||||
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
import tanya.algorithm.comparison : equal;
|
||||
|
||||
const int[5] expected = [1, 2, 3, 4, 5];
|
||||
int[5] actual = [4, 5, 1, 2, 3];
|
||||
|
||||
rotate(actual[0 .. 2], actual[2 .. $]);
|
||||
assert(equal(actual[], expected[]));
|
||||
}
|
||||
|
||||
// Doesn't cause an infinite loop if back is shorter than the front
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
import tanya.algorithm.comparison : equal;
|
||||
|
||||
const int[5] expected = [1, 2, 3, 4, 5];
|
||||
int[5] actual = [3, 4, 5, 1, 2];
|
||||
|
||||
rotate(actual[0 .. 3], actual[3 .. $]);
|
||||
assert(equal(actual[], expected[]));
|
||||
}
|
||||
|
||||
// Doesn't call .front on an empty front
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
import tanya.algorithm.comparison : equal;
|
||||
|
||||
const int[2] expected = [2, 8];
|
||||
int[2] actual = expected;
|
||||
|
||||
rotate(actual[0 .. 0], actual[]);
|
||||
assert(equal(actual[], expected[]));
|
||||
}
|
17
tests/tanya/algorithm/tests/searching.d
Normal file
17
tests/tanya/algorithm/tests/searching.d
Normal file
@ -0,0 +1,17 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
module tanya.algorithm.tests.searching;
|
||||
|
||||
import tanya.algorithm.searching;
|
||||
import tanya.test.stub;
|
||||
|
||||
@nogc nothrow pure @safe unittest
|
||||
{
|
||||
@Count(3)
|
||||
static struct Range
|
||||
{
|
||||
mixin InputRangeStub!int;
|
||||
}
|
||||
assert(count(Range()) == 3);
|
||||
}
|
Reference in New Issue
Block a user