details:   https://code.tryton.org/tryton/commit/190814572758
branch:    7.8
user:      Cédric Krier <[email protected]>
date:      Mon Oct 12 12:42:56 2026 +0200
description:
        Convert only Number instances to number when evaluate domain for 
inversion

        Closes #15159
        (grafted from 88cc5493f11bb7dc50026f87e34b416812eae666)
diffstat:

 sao/src/common.js                   |   8 +++-
 sao/tests/sao.js                    |  38 ++++++++++++++++++++++++
 trytond/trytond/tests/test_tools.py |  57 +++++++++++++++++++++++++++++++++++++
 3 files changed, 101 insertions(+), 2 deletions(-)

diffs (134 lines):

diff -r 035e881e1031 -r 190814572758 sao/src/common.js
--- a/sao/src/common.js Fri Oct 09 23:28:16 2026 +0200
+++ b/sao/src/common.js Mon Oct 12 12:42:56 2026 +0200
@@ -2972,9 +2972,13 @@
             return ((a.isDate == b.isDate) &&
                 (a.isDateTime == b.isDateTime) &&
                 (a.valueOf() == b.valueOf()));
-        } else if ((a instanceof Number) || (b instanceof Number)) {
-            return (Number(a) === Number(b));
         } else {
+            if (a instanceof Number) {
+                a = a.valueOf();
+            }
+            if (b instanceof Number) {
+                b = b.valueOf();
+            }
             return (a === b);
         }
     };
diff -r 035e881e1031 -r 190814572758 sao/tests/sao.js
--- a/sao/tests/sao.js  Fri Oct 09 23:28:16 2026 +0200
+++ b/sao/tests/sao.js  Mon Oct 12 12:42:56 2026 +0200
@@ -2969,6 +2969,44 @@
         var now = new Date();
 
         [
+        [[['x', '=', 42]], {'x': 42}, true],
+        [[['x', '=', 42]], {'x': new Number(42)}, true],
+        [[['x', '=', 42]], {'x': 0}, false],
+        [[['x', '=', 42]], {'x': new Number(0)}, false],
+        [[['x', '=', 42]], {'x': null}, false],
+        [[['x', '=', new Number(42)]], {'x': 42}, true],
+        [[['x', '=', new Number(42)]], {'x': new Number(42)}, true],
+        [[['x', '=', new Number(42)]], {'x': 0}, false],
+        [[['x', '=', new Number(42)]], {'x': new Number(0)}, false],
+        [[['x', '=', new Number(42)]], {'x': null}, false],
+        [[['x', '=', 0]], {'x': 0}, true],
+        [[['x', '=', 0]], {'x': new Number(0)}, true],
+        [[['x', '=', 0]], {'x': null}, false],
+        [[['x', '=', new Number(0)]], {'x': 0}, true],
+        [[['x', '=', new Number(0)]], {'x': new Number(0)}, true],
+        [[['x', '=', new Number(0)]], {'x': null}, false],
+        [[['x', '=', null]], {'x': 0}, false],
+        [[['x', '=', null]], {'x': new Number(0)}, false],
+        [[['x', '=', null]], {'x': null}, true],
+        [[['x', '!=', 42]], {'x': 42}, false],
+        [[['x', '!=', 42]], {'x': new Number(42)}, false],
+        [[['x', '!=', 42]], {'x': 0}, true],
+        [[['x', '!=', 42]], {'x': new Number(0)}, true],
+        [[['x', '!=', 42]], {'x': null}, true],
+        [[['x', '!=', new Number(42)]], {'x': 42}, false],
+        [[['x', '!=', new Number(42)]], {'x': new Number(42)}, false],
+        [[['x', '!=', new Number(42)]], {'x': 0}, true],
+        [[['x', '!=', new Number(42)]], {'x': new Number(0)}, true],
+        [[['x', '!=', new Number(42)]], {'x': null}, true],
+        [[['x', '!=', 0]], {'x': 0}, false],
+        [[['x', '!=', 0]], {'x': new Number(0)}, false],
+        [[['x', '!=', 0]], {'x': null}, true],
+        [[['x', '!=', new Number(0)]], {'x': 0}, false],
+        [[['x', '!=', new Number(0)]], {'x': new Number(0)}, false],
+        [[['x', '!=', new Number(0)]], {'x': null}, true],
+        [[['x', '!=', null]], {'x': 0}, true],
+        [[['x', '!=', null]], {'x': new Number(0)}, true],
+        [[['x', '!=', null]], {'x': null}, false],
         [[['x', '>', 5]], {'x': 6}, true],
         [[['x', '>', 5]], {'x': 4}, false],
         [[['x', '>', null]], {'x': today}, false],
diff -r 035e881e1031 -r 190814572758 trytond/trytond/tests/test_tools.py
--- a/trytond/trytond/tests/test_tools.py       Fri Oct 09 23:28:16 2026 +0200
+++ b/trytond/trytond/tests/test_tools.py       Mon Oct 12 12:42:56 2026 +0200
@@ -946,6 +946,63 @@
             unique_value(domain, single_value=False), (False, None, None))
 
     def test_evaldomain(self):
+
+        domain = [['x', '=', 42]]
+        self.assertTrue(eval_domain(domain, {'x': 42}))
+        self.assertTrue(eval_domain(domain, {'x': Decimal('42')}))
+        self.assertFalse(eval_domain(domain, {'x': 0}))
+        self.assertFalse(eval_domain(domain, {'x': Decimal('0')}))
+        self.assertFalse(eval_domain(domain, {'x': None}))
+
+        domain = [['x', '=', Decimal('42')]]
+        self.assertTrue(eval_domain(domain, {'x': 42}))
+        self.assertTrue(eval_domain(domain, {'x': Decimal('42')}))
+        self.assertFalse(eval_domain(domain, {'x': 0}))
+        self.assertFalse(eval_domain(domain, {'x': Decimal('0')}))
+        self.assertFalse(eval_domain(domain, {'x': None}))
+
+        domain = [['x', '=', 0]]
+        self.assertTrue(eval_domain(domain, {'x': 0}))
+        self.assertTrue(eval_domain(domain, {'x': Decimal('0')}))
+        self.assertFalse(eval_domain(domain, {'x': None}))
+
+        domain = [['x', '=', Decimal('0')]]
+        self.assertTrue(eval_domain(domain, {'x': 0}))
+        self.assertTrue(eval_domain(domain, {'x': Decimal('0')}))
+        self.assertFalse(eval_domain(domain, {'x': None}))
+
+        domain = [['x', '=', None]]
+        self.assertFalse(eval_domain(domain, {'x': 0}))
+        self.assertFalse(eval_domain(domain, {'x': Decimal('0')}))
+        self.assertTrue(eval_domain(domain, {'x': None}))
+
+        domain = [['x', '!=', 42]]
+        self.assertFalse(eval_domain(domain, {'x': 42}))
+        self.assertFalse(eval_domain(domain, {'x': Decimal('42')}))
+        self.assertTrue(eval_domain(domain, {'x': Decimal('0')}))
+        self.assertTrue(eval_domain(domain, {'x': None}))
+
+        domain = [['x', '!=', Decimal('42')]]
+        self.assertFalse(eval_domain(domain, {'x': 42}))
+        self.assertFalse(eval_domain(domain, {'x': Decimal('42')}))
+        self.assertTrue(eval_domain(domain, {'x': Decimal('0')}))
+        self.assertTrue(eval_domain(domain, {'x': None}))
+
+        domain = [['x', '!=', 0]]
+        self.assertFalse(eval_domain(domain, {'x': 0}))
+        self.assertFalse(eval_domain(domain, {'x': Decimal('0')}))
+        self.assertTrue(eval_domain(domain, {'x': None}))
+
+        domain = [['x', '!=', Decimal('0')]]
+        self.assertFalse(eval_domain(domain, {'x': 0}))
+        self.assertFalse(eval_domain(domain, {'x': Decimal('0')}))
+        self.assertTrue(eval_domain(domain, {'x': None}))
+
+        domain = [['x', '!=', None]]
+        self.assertTrue(eval_domain(domain, {'x': 0}))
+        self.assertTrue(eval_domain(domain, {'x': Decimal('0')}))
+        self.assertFalse(eval_domain(domain, {'x': None}))
+
         domain = [['x', '>', 5]]
         self.assertTrue(eval_domain(domain, {'x': 6}))
         self.assertFalse(eval_domain(domain, {'x': 4}))

Reply via email to