From 523fdbca0d4144b352fc530bfa5188a1ce5119cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Sat, 5 Sep 2020 22:59:38 +0200 Subject: [PATCH] Support PYSON comparison of date and datetime issue4879 review270061002 --- CHANGELOG | 1 + src/pyson.js | 29 +++++++++-- tests/sao.js | 132 ++++++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 150 insertions(+), 12 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 531961e1af..e19b322907 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Support PYSON comparison of date and datetime * Customize bootstrap default style * Set field's name as input's name attribute * Position copied records based on order diff --git a/src/pyson.js b/src/pyson.js index 0a75d19e06..72dd4b3cc8 100644 --- a/src/pyson.js +++ b/src/pyson.js @@ -389,12 +389,16 @@ for (var i = 0; i < 2; i++) { var statement = statements[i]; if (statement instanceof Sao.PYSON.PYSON) { - if (jQuery(statement.types()).not(['number']).length) { - throw 'statement must be an integer or a float'; + if ( (!(statement instanceof Sao.PYSON.DateTime || + statement instanceof Sao.PYSON.Date)) && + (jQuery(statement.types()).not(['number']).length) ) { + throw 'statement must be an integer, float, ' + + 'date or datetime'; } } else { if (!~['number', 'object'].indexOf(typeof statement)) { - throw 'statement must be an integer or a float'; + throw 'statement must be an integer, float, ' + + 'date or datetime'; } } } @@ -431,12 +435,24 @@ Sao.PYSON.Greater._convert = function(value) { value = jQuery.extend({}, value); - value.s1 = Number(value.s1); - value.s2 = Number(value.s2); + var values = [value.s1, value.s2]; + for (var i=0; i < 2; i++) { + if (values[i] instanceof moment) { + values[i] = values[i].unix(); + } + else { + values[i] = Number(values[i]); + } + } + value.s1 = values[0]; + value.s2 = values[1]; return value; }; Sao.PYSON.Greater.eval_ = function(value, context) { + if (value.s1 == null || value.s2 == null) { + return false; + } value = Sao.PYSON.Greater._convert(value); if (value.e) { return value.s1 >= value.s2; @@ -462,6 +478,9 @@ Sao.PYSON.Less._convert = Sao.PYSON.Greater._convert; Sao.PYSON.Less.eval_ = function(value, context) { + if (value.s1 == null || value.s2 == null) { + return false; + } value = Sao.PYSON.Less._convert(value); if (value.e) { return value.s1 <= value.s2; diff --git a/tests/sao.js b/tests/sao.js index 7a123247c6..92977ee5a7 100644 --- a/tests/sao.js +++ b/tests/sao.js @@ -407,13 +407,19 @@ QUnit.throws(function() { new Sao.PYSON.Greater('test', 0); - }, 'statement must be an integer or a float'); + }, 'statement must be an integer, float, date or datetime'); QUnit.throws(function() { new Sao.PYSON.Greater(1, 'test'); - }, 'statement must be an integer or a float'); + }, 'statement must be an integer, float, date or datetime'); QUnit.throws(function() { new Sao.PYSON.Greater(new Sao.PYSON.Eval('foo'), 0); - }, 'statement must be an integer of float'); + }, 'statement must be an integer, float, date or datetime'); + QUnit.throws(function() { + new Sao.PYSON.Greater(Sao.PYSON.DateTime(), 'test'); + }, 'statement must be an integer, float, date or datetime'); + QUnit.throws(function() { + new Sao.PYSON.Greater('test', Date()); + }, 'statement must be an integer, float, date or datetime'); QUnit.ok(Sao.common.compare(new Sao.PYSON.Greater(1, 0).types(), ['boolean']), 'Greater(1, 0).types()'); @@ -451,11 +457,64 @@ 'decode(Greater(null, 1))'); eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater(1, null)); - QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true, + QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false, 'decode(Greater(1, null))'); QUnit.strictEqual(new Sao.PYSON.Greater(1, 0).toString(), "Greater(1, 0, false)"); + eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater( + new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), + Sao.Date(2020, 0, 2))); + QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false, + 'decode(Greater(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), ' + + 'Date(2020, 0, 2)))'); + + eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater( + new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), + Sao.Date(2020, 0, 1))); + QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true, + 'decode(Greater(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), ' + + 'Date(2020, 0, 1)))'); + + eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater( + new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), + Sao.Date(2020, 0, 1), true)); + QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true, + 'decode(Greater(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), ' + + 'Date(2020, 0, 1), true))'); + + eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater( + new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), + new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0))); + QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false, + 'decode(Greater(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), ' + + 'PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0, 0)))'); + + eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater( + new Sao.PYSON.Date(2020, 1, 1), + Sao.Date(2020, 0, 1))); + QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false, + 'decode(Greater(PYSON.Date(2020, 1, 1), Date(2020, 0, 1)))'); + + eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater( + new Sao.PYSON.Date(2020, 1, 1), + new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 1))); + QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false, + 'decode(Greater(PYSON.Date(2020, 1, 1), ' + + 'PYSON.DateTime(2020, 1, 1, 0, 0, 0, 1)))'); + + eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater( + new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 1), + new Sao.PYSON.Date(2020, 1, 1), true)); + QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true, + 'decode(Greater(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 1), ' + + 'PYSON.Date(2020, 1, 1), true))'); + + eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Greater( + new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), 90000)); + QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true, + 'decode(Greater(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), 90000))'); + eval_ = new Sao.PYSON.Encoder().encode( new Sao.PYSON.Greater(new Sao.PYSON.Eval('i', 0), 0)); QUnit.strictEqual(new Sao.PYSON.Decoder({i: 1}).decode(eval_), true, @@ -471,10 +530,22 @@ QUnit.throws(function() { new Sao.PYSON.Less('test', 0); - }, 'statement must be an integer or a float'); + }, 'statement must be an integer, float, date or datetime'); QUnit.throws(function() { new Sao.PYSON.Less(1, 'test'); - }, 'statement must be an integer or a float'); + }, 'statement must be an integer, float, date or datetime'); + QUnit.throws(function() { + new Sao.PYSON.Less(1, 'test'); + }, 'statement must be an integer, float, date or datetime'); + QUnit.throws(function() { + new Sao.PYSON.Less(new Sao.PYSON.Eval('foo'), 0); + }, 'statement must be an integer, float, date or datetime'); + QUnit.throws(function() { + new Sao.PYSON.Less(Sao.PYSON.DateTime(), 'test'); + }, 'statement must be an integer, float, date or datetime'); + QUnit.throws(function() { + new Sao.PYSON.Less('test', Date()); + }, 'statement must be an integer, float, date or datetime'); QUnit.ok(Sao.common.compare(new Sao.PYSON.Less(1, 0).types(), ['boolean']), 'Less(1, 0).types()'); @@ -508,7 +579,7 @@ 'decode(Less(1, 1, true))'); eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less(null, 1)); - QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true, + QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false, 'decode(Less(null, 1))'); eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less(1, null)); @@ -516,6 +587,53 @@ 'decode(Less(1, null))'); QUnit.strictEqual(new Sao.PYSON.Less(0, 1).toString(), "Less(0, 1, false)"); + + eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less( + new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), + Sao.Date(2020, 0, 1))); + QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false, + 'decode(Less(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), ' + + 'Date(2020, 0, 1)))'); + + eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less( + new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), + Sao.Date(2020, 0, 2), true)); + QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true, + 'decode(Less(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), ' + + 'Date(2020, 0, 2), true))'); + + eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less( + new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), + new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0))); + QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false, + 'decode(Less(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), ' + + 'PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0)))'); + + eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less( + new Sao.PYSON.Date(2020, 1, 1), + Sao.Date(2020, 0, 2))); + QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true, + 'decode(Less(PYSON.Date(2020, 1, 1), Date(2020, 0, 2)))'); + + eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less( + new Sao.PYSON.Date(2020, 1, 1), + new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 1))); + QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true, + 'decode(Less(PYSON.Date(2020, 1, 1), ' + + 'PYSON.DateTime(2020, 1, 1, 0, 0, 1)))'); + + eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less( + new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), + new Sao.PYSON.Date(2020, 0, 1), true)); + QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), true, + 'decode(Less(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), ' + + 'PYSON.Date(2020, 1, 1), true))'); + + eval_ = new Sao.PYSON.Encoder().encode(new Sao.PYSON.Less( + new Sao.PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), 90000)); + QUnit.strictEqual(new Sao.PYSON.Decoder().decode(eval_), false, + 'decode(Less(PYSON.DateTime(2020, 1, 1, 0, 0, 0, 0), 90000))'); + }); QUnit.test('PYSON If', function() {