Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(978)

Unified Diff: device/gamepad/public/interfaces/gamepad_struct_traits_unittest.cc

Issue 2492183002: Add struct_traits and typemap for blink::WebGamepad (Closed)
Patch Set: code rebase Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: device/gamepad/public/interfaces/gamepad_struct_traits_unittest.cc
diff --git a/device/gamepad/public/interfaces/gamepad_struct_traits_unittest.cc b/device/gamepad/public/interfaces/gamepad_struct_traits_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..29c796bcad29606cd936b40785deba0487a26487
--- /dev/null
+++ b/device/gamepad/public/interfaces/gamepad_struct_traits_unittest.cc
@@ -0,0 +1,234 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "device/gamepad/public/interfaces/gamepad_struct_traits_test.mojom.h"
+#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/interface_request.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/WebKit/public/platform/WebGamepad.h"
+
+namespace device {
+
+namespace {
+
+enum GamepadTestDataType {
+ GamepadCommon = 0,
+ GamepadPose_HasOrientation = 1,
+ GamepadPose_HasPosition = 2,
+ GamepadPose_Null = 3,
+};
+
+blink::WebGamepad GetWebGamepadInstance(GamepadTestDataType type) {
+ blink::WebGamepadButton wgb(true, false, 1.0f);
+
+ blink::WebGamepadVector wgv;
+ memset(&wgv, 0, sizeof(blink::WebGamepadVector));
+ wgv.notNull = true;
+ wgv.x = wgv.y = wgv.z = 1.0f;
+
+ blink::WebGamepadQuaternion wgq;
+ memset(&wgq, 0, sizeof(blink::WebGamepadQuaternion));
+ wgq.notNull = true;
+ wgq.x = wgq.y = wgq.z = wgq.w = 2.0f;
+
+ blink::WebGamepadPose wgp;
+ memset(&wgp, 0, sizeof(blink::WebGamepadPose));
+ if (type == GamepadPose_Null) {
+ wgp.notNull = false;
+ } else if (type == GamepadCommon) {
+ wgp.notNull = wgp.hasOrientation = wgp.hasPosition = true;
+ wgp.orientation = wgq;
+ wgp.position = wgv;
+ wgp.angularAcceleration = wgv;
+ } else if (type == GamepadPose_HasOrientation) {
+ wgp.notNull = wgp.hasOrientation = true;
+ wgp.hasPosition = false;
+ wgp.orientation = wgq;
+ wgp.angularAcceleration = wgv;
+ } else if (type == GamepadPose_HasPosition) {
+ wgp.notNull = wgp.hasPosition = true;
+ wgp.hasOrientation = false;
+ wgp.position = wgv;
+ wgp.angularAcceleration = wgv;
+ }
+
+ blink::WebUChar wch[blink::WebGamepad::mappingLengthCap] = {
+ 1, 8, 9, 127, 128, 1024, 1025, 1949,
+ 2047, 2048, 16383, 16384, 20000, 32767, 32768, 65535};
+
+ blink::WebGamepad send;
+ memset(&send, 0, sizeof(blink::WebGamepad));
+
+ send.connected = true;
+ for (size_t i = 0; i < blink::WebGamepad::mappingLengthCap; i++) {
+ send.id[i] = send.mapping[i] = wch[i];
+ }
+ send.timestamp = 1234567890123456789ULL;
+ send.axesLength = 0U;
+ for (size_t i = 0; i < blink::WebGamepad::axesLengthCap; i++) {
+ send.axesLength++;
+ send.axes[i] = 1.0;
+ }
+ send.buttonsLength = 0U;
+ for (size_t i = 0; i < blink::WebGamepad::buttonsLengthCap; i++) {
+ send.buttonsLength++;
+ send.buttons[i] = wgb;
+ }
+ send.pose = wgp;
+ send.hand = blink::WebGamepadHand::GamepadHandRight;
+ send.displayId = static_cast<unsigned short>(16);
+
+ return send;
+}
+
+bool isWebGamepadButtonEqual(const blink::WebGamepadButton& lhs,
+ const blink::WebGamepadButton& rhs) {
+ return (lhs.pressed == rhs.pressed && lhs.touched == rhs.touched &&
+ lhs.value == rhs.value);
+}
+
+bool isWebGamepadVectorEqual(const blink::WebGamepadVector& lhs,
+ const blink::WebGamepadVector& rhs) {
+ return ((lhs.notNull == false && rhs.notNull == false) ||
+ (lhs.notNull == rhs.notNull && lhs.x == rhs.x && lhs.y == rhs.y &&
+ lhs.z == rhs.z));
+}
+
+bool isWebGamepadQuaternionEqual(const blink::WebGamepadQuaternion& lhs,
+ const blink::WebGamepadQuaternion& rhs) {
+ return ((lhs.notNull == false && rhs.notNull == false) ||
+ (lhs.notNull == rhs.notNull && lhs.x == rhs.x && lhs.y == rhs.y &&
+ lhs.z == rhs.z && lhs.w == rhs.w));
+}
+
+bool isWebGamepadPoseEqual(const blink::WebGamepadPose& lhs,
+ const blink::WebGamepadPose& rhs) {
+ if (lhs.notNull == false && rhs.notNull == false) {
+ return true;
+ }
+ if (lhs.notNull != rhs.notNull || lhs.hasOrientation != rhs.hasOrientation ||
+ lhs.hasPosition != rhs.hasPosition ||
+ !isWebGamepadVectorEqual(lhs.angularVelocity, rhs.angularVelocity) ||
+ !isWebGamepadVectorEqual(lhs.linearVelocity, rhs.linearVelocity) ||
+ !isWebGamepadVectorEqual(lhs.angularAcceleration,
+ rhs.angularAcceleration) ||
+ !isWebGamepadVectorEqual(lhs.linearAcceleration,
+ rhs.linearAcceleration)) {
+ return false;
+ }
+ if (lhs.hasOrientation &&
+ !isWebGamepadQuaternionEqual(lhs.orientation, rhs.orientation)) {
+ return false;
+ }
+ if (lhs.hasPosition && !isWebGamepadVectorEqual(lhs.position, rhs.position)) {
+ return false;
+ }
+ return true;
+}
+
+bool isWebGamepadEqual(const blink::WebGamepad& send,
+ const blink::WebGamepad& echo) {
+ if (send.connected != echo.connected || send.timestamp != echo.timestamp ||
+ send.axesLength != echo.axesLength ||
+ send.buttonsLength != echo.buttonsLength ||
+ !isWebGamepadPoseEqual(send.pose, echo.pose) || send.hand != echo.hand ||
+ send.displayId != echo.displayId) {
+ return false;
+ }
+ for (size_t i = 0; i < blink::WebGamepad::idLengthCap; i++) {
+ if (send.id[i] != echo.id[i]) {
+ return false;
+ }
+ }
+ for (size_t i = 0; i < blink::WebGamepad::axesLengthCap; i++) {
+ if (send.axes[i] != echo.axes[i]) {
+ return false;
+ }
+ }
+ for (size_t i = 0; i < blink::WebGamepad::buttonsLengthCap; i++) {
+ if (!isWebGamepadButtonEqual(send.buttons[i], echo.buttons[i])) {
+ return false;
+ }
+ }
+ for (size_t i = 0; i < blink::WebGamepad::mappingLengthCap; i++) {
+ if (send.mapping[i] != echo.mapping[i]) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void ExpectWebGamepad(const blink::WebGamepad& send,
+ const base::Closure& closure,
+ const blink::WebGamepad& echo) {
+ EXPECT_EQ(true, isWebGamepadEqual(send, echo));
+ closure.Run();
+}
+
+} // namespace
+
+class GamepadStructTraitsTest : public testing::Test,
+ public device::mojom::GamepadStructTraitsTest {
+ protected:
+ GamepadStructTraitsTest() : binding_(this) {}
+
+ void PassGamepad(const blink::WebGamepad& send,
+ const PassGamepadCallback& callback) override {
+ callback.Run(send);
+ }
+
+ device::mojom::GamepadStructTraitsTestPtr GetGamepadStructTraitsTestProxy() {
+ return binding_.CreateInterfacePtrAndBind();
+ }
+
+ private:
+ base::MessageLoop message_loop_;
+ mojo::Binding<device::mojom::GamepadStructTraitsTest> binding_;
+
+ DISALLOW_COPY_AND_ASSIGN(GamepadStructTraitsTest);
+};
+
+TEST_F(GamepadStructTraitsTest, GamepadCommon) {
+ blink::WebGamepad send = GetWebGamepadInstance(GamepadCommon);
+ base::RunLoop loop;
+ device::mojom::GamepadStructTraitsTestPtr proxy =
+ GetGamepadStructTraitsTestProxy();
+ proxy->PassGamepad(send,
+ base::Bind(&ExpectWebGamepad, send, loop.QuitClosure()));
+ loop.Run();
+}
+
+TEST_F(GamepadStructTraitsTest, GamepadPose_HasOrientation) {
+ blink::WebGamepad send = GetWebGamepadInstance(GamepadPose_HasOrientation);
+ base::RunLoop loop;
+ device::mojom::GamepadStructTraitsTestPtr proxy =
+ GetGamepadStructTraitsTestProxy();
+ proxy->PassGamepad(send,
+ base::Bind(&ExpectWebGamepad, send, loop.QuitClosure()));
+ loop.Run();
+}
+
+TEST_F(GamepadStructTraitsTest, GamepadPose_HasPosition) {
+ blink::WebGamepad send = GetWebGamepadInstance(GamepadPose_HasPosition);
+ base::RunLoop loop;
+ device::mojom::GamepadStructTraitsTestPtr proxy =
+ GetGamepadStructTraitsTestProxy();
+ proxy->PassGamepad(send,
+ base::Bind(&ExpectWebGamepad, send, loop.QuitClosure()));
+ loop.Run();
+}
+
+TEST_F(GamepadStructTraitsTest, GamepadPose_Null) {
+ blink::WebGamepad send = GetWebGamepadInstance(GamepadPose_Null);
+ base::RunLoop loop;
+ device::mojom::GamepadStructTraitsTestPtr proxy =
+ GetGamepadStructTraitsTestProxy();
+ proxy->PassGamepad(send,
+ base::Bind(&ExpectWebGamepad, send, loop.QuitClosure()));
+ loop.Run();
+}
+
+} // namespace device
« no previous file with comments | « device/gamepad/public/interfaces/gamepad_struct_traits_test.mojom ('k') | device/gamepad/public/interfaces/typemaps.gni » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698