Index: test/JsEngine.cpp |
=================================================================== |
--- a/test/JsEngine.cpp |
+++ b/test/JsEngine.cpp |
@@ -12,16 +12,17 @@ |
* GNU General Public License for more details. |
* |
* You should have received a copy of the GNU General Public License |
* along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
*/ |
#include <stdexcept> |
#include "BaseJsTest.h" |
+#include "../src/JsContext.h" |
namespace |
{ |
class JsEngineTest : public BaseJsTest |
{ |
}; |
} |
@@ -40,60 +41,119 @@ |
TEST_F(JsEngineTest, CompileTimeExceptionIsThrown) |
{ |
ASSERT_THROW(jsEngine->Evaluate("'foo'bar'"), std::runtime_error); |
} |
TEST_F(JsEngineTest, ValueCreation) |
{ |
- AdblockPlus::JsValuePtr value; |
- |
- value = jsEngine->NewValue("foo"); |
- ASSERT_TRUE(value->IsString()); |
- ASSERT_EQ("foo", value->AsString()); |
+ auto value = jsEngine->NewValue("foo"); |
+ ASSERT_TRUE(value.IsString()); |
+ ASSERT_EQ("foo", value.AsString()); |
value = jsEngine->NewValue(12345678901234); |
- ASSERT_TRUE(value->IsNumber()); |
- ASSERT_EQ(12345678901234, value->AsInt()); |
+ ASSERT_TRUE(value.IsNumber()); |
+ ASSERT_EQ(12345678901234, value.AsInt()); |
value = jsEngine->NewValue(true); |
- ASSERT_TRUE(value->IsBool()); |
- ASSERT_TRUE(value->AsBool()); |
+ ASSERT_TRUE(value.IsBool()); |
+ ASSERT_TRUE(value.AsBool()); |
value = jsEngine->NewObject(); |
- ASSERT_TRUE(value->IsObject()); |
- ASSERT_EQ(0u, value->GetOwnPropertyNames().size()); |
+ ASSERT_TRUE(value.IsObject()); |
+ ASSERT_EQ(0u, value.GetOwnPropertyNames().size()); |
+} |
+ |
+namespace { |
+ |
+ bool IsSame(const AdblockPlus::JsEnginePtr& jsEngine, |
sergei
2017/04/20 12:45:08
Can be just `JsEngine&` (without pointer).
hub
2017/04/20 13:01:46
ok
|
+ const AdblockPlus::JsValue& v1, const AdblockPlus::JsValue& v2) |
+ { |
+ AdblockPlus::JsValueList params; |
+ params.push_back(v1); |
+ params.push_back(v2); |
+ return jsEngine->Evaluate("f = function(a, b) { return a == b };")->Call(params).AsBool(); |
+ } |
+ |
+} |
+ |
+TEST_F(JsEngineTest, ValueCopy) |
+{ |
+ { |
+ auto value = jsEngine->NewValue("foo"); |
+ ASSERT_TRUE(value.IsString()); |
+ ASSERT_EQ("foo", value.AsString()); |
+ |
+ AdblockPlus::JsValue value2(value); |
+ ASSERT_TRUE(value2.IsString()); |
+ ASSERT_EQ("foo", value2.AsString()); |
+ |
+ ASSERT_TRUE(IsSame(jsEngine, value, value2)); |
sergei
2017/04/20 12:45:08
I think we should rather try to use EXPECT_ when i
hub
2017/04/20 13:01:46
I used ASSERT_ for consistency. EXPECT_ is fine to
|
+ } |
+ { |
+ auto value = jsEngine->NewValue(12345678901234); |
+ ASSERT_TRUE(value.IsNumber()); |
+ ASSERT_EQ(12345678901234, value.AsInt()); |
+ |
+ AdblockPlus::JsValue value2(value); |
+ ASSERT_TRUE(value2.IsNumber()); |
+ ASSERT_EQ(12345678901234, value2.AsInt()); |
+ |
+ ASSERT_TRUE(IsSame(jsEngine, value, value2)); |
+ } |
+ { |
+ auto value = jsEngine->NewValue(true); |
+ ASSERT_TRUE(value.IsBool()); |
+ ASSERT_TRUE(value.AsBool()); |
+ |
+ AdblockPlus::JsValue value2(value); |
+ ASSERT_TRUE(value2.IsBool()); |
+ ASSERT_TRUE(value2.AsBool()); |
+ |
+ ASSERT_TRUE(IsSame(jsEngine, value, value2)); |
+ } |
+ { |
+ auto value = jsEngine->NewObject(); |
+ ASSERT_TRUE(value.IsObject()); |
+ ASSERT_EQ(0u, value.GetOwnPropertyNames().size()); |
+ |
+ AdblockPlus::JsValue value2(value); |
+ ASSERT_TRUE(value2.IsObject()); |
+ ASSERT_EQ(0u, value2.GetOwnPropertyNames().size()); |
+ |
+ ASSERT_TRUE(IsSame(jsEngine, value, value2)); |
+ } |
} |
TEST_F(JsEngineTest, EventCallbacks) |
{ |
bool callbackCalled = false; |
- AdblockPlus::JsConstValueList callbackParams; |
+ AdblockPlus::JsValueList callbackParams; |
auto Callback = [&callbackCalled, & callbackParams]( |
- const AdblockPlus::JsConstValueList& params) |
+ const AdblockPlus::JsValueList& params) |
{ |
callbackCalled = true; |
callbackParams = params; |
}; |
// Trigger event without a callback |
callbackCalled = false; |
jsEngine->Evaluate("_triggerEvent('foobar')"); |
ASSERT_FALSE(callbackCalled); |
// Set callback |
jsEngine->SetEventCallback("foobar", Callback); |
callbackCalled = false; |
jsEngine->Evaluate("_triggerEvent('foobar', 1, 'x', true)"); |
ASSERT_TRUE(callbackCalled); |
ASSERT_EQ(callbackParams.size(), 3u); |
- ASSERT_EQ(callbackParams[0]->AsInt(), 1); |
- ASSERT_EQ(callbackParams[1]->AsString(), "x"); |
- ASSERT_TRUE(callbackParams[2]->AsBool()); |
+ ASSERT_EQ(callbackParams[0].AsInt(), 1); |
+ ASSERT_EQ(callbackParams[1].AsString(), "x"); |
+ ASSERT_TRUE(callbackParams[2].AsBool()); |
// Trigger a different event |
callbackCalled = false; |
jsEngine->Evaluate("_triggerEvent('barfoo')"); |
ASSERT_FALSE(callbackCalled); |
// Remove callback |
jsEngine->RemoveEventCallback("foobar"); |
@@ -123,14 +183,14 @@ |
AdblockPlus::WebRequestPtr webRequest(new AdblockPlus::DefaultWebRequest()); |
jsEngine->SetWebRequest(webRequest); |
ASSERT_EQ(webRequest, jsEngine->GetWebRequest()); |
} |
TEST(NewJsEngineTest, GlobalPropertyTest) |
{ |
AdblockPlus::JsEnginePtr jsEngine(AdblockPlus::JsEngine::New()); |
- jsEngine->SetGlobalProperty("foo", *jsEngine->NewValue("bar")); |
+ jsEngine->SetGlobalProperty("foo", jsEngine->NewValue("bar")); |
AdblockPlus::JsValuePtr foo = jsEngine->Evaluate("foo"); |
ASSERT_TRUE(foo->IsString()); |
ASSERT_EQ(foo->AsString(), "bar"); |
} |