15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/test_resource_array.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/dev/resource_array_dev.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/image_data.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/input_event.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/testing_instance.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)REGISTER_TEST_CASE(ResourceArray);
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pp::InputEvent CreateMouseEvent(pp::Instance* instance,
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                PP_InputEvent_Type type,
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                PP_InputEvent_MouseButton buttons) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pp::MouseInputEvent(
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      100,  // time_stamp
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,  // modifiers
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      buttons,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Point(),  // position
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1,  // click count
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Point());  // movement
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pp::ImageData CreateImageData(pp::Instance* instance) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pp::ImageData(
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_IMAGEDATAFORMAT_RGBA_PREMUL,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Size(1, 1),
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestResourceArray::TestResourceArray(TestingInstance* instance)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : TestCase(instance) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestResourceArray::~TestResourceArray() {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestResourceArray::RunTests(const std::string& filter) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RUN_TEST(Basics, filter);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RUN_TEST(OutOfRangeAccess, filter);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RUN_TEST(EmptyArray, filter);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RUN_TEST(InvalidElement, filter);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestResourceArray::TestBasics() {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::InputEvent mouse_event_1 = CreateMouseEvent(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_, PP_INPUTEVENT_TYPE_MOUSEDOWN, PP_INPUTEVENT_MOUSEBUTTON_LEFT);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::InputEvent mouse_event_2 = CreateMouseEvent(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_, PP_INPUTEVENT_TYPE_MOUSEUP, PP_INPUTEVENT_MOUSEBUTTON_RIGHT);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::ImageData image_data = CreateImageData(instance_);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Resource elements[] = {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mouse_event_1.pp_resource(),
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mouse_event_2.pp_resource(),
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    image_data.pp_resource()
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t size = sizeof(elements) / sizeof(elements[0]);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::ResourceArray_Dev resource_array(instance_, elements, size);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size, resource_array.size());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (uint32_t index = 0; index < size; ++index)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(elements[index], resource_array[index]);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestResourceArray::TestOutOfRangeAccess() {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::InputEvent mouse_event_1 = CreateMouseEvent(
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_, PP_INPUTEVENT_TYPE_MOUSEDOWN, PP_INPUTEVENT_MOUSEBUTTON_LEFT);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::InputEvent mouse_event_2 = CreateMouseEvent(
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_, PP_INPUTEVENT_TYPE_MOUSEUP, PP_INPUTEVENT_MOUSEBUTTON_RIGHT);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::ImageData image_data = CreateImageData(instance_);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Resource elements[] = {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mouse_event_1.pp_resource(),
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mouse_event_2.pp_resource(),
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    image_data.pp_resource()
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t size = sizeof(elements) / sizeof(elements[0]);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::ResourceArray_Dev resource_array(instance_, elements, size);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, resource_array[size]);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, resource_array[size + 1]);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestResourceArray::TestEmptyArray() {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::ResourceArray_Dev resource_array(instance_, NULL, 0);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, resource_array.size());
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestResourceArray::TestInvalidElement() {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::InputEvent mouse_event = CreateMouseEvent(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_, PP_INPUTEVENT_TYPE_MOUSEDOWN, PP_INPUTEVENT_MOUSEBUTTON_LEFT);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::ImageData image_data = CreateImageData(instance_);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Resource elements[] = {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mouse_event.pp_resource(),
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    image_data.pp_resource()
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t size = sizeof(elements) / sizeof(elements[0]);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::ResourceArray_Dev resource_array(instance_, elements, size);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(size, resource_array.size());
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (uint32_t index = 0; index < size; ++index)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(elements[index], resource_array[index]);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
124