diff --git a/src/pyson.js b/src/pyson.js index ab716ffae1..66f013ce77 100644 --- a/src/pyson.js +++ b/src/pyson.js @@ -658,7 +658,8 @@ delta_days); }; Sao.PYSON.Date = Sao.class_(Sao.PYSON.PYSON, { - init: function(year, month, day, delta_years, delta_months, delta_days) + init: function( + year, month, day, delta_years, delta_months, delta_days, start) { Sao.PYSON.Date._super.init.call(this); if (year === undefined) year = null; @@ -681,6 +682,7 @@ this._delta_years = delta_years; this._delta_months = delta_months; this._delta_days = delta_days; + this._start = start || null; }, pyson: function() { return { @@ -690,7 +692,8 @@ 'd': this._day, 'dy': this._delta_years, 'dM': this._delta_months, - 'dd': this._delta_days + 'dd': this._delta_days, + 'start': this._start, }; }, types: function() { @@ -710,19 +713,29 @@ }, __string_params__: function() { return [this._year, this._month, this._day, this._delta_years, - this._delta_months, this._delta_days]; + this._delta_months, this._delta_days, this._start]; } }); Sao.PYSON.Date.eval_ = function(value, context) { - var date = Sao.Date(value.y, value.M && value.M - 1, value.d); + var date = value.start; + if (date && date.isDateTime) { + date = Sao.Date(date.year(), date.month(), date.date()); + } + if (!date || !date.isDate) { + date = Sao.Date(); + } + if (value.y) date.year(value.y); + if (value.M) date.month(value.M - 1); + if (value.d) date.date(value.d); if (value.dy) date.add(value.dy, 'y'); if (value.dM) date.add(value.dM, 'M'); if (value.dd) date.add(value.dd, 'd'); return date; }; Sao.PYSON.Date.init_from_object = function(obj) { - return new Sao.PYSON.Date(obj.y, obj.M, obj.d, obj.dy, obj.dM, obj.dd); + return new Sao.PYSON.Date( + obj.y, obj.M, obj.d, obj.dy, obj.dM, obj.dd, obj.start); }; Sao.PYSON.eval.DateTime = function(year, month, day, hour, minute, second, @@ -735,9 +748,9 @@ Sao.PYSON.DateTime = Sao.class_(Sao.PYSON.Date, { init: function(year, month, day, hour, minute, second, microsecond, delta_years, delta_months, delta_days, delta_hours, - delta_minutes, delta_seconds, delta_microseconds) { + delta_minutes, delta_seconds, delta_microseconds, start) { Sao.PYSON.DateTime._super.init.call(this, year, month, day, - delta_years, delta_months, delta_days); + delta_years, delta_months, delta_days, start); if (hour === undefined) hour = null; if (minute === undefined) minute = null; if (second === undefined) second = null; @@ -785,13 +798,26 @@ this._hour, this._minute, this._second, this._microsecond, date_params[3], date_params[4], date_params[5], this._delta_hours, this._delta_minutes, this._delta_seconds, - this._delta_microseconds]; + this._delta_microseconds, date_params[6]]; } }); Sao.PYSON.DateTime.eval_ = function(value, context) { - var date = Sao.DateTime(value.y, value.M && value.M - 1, value.d, - value.h, value.m, value.s, value.ms && value.ms / 1000, true); + var date = value.start; + if (date && date.isDate) { + date = Sao.DateTime.combine(date, Sao.Time()); + } + if (!date || !date.isDateTime) { + date = Sao.DateTime(); + date.utc(); + } + if (value.y) date.year(value.y); + if (value.M) date.month(value.M - 1); + if (value.d) date.date(value.d); + if (value.h !== null) date.hour(value.h); + if (value.m !== null) date.minute(value.m); + if (value.s !== null) date.second(value.s); + if (value.ms !== null) date.milliseconds(value.ms / 1000); if (value.dy) date.add(value.dy, 'y'); if (value.dM) date.add(value.dM, 'M'); if (value.dd) date.add(value.dd, 'd'); diff --git a/tests/sao.js b/tests/sao.js index a91ab150e4..25cd0f9441 100644 --- a/tests/sao.js +++ b/tests/sao.js @@ -48,8 +48,10 @@ var date = Sao.Date(2002, 0, 1); var datetime = Sao.DateTime(2002, 0, 1, 12, 30, 0, 0); var pyson_date = new Sao.PYSON.Date(2002, 1, 1).pyson(); + pyson_date.start = null; var pyson_datetime = new Sao.PYSON.DateTime( 2002, 1, 1, 12, 30, 0, 0).pyson(); + pyson_datetime.start = null; var array = ["create_date", '>=', date]; var pyson_array = ["create_date", '>=', pyson_date]; QUnit.strictEqual(encoder.encode(), 'null', "encode()"); @@ -707,7 +709,42 @@ QUnit.strictEqual( new Sao.PYSON.Date(2010, 1, 12, -1, 12, -7).toString(), - 'Date(2010, 1, 12, -1, 12, -7)'); + 'Date(2010, 1, 12, -1, 12, -7, null)'); + }); + + QUnit.test('PYSON Date start', function() { + var eval_; + + eval_ = new Sao.PYSON.Encoder().encode( + new Sao.PYSON.Date( + undefined, undefined, undefined, + undefined, undefined, undefined, + new Sao.PYSON.Eval('date'))); + var date = Sao.Date(2000, 1, 1); + + QUnit.strictEqual(new Sao.PYSON.Decoder( + {'date': date}).decode(eval_).valueOf(), date.valueOf()); + + eval_ = new Sao.PYSON.Encoder().encode( + new Sao.PYSON.Date( + undefined, undefined, undefined, + undefined, undefined, undefined, + new Sao.PYSON.Eval('datetime'))); + var datetime = Sao.DateTime(2000, 1, 1, 12, 0); + + QUnit.strictEqual(new Sao.PYSON.Decoder( + {'datetime': datetime}).decode(eval_).valueOf(), + Sao.Date(2000, 1, 1).valueOf()); + + eval_ = new Sao.PYSON.Encoder().encode( + new Sao.PYSON.Date( + undefined, undefined, undefined, + undefined, undefined, undefined, + new Sao.PYSON.Eval('foo'))); + + QUnit.strictEqual(new Sao.PYSON.Decoder( + {'foo': 'bar'}).decode(eval_).valueOf(), + Sao.Date().valueOf()); }); QUnit.test('PYSON DateTime', function() { @@ -874,7 +911,49 @@ QUnit.strictEqual(new Sao.PYSON.DateTime(2010, 1, 12, 10, 30, 20, 0, -1, 12, -7, 2, 15, 30, 1).toString(), - 'DateTime(2010, 1, 12, 10, 30, 20, 0, -1, 12, -7, 2, 15, 30, 1)'); + 'DateTime(2010, 1, 12, 10, 30, 20, 0, -1, 12, -7, 2, 15, 30, 1, null)'); + }); + + QUnit.test('PYSON DateTime start', function() { + var eval_; + + eval_ = new Sao.PYSON.Encoder().encode( + new Sao.PYSON.DateTime( + undefined, undefined, undefined, + undefined, undefined, undefined, undefined, + undefined, undefined, undefined, + undefined, undefined, undefined, undefined, + new Sao.PYSON.Eval('datetime'))); + var datetime = Sao.DateTime(2000, 1, 1, 12, 0); + + QUnit.strictEqual(new Sao.PYSON.Decoder( + {'datetime': datetime}).decode(eval_).valueOf(), + datetime.valueOf()); + + eval_ = new Sao.PYSON.Encoder().encode( + new Sao.PYSON.DateTime( + undefined, undefined, undefined, + undefined, undefined, undefined, undefined, + undefined, undefined, undefined, + undefined, undefined, undefined, undefined, + new Sao.PYSON.Eval('date'))); + var date = Sao.DateTime(2000, 1, 1); + + QUnit.strictEqual(new Sao.PYSON.Decoder( + {'date': date}).decode(eval_).valueOf(), + Sao.DateTime(2000, 1, 1, 0, 0).valueOf()); + + eval_ = new Sao.PYSON.Encoder().encode( + new Sao.PYSON.DateTime( + undefined, undefined, undefined, + undefined, undefined, undefined, undefined, + undefined, undefined, undefined, + undefined, undefined, undefined, undefined, + new Sao.PYSON.Eval('foo'))); + + QUnit.strictEqual(new Sao.PYSON.Decoder( + {'foo': 'bar'}).decode(eval_).valueOf(), + Sao.DateTime().valueOf()); }); QUnit.test('PYSON TimeDelta', function() {