* Bug #14692 fixed - isequal() was always returning true for builtin functions 67/18467/2
Pierre-Aime AGNEL [Tue, 16 Aug 2016 09:33:08 +0000 (11:33 +0200)]
Added the functions to manage f == builtin or f <> builtin
because of http://bugzilla.scilab.org/show_bug.cgi?id=14715 tests
cannot be done with ~=

Change-Id: Ic0037c5505345c39f289c5c09245e2a54bf2385c

scilab/CHANGES.md
scilab/modules/ast/includes/types/function.hxx
scilab/modules/ast/src/cpp/types/function.cpp
scilab/modules/ast/tests/nonreg_tests/bug_14692.dia.ref [new file with mode: 0644]
scilab/modules/ast/tests/nonreg_tests/bug_14692.tst [new file with mode: 0644]
scilab/modules/overloading/macros/%fptr_n_fptr.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%fptr_o_fptr.sci [new file with mode: 0644]

index 2e04b00..f78ba43 100644 (file)
@@ -297,6 +297,7 @@ Bug Fixes
 * [Bug #14667](http://bugzilla.scilab.org/show_bug.cgi?id=14667) fixed - Multi line string without final quote generated a non terminal parser state.
 * [Bug #14681](http://bugzilla.scilab.org/show_bug.cgi?id=14681) fixed - Short-circuited AND operation was not possible with double matrices in if and while clauses
 * [Bug #14690](http://bugzilla.scilab.org/show_bug.cgi?id=14690) fixed - The user's startup files set in the working directory were not executed. When `SCIHOME` is not the working directory, `SCIHOME\scilab.ini` was executed twice.
+* [Bug #14692](http://bugzilla.scilab.org/show_bug.cgi?id=14692) fixed - isequal() was always returning true for builtin functions
 * [Bug #14694](http://bugzilla.scilab.org/show_bug.cgi?id=14694) fixed - The list of named colors was misaligned and poorly rendered in `help color_list`
 * [Bug #14710](http://bugzilla.scilab.org/show_bug.cgi?id=14710) fixed - fullpath(TMPDIR+...) was bugged on MacOS
 * [Bug #14714](http://bugzilla.scilab.org/show_bug.cgi?id=14714) fixed - Crash/Leak when deleting datatip
index b72ef50..c458687 100644 (file)
@@ -53,7 +53,7 @@ public :
     typedef ReturnValue (*GW_FUNC)(typed_list &in, int _iRetCount, typed_list &out);
     typedef ReturnValue (*GW_FUNC_OPT)(typed_list &in, optional_list &opt, int _iRetCount, typed_list &out);
 
-    Function() : Callable() 
+    Function() : Callable()
     {
         m_pFunc = nullptr;
         m_pLoadDeps = nullptr;
@@ -63,6 +63,7 @@ public :
 
     //FIXME : Should not return NULL
     virtual Function*       clone();
+    virtual bool operator==(const InternalType& it);
 
     static Function*        createFunction(const std::wstring& _wstName, GW_FUNC _pFunc, const std::wstring& _wstModule);
     static Function*        createFunction(const std::wstring& _wstName, GW_FUNC_OPT _pFunc, const std::wstring& _wstModule);
index b07fdec..024e847 100644 (file)
@@ -149,6 +149,15 @@ Function* Function::clone()
     return this;
 }
 
+bool Function::operator==(const InternalType& it)
+{
+    if (!const_cast<InternalType &>(it).isFunction())
+    {
+        return false;
+    }
+    return this->getFunc() == const_cast<InternalType &>(it).getAs<Function>()->getFunc();
+}
+
 OptFunction::OptFunction(const std::wstring& _wstName, GW_FUNC_OPT _pFunc, LOAD_DEPS _pLoadDeps, const std::wstring& _wstModule)
 {
     m_wstName = _wstName;
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14692.dia.ref b/scilab/modules/ast/tests/nonreg_tests/bug_14692.dia.ref
new file mode 100644 (file)
index 0000000..0ad144e
--- /dev/null
@@ -0,0 +1,25 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Pierre-Aimé AGNEL
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- Non-regression test for bug 14692 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14692
+//
+// <-- Short Description -->
+//    isequal() was always returning True for built-in functions
+tested_fun = sin; // sin is a builtin
+tested_fun2 = cos; // cos is a builtin
+assert_checktrue(isequal(tested_fun, sin));
+assert_checktrue(isequal(tested_fun2, cos));
+assert_checkfalse(isequal(tested_fun, cos));
+assert_checkfalse(isequal(tested_fun2, sin));
+assert_checkfalse(isequal(tested_fun, isempty)); // isempty is a macro
+assert_checkfalse(isequal(tested_fun2, isempty)); // isempty is a macro
+assert_checktrue(tested_fun == sin);
+assert_checktrue(tested_fun2 == cos);
+assert_checktrue(tested_fun <> cos);
+assert_checktrue(tested_fun2 <> sin);
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14692.tst b/scilab/modules/ast/tests/nonreg_tests/bug_14692.tst
new file mode 100644 (file)
index 0000000..dc9046b
--- /dev/null
@@ -0,0 +1,31 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Pierre-Aimé AGNEL
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- Non-regression test for bug 14692 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14692
+//
+// <-- Short Description -->
+//    isequal() was always returning True for built-in functions
+
+tested_fun = sin; // sin is a builtin
+tested_fun2 = cos; // cos is a builtin
+
+assert_checktrue(isequal(tested_fun, sin));
+assert_checktrue(isequal(tested_fun2, cos));
+
+assert_checkfalse(isequal(tested_fun, cos));
+assert_checkfalse(isequal(tested_fun2, sin));
+assert_checkfalse(isequal(tested_fun, isempty)); // isempty is a macro
+assert_checkfalse(isequal(tested_fun2, isempty)); // isempty is a macro
+
+assert_checktrue(tested_fun == sin);
+assert_checktrue(tested_fun2 == cos);
+assert_checktrue(tested_fun <> cos);
+assert_checktrue(tested_fun2 <> sin);
+
diff --git a/scilab/modules/overloading/macros/%fptr_n_fptr.sci b/scilab/modules/overloading/macros/%fptr_n_fptr.sci
new file mode 100644 (file)
index 0000000..e508416
--- /dev/null
@@ -0,0 +1,15 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Pierre-Aimé AGNEL
+//
+// Copyright (C) 2012 - 2016 - Scilab Enterprises
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function b = %fptr_n_fptr(fun1, fun2)
+    b = ~isequal(fun1, fun2);
+endfunction
diff --git a/scilab/modules/overloading/macros/%fptr_o_fptr.sci b/scilab/modules/overloading/macros/%fptr_o_fptr.sci
new file mode 100644 (file)
index 0000000..7752046
--- /dev/null
@@ -0,0 +1,15 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Pierre-Aimé AGNEL
+//
+// Copyright (C) 2012 - 2016 - Scilab Enterprises
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function b = %fptr_o_fptr(fun1, fun2)
+    b = isequal(fun1, fun2);
+endfunction