mirror of https://github.com/mongodb/mongo
152 lines
4.5 KiB
JavaScript
152 lines
4.5 KiB
JavaScript
// $week returns a date's week of the year. Week zero is comprised of any dates before the first
|
|
// Sunday of the year. SERVER-6190
|
|
import "jstests/libs/query/sbe_assert_error_override.js";
|
|
|
|
import {assertErrorCode} from "jstests/aggregation/extras/utils.js";
|
|
|
|
let t = db.jstests_aggregation_server6190;
|
|
t.drop();
|
|
|
|
t.save({});
|
|
|
|
function week(date) {
|
|
return t.aggregate({$project: {a: {$week: date}}}, {$match: {a: {$type: 16 /* Int type expected */}}}).toArray()[0]
|
|
.a;
|
|
}
|
|
|
|
function assertWeek(expectedWeek, date) {
|
|
assert.eq(expectedWeek, week(date));
|
|
}
|
|
|
|
// Sun Jan 1 1984
|
|
assertWeek(1, new Date(Date.UTC(1984, 0, 1)));
|
|
// Mon Jan 2 1984
|
|
assertWeek(1, new Date(Date.UTC(1984, 0, 2)));
|
|
// Sat Jan 7 1984
|
|
assertWeek(1, new Date(Date.UTC(1984, 0, 7)));
|
|
// Sun Jan 8 1984
|
|
assertWeek(2, new Date(Date.UTC(1984, 0, 8)));
|
|
// Sat Feb 18 1984
|
|
assertWeek(7, new Date(Date.UTC(1984, 1, 18)));
|
|
// Sun Feb 19 1984
|
|
assertWeek(8, new Date(Date.UTC(1984, 1, 19)));
|
|
|
|
// Mon Jan 1 2007
|
|
assertWeek(0, new Date(Date.UTC(2007, 0, 1)));
|
|
// Tue Jan 2 2007
|
|
assertWeek(0, new Date(Date.UTC(2007, 0, 2)));
|
|
// Sat Jan 6 2007
|
|
assertWeek(0, new Date(Date.UTC(2007, 0, 6)));
|
|
// Sun Jan 7 2007
|
|
assertWeek(1, new Date(Date.UTC(2007, 0, 7)));
|
|
// Mon Jan 8 2007
|
|
assertWeek(1, new Date(Date.UTC(2007, 0, 8)));
|
|
// Sat Jan 13 2007
|
|
assertWeek(1, new Date(Date.UTC(2007, 0, 13)));
|
|
// Sun Jan 14 2007
|
|
assertWeek(2, new Date(Date.UTC(2007, 0, 14)));
|
|
// Sat Mar 3 2007
|
|
assertWeek(8, new Date(Date.UTC(2007, 2, 3)));
|
|
// Sun Mar 4 2007
|
|
assertWeek(9, new Date(Date.UTC(2007, 2, 4)));
|
|
|
|
// Tue Jan 1 2008
|
|
assertWeek(0, new Date(Date.UTC(2008, 0, 1)));
|
|
// Sat Jan 5 2008
|
|
assertWeek(0, new Date(Date.UTC(2008, 0, 5)));
|
|
// Sun Jan 6 2008
|
|
assertWeek(1, new Date(Date.UTC(2008, 0, 6)));
|
|
// Sat Apr 26 2008
|
|
assertWeek(16, new Date(Date.UTC(2008, 3, 26)));
|
|
// Sun Apr 27 2008
|
|
assertWeek(17, new Date(Date.UTC(2008, 3, 27)));
|
|
|
|
// Wed Jan 1 2003
|
|
assertWeek(0, new Date(Date.UTC(2003, 0, 1)));
|
|
// Sat Jan 4 2003
|
|
assertWeek(0, new Date(Date.UTC(2003, 0, 4)));
|
|
// Sun Jan 5 2003
|
|
assertWeek(1, new Date(Date.UTC(2003, 0, 5)));
|
|
// Sat Dec 27 2003
|
|
assertWeek(51, new Date(Date.UTC(2003, 11, 27)));
|
|
// Sat Dec 28 2003
|
|
assertWeek(52, new Date(Date.UTC(2003, 11, 28)));
|
|
|
|
// Thu Jan 1 2009
|
|
assertWeek(0, new Date(Date.UTC(2009, 0, 1)));
|
|
// Sat Jan 3 2009
|
|
assertWeek(0, new Date(Date.UTC(2009, 0, 3)));
|
|
// Sun Jan 4 2008
|
|
assertWeek(1, new Date(Date.UTC(2009, 0, 4)));
|
|
// Sat Oct 31 2009
|
|
assertWeek(43, new Date(Date.UTC(2009, 9, 31)));
|
|
// Sun Nov 1 2008
|
|
assertWeek(44, new Date(Date.UTC(2009, 10, 1)));
|
|
|
|
// Fri Jan 1 2010
|
|
assertWeek(0, new Date(Date.UTC(2010, 0, 1)));
|
|
// Sat Jan 2 2010
|
|
assertWeek(0, new Date(Date.UTC(2010, 0, 2)));
|
|
// Sun Jan 3 2010
|
|
assertWeek(1, new Date(Date.UTC(2010, 0, 3)));
|
|
// Sat Sept 18 2010
|
|
assertWeek(37, new Date(Date.UTC(2010, 8, 18)));
|
|
// Sun Sept 19 2010
|
|
assertWeek(38, new Date(Date.UTC(2010, 8, 19)));
|
|
|
|
// Sat Jan 1 2011
|
|
assertWeek(0, new Date(Date.UTC(2011, 0, 1)));
|
|
// Sun Jan 2 2011
|
|
assertWeek(1, new Date(Date.UTC(2011, 0, 2)));
|
|
// Sat Aug 20 2011
|
|
assertWeek(33, new Date(Date.UTC(2011, 7, 20)));
|
|
// Sun Aug 21 2011
|
|
assertWeek(34, new Date(Date.UTC(2011, 7, 21)));
|
|
|
|
// Leap year tests.
|
|
|
|
// Sat Feb 27 2016
|
|
assertWeek(8, new Date(Date.UTC(2016, 1, 27)));
|
|
// Sun Feb 28 2016
|
|
assertWeek(9, new Date(Date.UTC(2016, 1, 28)));
|
|
// Mon Feb 29 2016
|
|
assertWeek(9, new Date(Date.UTC(2016, 1, 29)));
|
|
// Tue Mar 1 2016
|
|
assertWeek(9, new Date(Date.UTC(2016, 2, 1)));
|
|
|
|
// Sat Feb 28 2032
|
|
assertWeek(8, new Date(Date.UTC(2032, 1, 28)));
|
|
// Sun Feb 29 2032
|
|
assertWeek(9, new Date(Date.UTC(2032, 1, 29)));
|
|
// Mon Mar 1 2032
|
|
assertWeek(9, new Date(Date.UTC(2032, 2, 1)));
|
|
|
|
// Fri Feb 28 2020
|
|
assertWeek(8, new Date(Date.UTC(2020, 1, 28)));
|
|
// Sat Feb 29 2020
|
|
assertWeek(8, new Date(Date.UTC(2020, 1, 29)));
|
|
// Sun Mar 1 2020
|
|
assertWeek(9, new Date(Date.UTC(2020, 2, 1)));
|
|
|
|
// Timestamp argument.
|
|
assertWeek(1, new Timestamp(new Date(Date.UTC(1984, 0, 1)).getTime() / 1000, 0));
|
|
assertWeek(1, new Timestamp(new Date(Date.UTC(1984, 0, 1)).getTime() / 1000, 1000000000));
|
|
|
|
// Numeric argument not allowed.
|
|
assertErrorCode(t, {$project: {a: {$week: 5}}}, 16006);
|
|
|
|
// String argument not allowed.
|
|
assertErrorCode(t, {$project: {a: {$week: "foo"}}}, 16006);
|
|
|
|
// Array argument format.
|
|
assertWeek(8, [new Date(Date.UTC(2016, 1, 27))]);
|
|
|
|
// Wrong number of arguments.
|
|
assertErrorCode(t, {$project: {a: {$week: []}}}, 40536);
|
|
assertErrorCode(t, {$project: {a: {$week: [new Date(Date.UTC(2020, 1, 28)), new Date(Date.UTC(2020, 1, 29))]}}}, 40536);
|
|
|
|
// From a field path expression.
|
|
t.remove({});
|
|
t.save({a: new Date(Date.UTC(2020, 2, 1))});
|
|
assertWeek(9, "$a");
|