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