Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: test/JsValue.cpp

Issue 10213003: Make JsEngine::Evaluate() return a wrapper for v8::Value to accessdifferent variable types easily (Closed)
Patch Set: Added tests, resolved type conversion ambiguities, implemented some missing API calls Created April 15, 2013, 6:23 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: test/JsValue.cpp
===================================================================
new file mode 100644
--- /dev/null
+++ b/test/JsValue.cpp
@@ -0,0 +1,215 @@
+#include <AdblockPlus.h>
+#include <gtest/gtest.h>
+
+class ThrowingErrorCallback : public AdblockPlus::ErrorCallback
+{
+public:
+ void operator()(const std::string& message)
+ {
+ throw std::runtime_error("Unexpected error: " + message);
+ }
+};
+
+TEST(JsValueTest, UndefinedValue)
+{
+ ThrowingErrorCallback errorCallback;
+ AdblockPlus::JsEngine jsEngine(0, 0, &errorCallback);
+ AdblockPlus::JsValuePtr value = jsEngine.Evaluate("undefined");
+ ASSERT_TRUE(value->IsUndefined());
+ ASSERT_FALSE(value->IsNull());
+ ASSERT_FALSE(value->IsString());
+ ASSERT_FALSE(value->IsBool());
+ ASSERT_FALSE(value->IsNumber());
+ ASSERT_FALSE(value->IsObject());
+ ASSERT_FALSE(value->IsArray());
+ ASSERT_FALSE(value->IsFunction());
+ ASSERT_EQ("undefined", value->AsString());
+ ASSERT_FALSE(value->AsBool());
+ ASSERT_ANY_THROW(value->AsList());
+ ASSERT_ANY_THROW(value->GetProperty("foo"));
+ ASSERT_ANY_THROW(value->SetProperty("foo", false));
+ ASSERT_ANY_THROW(value->GetClassName());
+ ASSERT_ANY_THROW(value->Call());
+}
+
+TEST(JsValueTest, NullValue)
+{
+ ThrowingErrorCallback errorCallback;
+ AdblockPlus::JsEngine jsEngine(0, 0, &errorCallback);
+ AdblockPlus::JsValuePtr value = jsEngine.Evaluate("null");
+ ASSERT_FALSE(value->IsUndefined());
+ ASSERT_TRUE(value->IsNull());
+ ASSERT_FALSE(value->IsString());
+ ASSERT_FALSE(value->IsBool());
+ ASSERT_FALSE(value->IsNumber());
+ ASSERT_FALSE(value->IsObject());
+ ASSERT_FALSE(value->IsArray());
+ ASSERT_FALSE(value->IsFunction());
+ ASSERT_EQ("null", value->AsString());
+ ASSERT_FALSE(value->AsBool());
+ ASSERT_ANY_THROW(value->AsList());
+ ASSERT_ANY_THROW(value->GetProperty("foo"));
+ ASSERT_ANY_THROW(value->SetProperty("foo", false));
+ ASSERT_ANY_THROW(value->GetClassName());
+ ASSERT_ANY_THROW(value->Call());
+}
+
+TEST(JsValueTest, StringValue)
+{
+ ThrowingErrorCallback errorCallback;
+ AdblockPlus::JsEngine jsEngine(0, 0, &errorCallback);
+ AdblockPlus::JsValuePtr value = jsEngine.Evaluate("'123'");
+ ASSERT_FALSE(value->IsUndefined());
+ ASSERT_FALSE(value->IsNull());
+ ASSERT_TRUE(value->IsString());
+ ASSERT_FALSE(value->IsBool());
+ ASSERT_FALSE(value->IsNumber());
+ ASSERT_FALSE(value->IsObject());
+ ASSERT_FALSE(value->IsArray());
+ ASSERT_FALSE(value->IsFunction());
+ ASSERT_EQ("123", value->AsString());
+ ASSERT_EQ(123, value->AsInt());
+ ASSERT_TRUE(value->AsBool());
+ ASSERT_ANY_THROW(value->AsList());
+ ASSERT_ANY_THROW(value->GetProperty("foo"));
+ ASSERT_ANY_THROW(value->SetProperty("foo", false));
+ ASSERT_ANY_THROW(value->GetClassName());
+ ASSERT_ANY_THROW(value->Call());
+}
+
+TEST(JsValueTest, IntValue)
+{
+ ThrowingErrorCallback errorCallback;
+ AdblockPlus::JsEngine jsEngine(0, 0, &errorCallback);
+ AdblockPlus::JsValuePtr value = jsEngine.Evaluate("123");
+ ASSERT_FALSE(value->IsUndefined());
+ ASSERT_FALSE(value->IsNull());
+ ASSERT_FALSE(value->IsString());
+ ASSERT_FALSE(value->IsBool());
+ ASSERT_TRUE(value->IsNumber());
+ ASSERT_FALSE(value->IsObject());
+ ASSERT_FALSE(value->IsArray());
+ ASSERT_FALSE(value->IsFunction());
+ ASSERT_EQ("123", value->AsString());
+ ASSERT_EQ(123, value->AsInt());
+ ASSERT_TRUE(value->AsBool());
+ ASSERT_ANY_THROW(value->AsList());
+ ASSERT_ANY_THROW(value->GetProperty("foo"));
+ ASSERT_ANY_THROW(value->SetProperty("foo", false));
+ ASSERT_ANY_THROW(value->GetClassName());
+ ASSERT_ANY_THROW(value->Call());
+}
+
+TEST(JsValueTest, BoolValue)
+{
+ ThrowingErrorCallback errorCallback;
+ AdblockPlus::JsEngine jsEngine(0, 0, &errorCallback);
+ AdblockPlus::JsValuePtr value = jsEngine.Evaluate("true");
+ ASSERT_FALSE(value->IsUndefined());
+ ASSERT_FALSE(value->IsNull());
+ ASSERT_FALSE(value->IsString());
+ ASSERT_TRUE(value->IsBool());
+ ASSERT_FALSE(value->IsNumber());
+ ASSERT_FALSE(value->IsObject());
+ ASSERT_FALSE(value->IsArray());
+ ASSERT_FALSE(value->IsFunction());
+ ASSERT_EQ("true", value->AsString());
+ ASSERT_TRUE(value->AsBool());
+ ASSERT_ANY_THROW(value->AsList());
+ ASSERT_ANY_THROW(value->GetProperty("foo"));
+ ASSERT_ANY_THROW(value->SetProperty("foo", false));
+ ASSERT_ANY_THROW(value->GetClassName());
+ ASSERT_ANY_THROW(value->Call());
+}
+
+TEST(JsValueTest, ObjectValue)
+{
+ ThrowingErrorCallback errorCallback;
+ AdblockPlus::JsEngine jsEngine(0, 0, &errorCallback);
+ const std::string source("\
+ function Foo() {\
+ this.x = 2;\
+ this.toString = function() {return 'foo';};\
+ this.valueOf = function() {return 123;};\
+ };\
+ new Foo()");
+ AdblockPlus::JsValuePtr value = jsEngine.Evaluate(source);
+ ASSERT_FALSE(value->IsUndefined());
+ ASSERT_FALSE(value->IsNull());
+ ASSERT_FALSE(value->IsString());
+ ASSERT_FALSE(value->IsBool());
+ ASSERT_FALSE(value->IsNumber());
+ ASSERT_TRUE(value->IsObject());
+ ASSERT_FALSE(value->IsArray());
+ ASSERT_FALSE(value->IsFunction());
+ ASSERT_EQ("foo", value->AsString());
+ ASSERT_EQ(123, value->AsInt());
+ ASSERT_TRUE(value->AsBool());
+ ASSERT_ANY_THROW(value->AsList());
+ ASSERT_EQ(2, value->GetProperty("x")->AsInt());
+ value->SetProperty("x", 12);
+ ASSERT_EQ(12, value->GetProperty("x")->AsInt());
+ ASSERT_EQ("Foo", value->GetClassName());
+ ASSERT_ANY_THROW(value->Call());
+}
+
+TEST(JsValueTest, ArrayValue)
+{
+ ThrowingErrorCallback errorCallback;
+ AdblockPlus::JsEngine jsEngine(0, 0, &errorCallback);
+ AdblockPlus::JsValuePtr value = jsEngine.Evaluate("[5,8,12]");
+ ASSERT_FALSE(value->IsUndefined());
+ ASSERT_FALSE(value->IsNull());
+ ASSERT_FALSE(value->IsString());
+ ASSERT_FALSE(value->IsBool());
+ ASSERT_FALSE(value->IsNumber());
+ ASSERT_TRUE(value->IsObject());
+ ASSERT_TRUE(value->IsArray());
+ ASSERT_FALSE(value->IsFunction());
+ ASSERT_EQ("5,8,12", value->AsString());
+ ASSERT_TRUE(value->AsBool());
+ ASSERT_EQ(3u, value->AsList().size());
+ ASSERT_EQ(8, value->AsList()[1]->AsInt());
+ ASSERT_EQ(3, value->GetProperty("length")->AsInt());
+ ASSERT_EQ("Array", value->GetClassName());
+ ASSERT_ANY_THROW(value->Call());
+}
+
+TEST(JsValueTest, FunctionValue)
+{
+ ThrowingErrorCallback errorCallback;
+ AdblockPlus::JsEngine jsEngine(0, 0, &errorCallback);
+ AdblockPlus::JsValuePtr value = jsEngine.Evaluate("(function(foo, bar) {return this.x + '/' + foo + '/' + bar;})");
+ ASSERT_FALSE(value->IsUndefined());
+ ASSERT_FALSE(value->IsNull());
+ ASSERT_FALSE(value->IsString());
+ ASSERT_FALSE(value->IsBool());
+ ASSERT_FALSE(value->IsNumber());
+ ASSERT_TRUE(value->IsObject());
+ ASSERT_FALSE(value->IsArray());
+ ASSERT_TRUE(value->IsFunction());
+ ASSERT_TRUE(value->AsBool());
+ ASSERT_ANY_THROW(value->AsList());
+ ASSERT_EQ(2, value->GetProperty("length")->AsInt());
+
+ AdblockPlus::JsValuePtr thisPtr = jsEngine.Evaluate("({x:2})");
+ AdblockPlus::JsValueList params;
+ params.push_back(jsEngine.NewValue(5));
+ params.push_back(jsEngine.NewValue("xyz"));
+ ASSERT_EQ("2/5/xyz", value->Call(params, thisPtr)->AsString());
+}
+
+TEST(JsValueTest, ThrowingCoversion)
+{
+ ThrowingErrorCallback errorCallback;
+ AdblockPlus::JsEngine jsEngine(0, 0, &errorCallback);
+ const std::string source("\
+ function Foo() {\
+ this.toString = function() {throw 'test1';};\
+ this.valueOf = function() {throw 'test2';};\
+ };\
+ new Foo()");
+ AdblockPlus::JsValuePtr value = jsEngine.Evaluate(source);
+ ASSERT_EQ("", value->AsString());
+ ASSERT_EQ(0, value->AsInt());
+}
« src/FilterEngine.cpp ('K') | « test/JsEngine.cpp ('k') | test/WebRequest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld