summaryrefslogtreecommitdiff
path: root/jstests/aggregation/bugs/substr.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/aggregation/bugs/substr.js')
-rw-r--r--jstests/aggregation/bugs/substr.js149
1 files changed, 76 insertions, 73 deletions
diff --git a/jstests/aggregation/bugs/substr.js b/jstests/aggregation/bugs/substr.js
index 0d4eb72e691..4aee531dd67 100644
--- a/jstests/aggregation/bugs/substr.js
+++ b/jstests/aggregation/bugs/substr.js
@@ -3,115 +3,118 @@
t = db.jstests_aggregation_substr;
t.drop();
-t.save( {} );
+t.save({});
-function assertSubstring( expected, str, offset, len ) {
- assert.eq( expected,
- t.aggregate( { $project:{ a:{ $substr:[ str, offset, len ] } } } ).toArray()[ 0 ].a );
+function assertSubstring(expected, str, offset, len) {
+ assert.eq(expected, t.aggregate({$project: {a: {$substr: [str, offset, len]}}}).toArray()[0].a);
}
-function assertArgsException( args ) {
+function assertArgsException(args) {
assert.commandFailed(t.runCommand('aggregate', {pipeline: [{$substr: args}]}));
}
-function assertException( str, offset, len ) {
+function assertException(str, offset, len) {
assertArgsException([str, offset, len]);
}
// Wrong number of arguments.
-assertArgsException( [] );
-assertArgsException( [ 'foo' ] );
-assertArgsException( [ 'foo', 1 ] );
-assertArgsException( [ 'foo', 1, 1, 1 ] );
+assertArgsException([]);
+assertArgsException(['foo']);
+assertArgsException(['foo', 1]);
+assertArgsException(['foo', 1, 1, 1]);
// Basic offset / length checks.
-assertSubstring( 'abcd', 'abcd', 0, 4 );
-assertSubstring( 'abcd', 'abcd', 0, 5 );
-assertSubstring( '', 'abcd', -1 /* unsigned */, 4 );
-assertSubstring( 'a', 'abcd', 0, 1 );
-assertSubstring( 'ab', 'abcd', 0, 2 );
-assertSubstring( 'b', 'abcd', 1, 1 );
-assertSubstring( 'd', 'abcd', 3, 1 );
-assertSubstring( '', 'abcd', 4, 1 );
-assertSubstring( '', 'abcd', 3, 0 );
-assertSubstring( 'cd', 'abcd', 2, -1 /* unsigned */ );
+assertSubstring('abcd', 'abcd', 0, 4);
+assertSubstring('abcd', 'abcd', 0, 5);
+assertSubstring('', 'abcd', -1 /* unsigned */, 4);
+assertSubstring('a', 'abcd', 0, 1);
+assertSubstring('ab', 'abcd', 0, 2);
+assertSubstring('b', 'abcd', 1, 1);
+assertSubstring('d', 'abcd', 3, 1);
+assertSubstring('', 'abcd', 4, 1);
+assertSubstring('', 'abcd', 3, 0);
+assertSubstring('cd', 'abcd', 2, -1 /* unsigned */);
// See server6186.js for additional offset / length checks.
// Additional numeric types for offset / length.
-assertSubstring( 'bc', 'abcd', 1, 2 );
-assertSubstring( 'bc', 'abcd', 1.0, 2.0 );
-assertSubstring( 'bc', 'abcd', NumberInt( 1 ), NumberInt( 2 ) );
-assertSubstring( 'bc', 'abcd', NumberLong( 1 ), NumberLong( 2 ) );
-assertSubstring( 'bc', 'abcd', NumberInt( 1 ), NumberLong( 2 ) );
-assertSubstring( 'bc', 'abcd', NumberLong( 1 ), NumberInt( 2 ) );
+assertSubstring('bc', 'abcd', 1, 2);
+assertSubstring('bc', 'abcd', 1.0, 2.0);
+assertSubstring('bc', 'abcd', NumberInt(1), NumberInt(2));
+assertSubstring('bc', 'abcd', NumberLong(1), NumberLong(2));
+assertSubstring('bc', 'abcd', NumberInt(1), NumberLong(2));
+assertSubstring('bc', 'abcd', NumberLong(1), NumberInt(2));
// Integer component is used.
-assertSubstring( 'bc', 'abcd', 1.2, 2.2 );
-assertSubstring( 'bc', 'abcd', 1.9, 2.9 );
+assertSubstring('bc', 'abcd', 1.2, 2.2);
+assertSubstring('bc', 'abcd', 1.9, 2.9);
// Non numeric types for offset / length.
-assertException( 'abcd', false, 2 );
-assertException( 'abcd', 1, true );
-assertException( 'abcd', 'q', 2 );
-assertException( 'abcd', 1, 'r' );
-assertException( 'abcd', null, 3 );
-assertException( 'abcd', 1, undefined );
+assertException('abcd', false, 2);
+assertException('abcd', 1, true);
+assertException('abcd', 'q', 2);
+assertException('abcd', 1, 'r');
+assertException('abcd', null, 3);
+assertException('abcd', 1, undefined);
// String coercion.
-assertSubstring( '123', 123, 0, 3 );
-assertSubstring( '2', 123, 1, 1 );
-assertSubstring( '1970', new Date( 0 ), 0, 4 );
-assertSubstring( '', null, 0, 4 );
-assertException( /abc/, 0, 4 );
+assertSubstring('123', 123, 0, 3);
+assertSubstring('2', 123, 1, 1);
+assertSubstring('1970', new Date(0), 0, 4);
+assertSubstring('', null, 0, 4);
+assertException(/abc/, 0, 4);
// Field path like string.
-assertSubstring( '$a', 'a$a', 1, 2 );
+assertSubstring('$a', 'a$a', 1, 2);
// Multi byte utf-8.
-assertSubstring( '\u0080', '\u0080', 0, 2 );
+assertSubstring('\u0080', '\u0080', 0, 2);
-assertException( '\u0080', 0, 1 );
-assertException( '\u0080', 1, 1 );
+assertException('\u0080', 0, 1);
+assertException('\u0080', 1, 1);
-assertSubstring( '\u0080', '\u0080\u20ac', 0, 2 );
-assertSubstring( '\u20ac', '\u0080\u20ac', 2, 3 );
+assertSubstring('\u0080', '\u0080\u20ac', 0, 2);
+assertSubstring('\u20ac', '\u0080\u20ac', 2, 3);
-assertException( '\u0080\u20ac', 1, 3 );
-assertException( '\u0080\u20ac', 1, 4 );
-assertException( '\u0080\u20ac', 0, 3 );
+assertException('\u0080\u20ac', 1, 3);
+assertException('\u0080\u20ac', 1, 4);
+assertException('\u0080\u20ac', 0, 3);
-assertSubstring( '\u0044\u20ac', '\u0080\u0044\u20ac', 2, 4 );
-assertSubstring( '\u0044', '\u0080\u0044\u20ac', 2, 1 );
+assertSubstring('\u0044\u20ac', '\u0080\u0044\u20ac', 2, 4);
+assertSubstring('\u0044', '\u0080\u0044\u20ac', 2, 1);
// The four byte utf-8 character 𝌆 (have to represent in surrogate halves).
-assertSubstring( '\uD834\uDF06', '\uD834\uDF06', 0, 4 );
+assertSubstring('\uD834\uDF06', '\uD834\uDF06', 0, 4);
-assertException( '\uD834\uDF06', '\uD834\uDF06', 1, 4 );
-assertException( '\uD834\uDF06', '\uD834\uDF06', 0, 3 );
+assertException('\uD834\uDF06', '\uD834\uDF06', 1, 4);
+assertException('\uD834\uDF06', '\uD834\uDF06', 0, 3);
// Operands from document.
t.drop();
-t.save( { x:'a', y:'abc', z:'abcde', a:0, b:1, c:2, d:3, e:4, f:5 } );
-assertSubstring( 'a', '$x', '$a', '$b' );
-assertSubstring( 'a', '$x', '$a', '$f' );
-assertSubstring( 'b', '$y', '$b', '$b' );
-assertSubstring( 'b', '$z', '$b', '$b' );
-assertSubstring( 'bcd', '$z', '$b', '$d' );
-assertSubstring( 'cde', '$z', '$c', '$f' );
-assertSubstring( 'c', '$y', '$c', '$f' );
+t.save({x: 'a', y: 'abc', z: 'abcde', a: 0, b: 1, c: 2, d: 3, e: 4, f: 5});
+assertSubstring('a', '$x', '$a', '$b');
+assertSubstring('a', '$x', '$a', '$f');
+assertSubstring('b', '$y', '$b', '$b');
+assertSubstring('b', '$z', '$b', '$b');
+assertSubstring('bcd', '$z', '$b', '$d');
+assertSubstring('cde', '$z', '$c', '$f');
+assertSubstring('c', '$y', '$c', '$f');
// Computed operands.
-assertSubstring( 'cde', '$z', { $add:[ '$b', '$b' ] }, { $add:[ '$c', '$d' ] } );
-assertSubstring( 'cde', '$z', { $add:[ '$b', 1 ] }, { $add:[ 2, '$d' ] } );
+assertSubstring('cde', '$z', {$add: ['$b', '$b']}, {$add: ['$c', '$d']});
+assertSubstring('cde', '$z', {$add: ['$b', 1]}, {$add: [2, '$d']});
// Nested.
-assert.eq( 'e',
- t.aggregate( { $project:{ a:
- { $substr:
- [ { $substr:
- [ { $substr:
- [ { $substr:[ 'abcdefghij', 1, 6 ]
- }, 2, 5 ]
- }, 0, 3 ]
- }, 1, 1 ]
- } } } ).toArray()[ 0 ].a );
+assert.eq('e',
+ t.aggregate({
+ $project: {
+ a: {
+ $substr: [
+ {$substr: [{$substr: [{$substr: ['abcdefghij', 1, 6]}, 2, 5]}, 0, 3]},
+ 1,
+ 1
+ ]
+ }
+ }
+ })
+ .toArray()[0]
+ .a);