1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "gin/converter.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <limits.h> 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/basictypes.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/compiler_specific.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "gin/public/isolate_holder.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "gin/test/v8_test.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "v8/include/v8.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using v8::Array; 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using v8::Boolean; 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using v8::Handle; 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using v8::HandleScope; 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using v8::Integer; 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using v8::Null; 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using v8::Number; 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using v8::Object; 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using v8::String; 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using v8::Undefined; 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using v8::Value; 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace gin { 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef V8Test ConverterTest; 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ConverterTest, Bool) { 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) HandleScope handle_scope(instance_->isolate()); 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(Converter<bool>::ToV8(instance_->isolate(), true)->StrictEquals( 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Boolean::New(instance_->isolate(), true))); 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(Converter<bool>::ToV8(instance_->isolate(), false)->StrictEquals( 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Boolean::New(instance_->isolate(), false))); 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) struct { 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Handle<Value> input; 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool expected; 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } test_data[] = { 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { Boolean::New(instance_->isolate(), false).As<Value>(), false }, 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { Boolean::New(instance_->isolate(), true).As<Value>(), true }, 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { Number::New(instance_->isolate(), 0).As<Value>(), false }, 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { Number::New(instance_->isolate(), 1).As<Value>(), true }, 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { Number::New(instance_->isolate(), -1).As<Value>(), true }, 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { Number::New(instance_->isolate(), 0.1).As<Value>(), true }, 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { String::NewFromUtf8(instance_->isolate(), "").As<Value>(), false }, 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { String::NewFromUtf8(instance_->isolate(), "foo").As<Value>(), true }, 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { Object::New(instance_->isolate()).As<Value>(), true }, 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { Null(instance_->isolate()).As<Value>(), false }, 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { Undefined(instance_->isolate()).As<Value>(), false }, 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool result = false; 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(Converter<bool>::FromV8(instance_->isolate(), 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_data[i].input, &result)); 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(test_data[i].expected, result); 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) result = true; 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(Converter<bool>::FromV8(instance_->isolate(), 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_data[i].input, &result)); 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(test_data[i].expected, result); 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ConverterTest, Int32) { 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) HandleScope handle_scope(instance_->isolate()); 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int test_data_to[] = {-1, 0, 1}; 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data_to); ++i) { 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(Converter<int32_t>::ToV8(instance_->isolate(), test_data_to[i]) 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ->StrictEquals( 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Integer::New(instance_->isolate(), test_data_to[i]))); 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) struct { 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) v8::Handle<v8::Value> input; 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool expect_sucess; 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int expected_result; 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } test_data_from[] = { 86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { Boolean::New(instance_->isolate(), false).As<Value>(), false, 0 }, 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { Boolean::New(instance_->isolate(), true).As<Value>(), false, 0 }, 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { Integer::New(instance_->isolate(), -1).As<Value>(), true, -1 }, 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { Integer::New(instance_->isolate(), 0).As<Value>(), true, 0 }, 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { Integer::New(instance_->isolate(), 1).As<Value>(), true, 1 }, 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { Number::New(instance_->isolate(), -1).As<Value>(), true, -1 }, 920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { Number::New(instance_->isolate(), 1.1).As<Value>(), false, 0 }, 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { String::NewFromUtf8(instance_->isolate(), "42").As<Value>(), false, 0 }, 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { String::NewFromUtf8(instance_->isolate(), "foo").As<Value>(), false, 0 }, 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { Object::New(instance_->isolate()).As<Value>(), false, 0 }, 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { Array::New(instance_->isolate()).As<Value>(), false, 0 }, 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { v8::Null(instance_->isolate()).As<Value>(), false, 0 }, 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { v8::Undefined(instance_->isolate()).As<Value>(), false, 0 }, 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data_from); ++i) { 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int32_t result = std::numeric_limits<int32_t>::min(); 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool success = Converter<int32_t>::FromV8(instance_->isolate(), 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_data_from[i].input, &result); 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(test_data_from[i].expect_sucess, success) << i; 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (success) 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(test_data_from[i].expected_result, result) << i; 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ConverterTest, Vector) { 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) HandleScope handle_scope(instance_->isolate()); 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<int> expected; 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) expected.push_back(-1); 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) expected.push_back(0); 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) expected.push_back(1); 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Handle<Array> js_array = Handle<Array>::Cast( 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Converter<std::vector<int> >::ToV8(instance_->isolate(), expected)); 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_FALSE(js_array.IsEmpty()); 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(3u, js_array->Length()); 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < expected.size(); ++i) { 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(Integer::New(instance_->isolate(), expected[i]) 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ->StrictEquals(js_array->Get(static_cast<int>(i)))); 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<int> actual; 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(Converter<std::vector<int> >::FromV8(instance_->isolate(), 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) js_array, &actual)); 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(expected, actual); 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace gin 135