172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <vector> 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/compiler_specific.h" 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/string_util.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebBindings.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/cpp_variant.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing WebKit::WebBindings; 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Creates a std::string from an NPVariant of string type. If the NPVariant 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// is not a string, empties the std::string. 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MakeStdString(const NPVariant& np, std::string* std_string) { 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (np.type == NPVariantType_String) { 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* chars = 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch reinterpret_cast<const char*>(np.value.stringValue.UTF8Characters); 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (*std_string).assign(chars, np.value.stringValue.UTF8Length); 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (*std_string).clear(); 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Verifies that the actual NPVariant is a string and that its value matches 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the expected_str. 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CheckString(const std::string& expected_str, const NPVariant& actual) { 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NPVariantType_String, actual.type); 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string actual_str; 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MakeStdString(actual, &actual_str); 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(expected_str, actual_str); 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Verifies that both the actual and the expected NPVariants are strings and 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// that their values match. 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CheckString(const NPVariant& expected, const NPVariant& actual) { 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NPVariantType_String, expected.type); 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string expected_str; 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MakeStdString(expected, &expected_str); 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckString(expected_str, actual); 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint g_allocate_call_count = 0; 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint g_deallocate_call_count = 0; 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CheckObject(const NPVariant& actual) { 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NPVariantType_Object, actual.type); 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(actual.value.objectValue); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, actual.value.objectValue->referenceCount); 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1, g_allocate_call_count); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0, g_deallocate_call_count); 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochNPObject* MockNPAllocate(NPP npp, NPClass* aClass) { 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This is a mock allocate method that mimics the behavior 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // of WebBindings::createObject when allocate() is NULL 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ++g_allocate_call_count; 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Ignore npp and NPClass 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return reinterpret_cast<NPObject*>(malloc(sizeof(NPObject))); 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid MockNPDeallocate(NPObject* npobj) { 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This is a mock deallocate method that mimics the behavior 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // of NPN_DeallocateObject when deallocate() is NULL 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ++g_deallocate_call_count; 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch free(npobj); 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic NPClass void_class = { NP_CLASS_STRUCT_VERSION, 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockNPAllocate, 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MockNPDeallocate, 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochNPObject* MakeVoidObject() { 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_allocate_call_count = 0; 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_deallocate_call_count = 0; 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return WebBindings::createObject(NULL, &void_class); 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CppVariantTest, NewVariantHasNullType) { 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant value; 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NPVariantType_Null, value.type); 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CppVariantTest, SetNullSetsType) { 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant value; 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch value.Set(17); 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch value.SetNull(); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NPVariantType_Null, value.type); 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CppVariantTest, CopyConstructorDoesDeepCopy) { 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant source; 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source.Set("test string"); 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant dest = source; 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NPVariantType_String, dest.type); 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NPVariantType_String, source.type); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Ensure that the string was copied, not just the pointer. 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(source.value.stringValue.UTF8Characters, 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dest.value.stringValue.UTF8Characters); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckString(source, dest); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CppVariantTest, CopyConstructorIncrementsRefCount) { 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant source; 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NPObject *object = MakeVoidObject(); 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source.Set(object); 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 2 references so far. 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(2U, source.value.objectValue->referenceCount); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant dest = source; 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(3U, dest.value.objectValue->referenceCount); 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1, g_allocate_call_count); 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseObject(object); 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source.SetNull(); 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckObject(dest); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CppVariantTest, AssignmentDoesDeepCopy) { 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant source; 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source.Set("test string"); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant dest; 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dest = source; 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NPVariantType_String, dest.type); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NPVariantType_String, source.type); 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Ensure that the string was copied, not just the pointer. 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_NE(source.value.stringValue.UTF8Characters, 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dest.value.stringValue.UTF8Characters); 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckString(source, dest); 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CppVariantTest, AssignmentIncrementsRefCount) { 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant source; 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NPObject *object = MakeVoidObject(); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source.Set(object); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 2 references so far. 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(2U, source.value.objectValue->referenceCount); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant dest; 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dest = source; 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(3U, dest.value.objectValue->referenceCount); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1, g_allocate_call_count); 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseObject(object); 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source.SetNull(); 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckObject(dest); 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CppVariantTest, DestroyingCopyDoesNotCorruptSource) { 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant source; 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source.Set("test string"); 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string before; 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MakeStdString(source, &before); 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant dest = source; 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckString(before, source); 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NPObject *object = MakeVoidObject(); 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch source.Set(object); 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant dest2 = source; 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseObject(object); 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckObject(source); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CppVariantTest, CopiesTypeAndValueToNPVariant) { 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NPVariant np; 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant cpp; 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(true); 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.CopyToNPVariant(&np); 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(cpp.type, np.type); 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(cpp.value.boolValue, np.value.boolValue); 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseVariantValue(&np); 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(17); 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.CopyToNPVariant(&np); 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(cpp.type, np.type); 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(cpp.value.intValue, np.value.intValue); 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseVariantValue(&np); 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(3.1415); 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.CopyToNPVariant(&np); 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(cpp.type, np.type); 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(cpp.value.doubleValue, np.value.doubleValue); 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseVariantValue(&np); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set("test value"); 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.CopyToNPVariant(&np); 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckString("test value", np); 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseVariantValue(&np); 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.SetNull(); 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.CopyToNPVariant(&np); 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(cpp.type, np.type); 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseVariantValue(&np); 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NPObject *object = MakeVoidObject(); 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(object); 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.CopyToNPVariant(&np); 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseObject(object); 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.SetNull(); 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckObject(np); 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseVariantValue(&np); 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CppVariantTest, SetsTypeAndValueFromNPVariant) { 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NPVariant np; 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant cpp; 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch VOID_TO_NPVARIANT(np); 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(np); 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(np.type, cpp.type); 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseVariantValue(&np); 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NULL_TO_NPVARIANT(np); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(np); 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(np.type, cpp.type); 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseVariantValue(&np); 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BOOLEAN_TO_NPVARIANT(true, np); 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(np); 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(np.type, cpp.type); 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(np.value.boolValue, cpp.value.boolValue); 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseVariantValue(&np); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch INT32_TO_NPVARIANT(15, np); 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(np); 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(np.type, cpp.type); 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(np.value.intValue, cpp.value.intValue); 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseVariantValue(&np); 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DOUBLE_TO_NPVARIANT(2.71828, np); 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(np); 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(np.type, cpp.type); 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(np.value.doubleValue, cpp.value.doubleValue); 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseVariantValue(&np); 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NPString np_ascii_str = { "1st test value", 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<uint32_t>(strlen("1st test value")) }; 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::initializeVariantWithStringCopy(&np, &np_ascii_str); 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(np); 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckString("1st test value", cpp); 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseVariantValue(&np); 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Test characters represented in 2/3/4 bytes in UTF-8 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Greek alpha, Chinese number 1 (horizontal bar), 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Deseret letter (similar to 'O') 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NPString np_intl_str = { "\xce\xb1\xe4\xb8\x80\xf0\x90\x90\x84", 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<uint32_t>(strlen( 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "\xce\xb1\xe4\xb8\x80\xf0\x90\x90\x84")) }; 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::initializeVariantWithStringCopy(&np, &np_intl_str); 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(np); 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckString("\xce\xb1\xe4\xb8\x80\xf0\x90\x90\x84", cpp); 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseVariantValue(&np); 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NPObject *obj = MakeVoidObject(); 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OBJECT_TO_NPVARIANT(obj, np); // Doesn't make a copy. 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(np); 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Use this or WebBindings::releaseObject but NOT both. 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseVariantValue(&np); 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckObject(cpp); 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CppVariantTest, SetsSimpleTypesAndValues) { 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant cpp; 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(true); 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NPVariantType_Bool, cpp.type); 27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(cpp.value.boolValue); 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(5); 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NPVariantType_Int32, cpp.type); 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(5, cpp.value.intValue); 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(1.234); 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NPVariantType_Double, cpp.type); 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1.234, cpp.value.doubleValue); 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // C string 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set("1st test string"); 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckString("1st test string", cpp); 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // std::string 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string source("std test string"); 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(source); 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckString("std test string", cpp); 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // NPString 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NPString np_ascii_str = { "test NPString", 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<uint32_t>(strlen("test NPString")) }; 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(np_ascii_str); 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string expected("test NPString"); 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckString(expected, cpp); 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Test characters represented in 2/3/4 bytes in UTF-8 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Greek alpha, Chinese number 1 (horizontal bar), 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Deseret letter (similar to 'O') 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NPString np_intl_str = { "\xce\xb1\xe4\xb8\x80\xf0\x90\x90\x84", 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<uint32_t>(strlen( 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "\xce\xb1\xe4\xb8\x80\xf0\x90\x90\x84")) }; 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(np_intl_str); 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch expected = std::string("\xce\xb1\xe4\xb8\x80\xf0\x90\x90\x84"); 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckString(expected, cpp); 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NPObject* obj = MakeVoidObject(); 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(obj); 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseObject(obj); 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckObject(cpp); 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CppVariantTest, FreeDataSetsToVoid) { 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant cpp; 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NPVariantType_Null, cpp.type); 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(12); 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NPVariantType_Int32, cpp.type); 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.FreeData(); 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NPVariantType_Void, cpp.type); 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CppVariantTest, FreeDataReleasesObject) { 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant cpp; 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NPObject* object = MakeVoidObject(); 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(object); 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(2U, object->referenceCount); 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.FreeData(); 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1U, object->referenceCount); 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0, g_deallocate_call_count); 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(object); 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseObject(object); 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(0, g_deallocate_call_count); 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.FreeData(); 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(1, g_deallocate_call_count); 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(CppVariantTest, IsTypeFunctionsWork) { 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CppVariant cpp; 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // These should not happen in practice, since voids are not supported 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This test must be first since it just clobbers internal data without 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // releasing. 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch VOID_TO_NPVARIANT(cpp); 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isBool()); 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isInt32()); 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isDouble()); 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isNumber()); 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isString()); 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(cpp.isVoid()); 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isNull()); 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(cpp.isEmpty()); 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(true); 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(cpp.isBool()); 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isInt32()); 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isDouble()); 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isNumber()); 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isString()); 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isVoid()); 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isNull()); 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isEmpty()); 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isObject()); 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(12); 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isBool()); 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(cpp.isInt32()); 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isDouble()); 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(cpp.isNumber()); 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isString()); 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isVoid()); 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isNull()); 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isEmpty()); 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isObject()); 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(3.1415); 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isBool()); 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isInt32()); 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(cpp.isDouble()); 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(cpp.isNumber()); 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isString()); 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isVoid()); 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isNull()); 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isEmpty()); 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isObject()); 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set("a string"); 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isBool()); 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isInt32()); 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isDouble()); 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isNumber()); 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(cpp.isString()); 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isVoid()); 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isNull()); 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isEmpty()); 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isObject()); 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.SetNull(); 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isBool()); 407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isInt32()); 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isDouble()); 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isNumber()); 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isString()); 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isVoid()); 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(cpp.isNull()); 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(cpp.isEmpty()); 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isObject()); 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NPObject *obj = MakeVoidObject(); 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cpp.Set(obj); 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isBool()); 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isInt32()); 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isDouble()); 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isNumber()); 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isString()); 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isVoid()); 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isNull()); 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(cpp.isEmpty()); 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(cpp.isObject()); 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebBindings::releaseObject(obj); 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CheckObject(cpp); 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 43072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 43172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool MockNPHasPropertyFunction(NPObject *npobj, NPIdentifier name) { 43272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return true; 43372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 43472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 43572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool MockNPGetPropertyFunction(NPObject *npobj, NPIdentifier name, 43672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NPVariant *result) { 43772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (WebBindings::getStringIdentifier("length") == name) { 43872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DOUBLE_TO_NPVARIANT(4, *result); 43972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else if (WebBindings::getIntIdentifier(0) == name) { 44072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DOUBLE_TO_NPVARIANT(0, *result); 44172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else if (WebBindings::getIntIdentifier(1) == name) { 44272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen BOOLEAN_TO_NPVARIANT(true, *result); 44372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else if (WebBindings::getIntIdentifier(2) == name) { 44472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NULL_TO_NPVARIANT(*result); 44572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else if (WebBindings::getIntIdentifier(3) == name) { 44672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const char* s = "string"; 44772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen size_t length = strlen(s); 44872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen char* mem = static_cast<char*>(malloc(length + 1)); 44972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen base::strlcpy(mem, s, length + 1); 45072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen STRINGZ_TO_NPVARIANT(mem, *result); 45172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 45272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 45372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return true; 45472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 45572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 45672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(CppVariantTest, ToVector) { 45772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NPClass array_like_class = { 45872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NP_CLASS_STRUCT_VERSION, 45972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 0, // NPAllocateFunctionPtr allocate; 46072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 0, // NPDeallocateFunctionPtr deallocate; 46172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 0, // NPInvalidateFunctionPtr invalidate; 46272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 0, // NPHasMethodFunctionPtr hasMethod; 46372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 0, // NPInvokeFunctionPtr invoke; 46472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 0, // NPInvokeDefaultFunctionPtr invokeDefault; 46572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MockNPHasPropertyFunction, // NPHasPropertyFunctionPtr hasProperty; 46672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MockNPGetPropertyFunction, // NPGetPropertyFunctionPtr getProperty; 46772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 0, // NPSetPropertyFunctionPtr setProperty; 46872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 0, // NPRemovePropertyFunctionPtr removeProperty; 46972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 0, // NPEnumerationFunctionPtr enumerate; 47072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 0 // NPConstructFunctionPtr construct; 47172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen }; 47272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 47372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NPObject* obj = WebBindings::createObject(NULL, &array_like_class); 47472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 47572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CppVariant cpp; 47672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen cpp.Set(obj); 47772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 47872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::vector<CppVariant> cpp_vector = cpp.ToVector(); 47972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(4u, cpp_vector.size()); 48072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 48172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(cpp_vector[0].isDouble()); 48272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(0, cpp_vector[0].ToDouble()); 48372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 48472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(cpp_vector[1].isBool()); 48572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(true, cpp_vector[1].ToBoolean()); 48672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 48772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(cpp_vector[2].isNull()); 48872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 48972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(cpp_vector[3].isString()); 49072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CheckString("string", cpp_vector[3]); 49172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 49272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen WebBindings::releaseObject(obj); 49372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 494