changeset eb238bf04203 in sao:default
details: https://hg.tryton.org/sao?cmd=changeset;node=eb238bf04203
description:
        Support PYSON comparison of date and datetime

        issue4879
        review270061002
diffstat:

 CHANGELOG    |    1 +
 src/pyson.js |   29 ++++++++++--
 tests/sao.js |  132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 3 files changed, 150 insertions(+), 12 deletions(-)

diffs (248 lines):

diff -r 713e94987da2 -r eb238bf04203 CHANGELOG
--- a/CHANGELOG Sat Aug 29 18:29:15 2020 +0200
+++ b/CHANGELOG Sat Sep 05 22:59:38 2020 +0200
@@ -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 -r 713e94987da2 -r eb238bf04203 src/pyson.js
--- a/src/pyson.js      Sat Aug 29 18:29:15 2020 +0200
+++ b/src/pyson.js      Sat Sep 05 22:59:38 2020 +0200
@@ -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 -r 713e94987da2 -r eb238bf04203 tests/sao.js
--- a/tests/sao.js      Sat Aug 29 18:29:15 2020 +0200
+++ b/tests/sao.js      Sat Sep 05 22:59:38 2020 +0200
@@ -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, 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(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() {

Reply via email to