mongo/jstests/aggregation/expressions/strcasecmp.js

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");