mirror of https://github.com/mongodb/mongo
71 lines
1.8 KiB
JavaScript
71 lines
1.8 KiB
JavaScript
// Aggregation $strcasecmp tests.
|
|
|
|
let t = db.jstests_aggregation_strcasecmp;
|
|
t.drop();
|
|
|
|
t.save({});
|
|
|
|
function cmp(a, b) {
|
|
return t.aggregate({$project: {a: {$cmp: [a, b]}}}).toArray()[0].a;
|
|
}
|
|
|
|
function strcasecmp(a, b) {
|
|
return t.aggregate({$project: {a: {$strcasecmp: [a, b]}}}).toArray()[0].a;
|
|
}
|
|
|
|
function assertException(args) {
|
|
assert.commandFailed(t.runCommand("aggregate", {pipeline: [{$project: {a: {$strcasecmp: args}}}]}));
|
|
}
|
|
|
|
function assertStrcasecmp(expected, a, b) {
|
|
assert.eq(expected, strcasecmp(a, b));
|
|
assert.eq(-expected, strcasecmp(b, a));
|
|
}
|
|
|
|
function assertBoth(expectedStrcasecmp, expectedCmp, a, b) {
|
|
assertStrcasecmp(expectedStrcasecmp, a, b);
|
|
assert.eq(expectedCmp, cmp(a, b));
|
|
assert.eq(-expectedCmp, cmp(b, a));
|
|
}
|
|
|
|
// Wrong number of arguments.
|
|
assertException([]);
|
|
assertException(["a"]);
|
|
assertException(["a", "b", "c"]);
|
|
|
|
// Basic tests.
|
|
assertBoth(0, 0, "", "");
|
|
assertBoth(0, 0, null, null);
|
|
assertBoth(-1, -1, "", "a");
|
|
assertBoth(0, -1, "A", "a");
|
|
assertBoth(1, -1, "Ab", "a");
|
|
assertBoth(0, -1, "Ab", "aB");
|
|
assertBoth(1, -1, "Bb", "aB");
|
|
assertBoth(-1, -1, "Bb", "cB");
|
|
assertBoth(1, -1, "aB", "aa");
|
|
assertBoth(-1, -1, "aB", "ac");
|
|
|
|
// With non alphabet characters.
|
|
assertBoth(0, -1, "A$_b1C?", "a$_b1C?");
|
|
assertBoth(1, -1, "ABC01234", "abc0123");
|
|
|
|
// String coercion.
|
|
assertStrcasecmp(0, "1", 1);
|
|
assertStrcasecmp(0, "1.23", 1.23);
|
|
assertStrcasecmp(0, "1970-01-01T00:00:00.000Z", new Date(0));
|
|
assertStrcasecmp(0, "1970-01-01t00:00:00.000Z", new Date(0));
|
|
assertException(["abc", /abc/]);
|
|
|
|
// Extended characters.
|
|
assertBoth(0, -1, "\u0080D\u20ac", "\u0080d\u20ac");
|
|
assertBoth(1, 1, "ó", "Ó"); // Not treated as equal currently.
|
|
|
|
// String coersion fails
|
|
assertException(["a", ["a"]]);
|
|
assertException(["a", new Map()]);
|
|
|
|
// String from field path.
|
|
t.drop();
|
|
t.save({x: "abc"});
|
|
assertBoth(0, 1, "$x", "ABC");
|