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