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)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <cmath>
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <limits>
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/geometry/vector3d_f.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Vector3dTest, IsZero) {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Vector3dF float_zero(0, 0, 0);
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Vector3dF float_nonzero(0.1f, -0.1f, 0.1f);
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(float_zero.IsZero());
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(float_nonzero.IsZero());
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Vector3dTest, Add) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Vector3dF f1(3.1f, 5.1f, 2.7f);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Vector3dF f2(4.3f, -1.3f, 8.1f);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Vector3dF expected;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Vector3dF actual;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } float_tests[] = {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { gfx::Vector3dF(3.1F, 5.1F, 2.7f), f1 + gfx::Vector3dF() },
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { gfx::Vector3dF(3.1f + 4.3f, 5.1f - 1.3f, 2.7f + 8.1f), f1 + f2 },
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { gfx::Vector3dF(3.1f - 4.3f, 5.1f + 1.3f, 2.7f - 8.1f), f1 - f2 }
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(float_tests); ++i)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(float_tests[i].expected.ToString(),
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              float_tests[i].actual.ToString());
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Vector3dTest, Negative) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Vector3dF expected;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Vector3dF actual;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } float_tests[] = {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { gfx::Vector3dF(-0.0f, -0.0f, -0.0f), -gfx::Vector3dF(0, 0, 0) },
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { gfx::Vector3dF(-0.3f, -0.3f, -0.3f), -gfx::Vector3dF(0.3f, 0.3f, 0.3f) },
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { gfx::Vector3dF(0.3f, 0.3f, 0.3f), -gfx::Vector3dF(-0.3f, -0.3f, -0.3f) },
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { gfx::Vector3dF(-0.3f, 0.3f, -0.3f), -gfx::Vector3dF(0.3f, -0.3f, 0.3f) },
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { gfx::Vector3dF(0.3f, -0.3f, -0.3f), -gfx::Vector3dF(-0.3f, 0.3f, 0.3f) },
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { gfx::Vector3dF(-0.3f, -0.3f, 0.3f), -gfx::Vector3dF(0.3f, 0.3f, -0.3f) }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(float_tests); ++i)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(float_tests[i].expected.ToString(),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              float_tests[i].actual.ToString());
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Vector3dTest, Scale) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float triple_values[][6] = {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, 1.2f, 1.8f, 3.3f, 5.6f, 4.2f },
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, -1.2f, -1.8f, 3.3f, 5.6f, 4.2f },
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, 1.2f, -1.8f, 3.3f, 5.6f, 4.2f },
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, -1.2f -1.8f, 3.3f, 5.6f, 4.2f },
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, 1.2f, 1.8f, 3.3f, -5.6f, -4.2f },
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, 1.2f, 1.8f, -3.3f, -5.6f, -4.2f },
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, 1.2f, -1.8f, 3.3f, -5.6f, -4.2f },
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, 1.2f, -1.8f, -3.3f, -5.6f, -4.2f },
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -4.5f, 1.2f, 1.8f, 3.3f, 5.6f, 4.2f },
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -4.5f, 1.2f, 1.8f, 0, 5.6f, 4.2f },
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -4.5f, 1.2f, -1.8f, 3.3f, 5.6f, 4.2f },
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -4.5f, 1.2f, -1.8f, 0, 5.6f, 4.2f },
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -4.5f, 1.2f, 1.8f, 3.3f, 0, 4.2f },
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, 0, 1.8f, 3.3f, 5.6f, 4.2f },
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -4.5f, 1.2f, -1.8f, 3.3f, 0, 4.2f },
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, 0, -1.8f, 3.3f, 5.6f, 4.2f },
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -4.5f, 1.2f, 1.8f, 3.3f, 5.6f, 0 },
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -4.5f, 1.2f, -1.8f, 3.3f, 5.6f, 0 },
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 0, 1.2f, 0, 3.3f, 5.6f, 4.2f },
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 0, 1.2f, 1.8f, 3.3f, 5.6f, 4.2f }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(triple_values); ++i) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Vector3dF v(triple_values[i][0],
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     triple_values[i][1],
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     triple_values[i][2]);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    v.Scale(triple_values[i][3], triple_values[i][4], triple_values[i][5]);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(triple_values[i][0] * triple_values[i][3], v.x());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(triple_values[i][1] * triple_values[i][4], v.y());
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(triple_values[i][2] * triple_values[i][5], v.z());
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Vector3dF v2 = ScaleVector3d(
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gfx::Vector3dF(triple_values[i][0],
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       triple_values[i][1],
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       triple_values[i][2]),
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        triple_values[i][3], triple_values[i][4], triple_values[i][5]);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(triple_values[i][0] * triple_values[i][3], v2.x());
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(triple_values[i][1] * triple_values[i][4], v2.y());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(triple_values[i][2] * triple_values[i][5], v2.z());
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float single_values[][4] = {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, 1.2f, 1.8f, 3.3f },
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, -1.2f, 1.8f, 3.3f },
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, 1.2f, -1.8f, 3.3f },
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, -1.2f, -1.8f, 3.3f },
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -4.5f, 1.2f, 3.3f },
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -4.5f, 1.2f, 0 },
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -4.5f, 1.2f, 1.8f, 3.3f },
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -4.5f, 1.2f, 1.8f, 0 },
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, 0, 1.8f, 3.3f },
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 0, 1.2f, 1.8f, 3.3f },
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, 0, 1.8f, 3.3f },
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 0, 1.2f, 1.8f, 3.3f },
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, 1.2f, 0, 3.3f },
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 4.5f, 1.2f, 0, 3.3f }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(single_values); ++i) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Vector3dF v(single_values[i][0],
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     single_values[i][1],
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     single_values[i][2]);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    v.Scale(single_values[i][3]);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(single_values[i][0] * single_values[i][3], v.x());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(single_values[i][1] * single_values[i][3], v.y());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(single_values[i][2] * single_values[i][3], v.z());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Vector3dF v2 = ScaleVector3d(
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gfx::Vector3dF(single_values[i][0],
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       single_values[i][1],
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       single_values[i][2]),
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        single_values[i][3]);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(single_values[i][0] * single_values[i][3], v2.x());
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(single_values[i][1] * single_values[i][3], v2.y());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(single_values[i][2] * single_values[i][3], v2.z());
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Vector3dTest, Length) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float float_values[][3] = {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 0, 0, 0 },
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 10.5f, 20.5f, 8.5f },
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 20.5f, 10.5f, 8.5f },
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 8.5f, 20.5f, 10.5f },
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 10.5f, 8.5f, 20.5f },
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -10.5f, -20.5f, -8.5f },
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -20.5f, 10.5f, -8.5f },
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -8.5f, -20.5f, -10.5f },
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -10.5f, -8.5f, -20.5f },
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 10.5f, -20.5f, 8.5f },
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -10.5f, 20.5f, 8.5f },
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 10.5f, -20.5f, -8.5f },
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { -10.5f, 20.5f, -8.5f },
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A large vector that fails if the Length function doesn't use
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // double precision internally.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 1236278317862780234892374893213178027.12122348904204230f,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      335890352589839028212313231225425134332.38123f,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      27861786423846742743236423478236784678.236713617231f }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(float_values); ++i) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double v0 = float_values[i][0];
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double v1 = float_values[i][1];
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double v2 = float_values[i][2];
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double length_squared =
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<double>(v0) * v0 +
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<double>(v1) * v1 +
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<double>(v2) * v2;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double length = std::sqrt(length_squared);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Vector3dF vector(v0, v1, v2);
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_DOUBLE_EQ(length_squared, vector.LengthSquared());
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_FLOAT_EQ(static_cast<float>(length), vector.Length());
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Vector3dTest, DotProduct) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float expected;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Vector3dF input1;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Vector3dF input2;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } tests[] = {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 0, gfx::Vector3dF(1, 0, 0), gfx::Vector3dF(0, 1, 1) },
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 0, gfx::Vector3dF(0, 1, 0), gfx::Vector3dF(1, 0, 1) },
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 0, gfx::Vector3dF(0, 0, 1), gfx::Vector3dF(1, 1, 0) },
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 3, gfx::Vector3dF(1, 1, 1), gfx::Vector3dF(1, 1, 1) },
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 1.2f, gfx::Vector3dF(1.2f, -1.2f, 1.2f), gfx::Vector3dF(1, 1, 1) },
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 1.2f, gfx::Vector3dF(1, 1, 1), gfx::Vector3dF(1.2f, -1.2f, 1.2f) },
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { 38.72f,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Vector3dF(1.1f, 2.2f, 3.3f), gfx::Vector3dF(4.4f, 5.5f, 6.6f) }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float actual = gfx::DotProduct(tests[i].input1, tests[i].input2);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(tests[i].expected, actual);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Vector3dTest, CrossProduct) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Vector3dF expected;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Vector3dF input1;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Vector3dF input2;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } tests[] = {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { Vector3dF(), Vector3dF(), Vector3dF(1, 1, 1) },
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { Vector3dF(), Vector3dF(1, 1, 1), Vector3dF() },
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { Vector3dF(), Vector3dF(1, 1, 1), Vector3dF(1, 1, 1) },
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { Vector3dF(),
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Vector3dF(1.6f, 10.6f, -10.6f),
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Vector3dF(1.6f, 10.6f, -10.6f) },
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { Vector3dF(1, -1, 0), Vector3dF(1, 1, 1), Vector3dF(0, 0, 1) },
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { Vector3dF(-1, 0, 1), Vector3dF(1, 1, 1), Vector3dF(0, 1, 0) },
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { Vector3dF(0, 1, -1), Vector3dF(1, 1, 1), Vector3dF(1, 0, 0) },
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { Vector3dF(-1, 1, 0), Vector3dF(0, 0, 1), Vector3dF(1, 1, 1) },
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { Vector3dF(1, 0, -1), Vector3dF(0, 1, 0), Vector3dF(1, 1, 1) },
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { Vector3dF(0, -1, 1), Vector3dF(1, 0, 0), Vector3dF(1, 1, 1) }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Vector3dF actual = gfx::CrossProduct(tests[i].input1, tests[i].input2);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(tests[i].expected.ToString(), actual.ToString());
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(Vector3dFTest, ClampVector3dF) {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vector3dF a;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  a = Vector3dF(3.5f, 5.5f, 7.5f);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Vector3dF(3.5f, 5.5f, 7.5f).ToString(), a.ToString());
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  a.SetToMax(Vector3dF(2, 4.5f, 6.5f));
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Vector3dF(3.5f, 5.5f, 7.5f).ToString(), a.ToString());
239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  a.SetToMax(Vector3dF(3.5f, 5.5f, 7.5f));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Vector3dF(3.5f, 5.5f, 7.5f).ToString(), a.ToString());
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  a.SetToMax(Vector3dF(4.5f, 2, 6.5f));
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Vector3dF(4.5f, 5.5f, 7.5f).ToString(), a.ToString());
243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  a.SetToMax(Vector3dF(3.5f, 6.5f, 6.5f));
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Vector3dF(4.5f, 6.5f, 7.5f).ToString(), a.ToString());
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  a.SetToMax(Vector3dF(3.5f, 5.5f, 8.5f));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Vector3dF(4.5f, 6.5f, 8.5f).ToString(), a.ToString());
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  a.SetToMax(Vector3dF(8.5f, 10.5f, 12.5f));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Vector3dF(8.5f, 10.5f, 12.5f).ToString(), a.ToString());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  a.SetToMin(Vector3dF(9.5f, 11.5f, 13.5f));
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Vector3dF(8.5f, 10.5f, 12.5f).ToString(), a.ToString());
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  a.SetToMin(Vector3dF(8.5f, 10.5f, 12.5f));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Vector3dF(8.5f, 10.5f, 12.5f).ToString(), a.ToString());
254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  a.SetToMin(Vector3dF(7.5f, 11.5f, 13.5f));
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Vector3dF(7.5f, 10.5f, 12.5f).ToString(), a.ToString());
256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  a.SetToMin(Vector3dF(9.5f, 9.5f, 13.5f));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Vector3dF(7.5f, 9.5f, 12.5f).ToString(), a.ToString());
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  a.SetToMin(Vector3dF(9.5f, 11.5f, 11.5f));
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Vector3dF(7.5f, 9.5f, 11.5f).ToString(), a.ToString());
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  a.SetToMin(Vector3dF(3.5f, 5.5f, 7.5f));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Vector3dF(3.5f, 5.5f, 7.5f).ToString(), a.ToString());
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
265