1b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.
2b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
3b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikPermission is hereby granted, free of charge, to any person obtaining a copy
4b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikof this software and associated documentation files (the "Software"), to deal
5b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikin the Software without restriction, including without limitation the rights
6b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikto use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikcopies of the Software, and to permit persons to whom the Software is
8b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfurnished to do so, subject to the following conditions:
9b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
10b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikThe above copyright notice and this permission notice shall be included in
11b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikall copies or substantial portions of the Software.
12b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
13b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris CraikTHE SOFTWARE. */
2066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisdescribe("vec4", function() {
22b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    var vec3 = require("../../src/gl-matrix/vec3.js");
23b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    var vec4 = require("../../src/gl-matrix/vec4.js");
24b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
2566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var out, vecA, vecB, result;
2666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    beforeEach(function() { vecA = [1, 2, 3, 4]; vecB = [5, 6, 7, 8]; out = [0, 0, 0, 0]; });
2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("create", function() {
3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = vec4.create(); });
3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return a 4 element array initialized to 0s", function() { expect(result).toBeEqualish([0, 0, 0, 0]); });
3266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
3366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("clone", function() {
3566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = vec4.clone(vecA); });
3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return a 4 element array initialized to the values in vecA", function() { expect(result).toBeEqualish(vecA); });
3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("fromValues", function() {
4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = vec4.fromValues(1, 2, 3, 4); });
4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return a 4 element array initialized to the values passed", function() { expect(result).toBeEqualish([1, 2, 3, 4]); });
4266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("copy", function() {
4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = vec4.copy(out, vecA); });
4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should place values into out", function() { expect(out).toBeEqualish([1, 2, 3, 4]); });
4766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return out", function() { expect(result).toBe(out); });
4866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("set", function() {
5166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = vec4.set(out, 1, 2, 3, 4); });
5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should place values into out", function() { expect(out).toBeEqualish([1, 2, 3, 4]); });
5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return out", function() { expect(result).toBe(out); });
5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("add", function() {
5766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output vector", function() {
5866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.add(out, vecA, vecB); });
5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
6066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() { expect(out).toBeEqualish([6, 8, 10, 12]); });
6166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
6266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecB", function() { expect(vecB).toBeEqualish([5, 6, 7, 8]); });
6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
6666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when vecA is the output vector", function() {
6766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.add(vecA, vecA, vecB); });
6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into vecA", function() { expect(vecA).toBeEqualish([6, 8, 10, 12]); });
7066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecA", function() { expect(result).toBe(vecA); });
7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecB", function() { expect(vecB).toBeEqualish([5, 6, 7, 8]); });
7266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when vecB is the output vector", function() {
7566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.add(vecB, vecA, vecB); });
7666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into vecB", function() { expect(vecB).toBeEqualish([6, 8, 10, 12]); });
7866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecB", function() { expect(result).toBe(vecB); });
7966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
8066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
8166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
8266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
8366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("subtract", function() {
8466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should have an alias called 'sub'", function() { expect(vec4.sub).toEqual(vec4.subtract); });
8566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
8666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output vector", function() {
8766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.subtract(out, vecA, vecB); });
8866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
8966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() { expect(out).toBeEqualish([-4, -4, -4, -4]); });
9066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
9166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
9266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecB", function() { expect(vecB).toBeEqualish([5, 6, 7, 8]); });
9366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
9466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
9566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when vecA is the output vector", function() {
9666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.subtract(vecA, vecA, vecB); });
9766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
9866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into vecA", function() { expect(vecA).toBeEqualish([-4, -4, -4, -4]); });
9966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecA", function() { expect(result).toBe(vecA); });
10066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecB", function() { expect(vecB).toBeEqualish([5, 6, 7, 8]); });
10166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
10266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
10366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when vecB is the output vector", function() {
10466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.subtract(vecB, vecA, vecB); });
10566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
10666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into vecB", function() { expect(vecB).toBeEqualish([-4, -4, -4, -4]); });
10766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecB", function() { expect(result).toBe(vecB); });
10866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
10966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
11066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
11166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
11266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("multiply", function() {
11366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should have an alias called 'mul'", function() { expect(vec4.mul).toEqual(vec4.multiply); });
11466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
11566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output vector", function() {
11666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.multiply(out, vecA, vecB); });
11766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
11866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() { expect(out).toBeEqualish([5, 12, 21, 32]); });
11966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
12066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
12166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecB", function() { expect(vecB).toBeEqualish([5, 6, 7, 8]); });
12266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
12366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
12466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when vecA is the output vector", function() {
12566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.multiply(vecA, vecA, vecB); });
12666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
12766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into vecA", function() { expect(vecA).toBeEqualish([5, 12, 21, 32]); });
12866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecA", function() { expect(result).toBe(vecA); });
12966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecB", function() { expect(vecB).toBeEqualish([5, 6, 7, 8]); });
13066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
13166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
13266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when vecB is the output vector", function() {
13366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.multiply(vecB, vecA, vecB); });
13466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
13566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into vecB", function() { expect(vecB).toBeEqualish([5, 12, 21, 32]); });
13666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecB", function() { expect(result).toBe(vecB); });
13766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
13866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
13966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
14066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
14166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("divide", function() {
14266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should have an alias called 'div'", function() { expect(vec4.div).toEqual(vec4.divide); });
14366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
14466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output vector", function() {
14566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.divide(out, vecA, vecB); });
14666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
14766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() { expect(out).toBeEqualish([0.2, 0.333333, 0.428571, 0.5]); });
14866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
14966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
15066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecB", function() { expect(vecB).toBeEqualish([5, 6, 7, 8]); });
15166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
15266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
15366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when vecA is the output vector", function() {
15466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.divide(vecA, vecA, vecB); });
15566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
15666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into vecA", function() { expect(vecA).toBeEqualish([0.2, 0.333333, 0.428571, 0.5]); });
15766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecA", function() { expect(result).toBe(vecA); });
15866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecB", function() { expect(vecB).toBeEqualish([5, 6, 7, 8]); });
15966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
16066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
16166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when vecB is the output vector", function() {
16266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.divide(vecB, vecA, vecB); });
16366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
16466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into vecB", function() { expect(vecB).toBeEqualish([0.2, 0.333333, 0.428571, 0.5]); });
16566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecB", function() { expect(result).toBe(vecB); });
16666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
16766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
16866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
16966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
17066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("min", function() {
17166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { vecA = [1, 3, 1, 3]; vecB = [3, 1, 3, 1]; });
17266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
17366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output vector", function() {
17466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.min(out, vecA, vecB); });
17566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
17666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() { expect(out).toBeEqualish([1, 1, 1, 1]); });
17766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
17866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 3, 1, 3]); });
17966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecB", function() { expect(vecB).toBeEqualish([3, 1, 3, 1]); });
18066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
18166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
18266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when vecA is the output vector", function() {
18366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.min(vecA, vecA, vecB); });
18466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
18566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into vecA", function() { expect(vecA).toBeEqualish([1, 1, 1, 1]); });
18666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecA", function() { expect(result).toBe(vecA); });
18766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecB", function() { expect(vecB).toBeEqualish([3, 1, 3, 1]); });
18866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
18966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
19066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when vecB is the output vector", function() {
19166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.min(vecB, vecA, vecB); });
19266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
19366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into vecB", function() { expect(vecB).toBeEqualish([1, 1, 1, 1]); });
19466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecB", function() { expect(result).toBe(vecB); });
19566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 3, 1, 3]); });
19666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
19766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
19866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
19966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("max", function() {
20066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { vecA = [1, 3, 1, 3]; vecB = [3, 1, 3, 1]; });
20166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
20266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output vector", function() {
20366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.max(out, vecA, vecB); });
20466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
20566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() { expect(out).toBeEqualish([3, 3, 3, 3]); });
20666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
20766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 3, 1, 3]); });
20866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecB", function() { expect(vecB).toBeEqualish([3, 1, 3, 1]); });
20966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
21066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
21166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when vecA is the output vector", function() {
21266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.max(vecA, vecA, vecB); });
21366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
21466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into vecA", function() { expect(vecA).toBeEqualish([3, 3, 3, 3]); });
21566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecA", function() { expect(result).toBe(vecA); });
21666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecB", function() { expect(vecB).toBeEqualish([3, 1, 3, 1]); });
21766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
21866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
21966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when vecB is the output vector", function() {
22066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.max(vecB, vecA, vecB); });
22166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
22266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into vecB", function() { expect(vecB).toBeEqualish([3, 3, 3, 3]); });
22366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecB", function() { expect(result).toBe(vecB); });
22466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 3, 1, 3]); });
22566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
22666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
22766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
22866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("scale", function() {
22966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output vector", function() {
23066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.scale(out, vecA, 2); });
23166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
23266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() { expect(out).toBeEqualish([2, 4, 6, 8]); });
23366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
23466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
23566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
23666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
23766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when vecA is the output vector", function() {
23866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.scale(vecA, vecA, 2); });
23966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
24066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into vecA", function() { expect(vecA).toBeEqualish([2, 4, 6, 8]); });
24166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecA", function() { expect(result).toBe(vecA); });
24266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
24366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
24466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
245b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    describe("scaleAndAdd", function() {
246b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        describe("with a separate output vector", function() {
247b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            beforeEach(function() { result = vec4.scaleAndAdd(out, vecA, vecB, 0.5); });
248b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
249b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            it("should place values into out", function() { expect(out).toBeEqualish([3.5, 5, 6.5, 8]); });
250b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            it("should return out", function() { expect(result).toBe(out); });
251b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
252b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            it("should not modify vecB", function() { expect(vecB).toBeEqualish([5, 6, 7, 8]); });
253b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        });
254b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
255b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        describe("when vecA is the output vector", function() {
256b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            beforeEach(function() { result = vec4.scaleAndAdd(vecA, vecA, vecB, 0.5); });
257b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
258b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            it("should place values into vecA", function() { expect(vecA).toBeEqualish([3.5, 5, 6.5, 8]); });
259b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            it("should return vecA", function() { expect(result).toBe(vecA); });
260b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            it("should not modify vecB", function() { expect(vecB).toBeEqualish([5, 6, 7, 8]); });
261b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        });
262b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
263b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        describe("when vecB is the output vector", function() {
264b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            beforeEach(function() { result = vec4.scaleAndAdd(vecB, vecA, vecB, 0.5); });
265b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
266b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            it("should place values into vecB", function() { expect(vecB).toBeEqualish([3.5, 5, 6.5, 8]); });
267b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            it("should return vecB", function() { expect(result).toBe(vecB); });
268b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
269b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        });
270b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    });
271b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
27266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("distance", function() {
27366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should have an alias called 'dist'", function() { expect(vec4.dist).toEqual(vec4.distance); });
27466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
27566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = vec4.distance(vecA, vecB); });
27666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
27766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return the distance", function() { expect(result).toBeCloseTo(8); });
27866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
27966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
28066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("squaredDistance", function() {
28166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should have an alias called 'sqrDist'", function() { expect(vec4.sqrDist).toEqual(vec4.squaredDistance); });
28266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
28366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = vec4.squaredDistance(vecA, vecB); });
28466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
28566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return the squared distance", function() { expect(result).toEqual(64); });
28666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
28766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
28866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("length", function() {
28966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should have an alias called 'len'", function() { expect(vec4.len).toEqual(vec4.length); });
29066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
29166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = vec4.length(vecA); });
29266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
29366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return the length", function() { expect(result).toBeCloseTo(5.477225); });
29466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
29566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
29666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("squaredLength", function() {
29766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should have an alias called 'sqrLen'", function() { expect(vec4.sqrLen).toEqual(vec4.squaredLength); });
29866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
29966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = vec4.squaredLength(vecA); });
30066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
30166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return the squared length", function() { expect(result).toEqual(30); });
30266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
30366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
30466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("negate", function() {
30566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output vector", function() {
30666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.negate(out, vecA); });
30766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
30866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() { expect(out).toBeEqualish([-1, -2, -3, -4]); });
30966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
31066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
31166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
31266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
31366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when vecA is the output vector", function() {
31466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.negate(vecA, vecA); });
31566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
31666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into vecA", function() { expect(vecA).toBeEqualish([-1, -2, -3, -4]); });
31766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecA", function() { expect(result).toBe(vecA); });
31866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
31966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
32066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
32166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("normalize", function() {
32266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { vecA = [5, 0, 0, 0]; });
32366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
32466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output vector", function() {
32566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.normalize(out, vecA); });
32666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
32766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() { expect(out).toBeEqualish([1, 0, 0, 0]); });
32866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
32966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([5, 0, 0, 0]); });
33066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
33166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
33266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when vecA is the output vector", function() {
33366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.normalize(vecA, vecA); });
33466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
33566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into vecA", function() { expect(vecA).toBeEqualish([1, 0, 0, 0]); });
33666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecA", function() { expect(result).toBe(vecA); });
33766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
33866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
33966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
34066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("dot", function() {
34166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = vec4.dot(vecA, vecB); });
34266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
34366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return the dot product", function() { expect(result).toEqual(70); });
34466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
34566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should not modify vecB", function() { expect(vecB).toBeEqualish([5, 6, 7, 8]); });
34666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
34766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
34866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("lerp", function() {
34966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output vector", function() {
35066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.lerp(out, vecA, vecB, 0.5); });
35166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
35266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() { expect(out).toBeEqualish([3, 4, 5, 6]); });
35366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
35466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
35566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecB", function() { expect(vecB).toBeEqualish([5, 6, 7, 8]); });
35666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
35766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
35866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when vecA is the output vector", function() {
35966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.lerp(vecA, vecA, vecB, 0.5); });
36066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
36166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into vecA", function() { expect(vecA).toBeEqualish([3, 4, 5, 6]); });
36266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecA", function() { expect(result).toBe(vecA); });
36366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecB", function() { expect(vecB).toBeEqualish([5, 6, 7, 8]); });
36466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
36566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
36666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when vecB is the output vector", function() {
36766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.lerp(vecB, vecA, vecB, 0.5); });
36866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
36966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into vecB", function() { expect(vecB).toBeEqualish([3, 4, 5, 6]); });
37066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecB", function() { expect(result).toBe(vecB); });
37166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
37266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
37366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
37466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
375b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    describe("random", function() {
376b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        describe("with no scale", function() {
377b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            beforeEach(function() { result = vec4.random(out); });
378b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
379b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            it("should result in a unit length vector", function() { expect(vec4.length(out)).toBeCloseTo(1.0); });
380b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            it("should return out", function() { expect(result).toBe(out); });
381b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        });
382b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
383b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        describe("with a scale", function() {
384b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            beforeEach(function() { result = vec4.random(out, 5.0); });
385b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
386b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            it("should result in a unit length vector", function() { expect(vec4.length(out)).toBeCloseTo(5.0); });
387b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik            it("should return out", function() { expect(result).toBe(out); });
388b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik        });
389b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik    });
390b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik
39166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("forEach", function() {
39266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var vecArray;
39366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
39466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() {
39566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            vecArray = [
39666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                1, 2, 3, 4,
39766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                5, 6, 7, 8,
39866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 0, 0, 0
39966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            ];
40066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
40166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
40266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when performing operations that take no extra arguments", function() {
40366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.forEach(vecArray, 0, 0, 0, vec4.normalize); });
40466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
40566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should update all values", function() {
40666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(vecArray).toBeEqualish([
40766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0.182574, 0.365148, 0.547722, 0.730296,
40866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0.379049, 0.454858, 0.530668, 0.606478,
40966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 0, 0
41066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
41166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
41266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecArray", function() { expect(result).toBe(vecArray); });
41366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
41466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
41566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when performing operations that takes one extra arguments", function() {
41666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.forEach(vecArray, 0, 0, 0, vec4.add, vecA); });
41766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
41866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should update all values", function() {
41966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(vecArray).toBeEqualish([
42066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    2, 4, 6, 8,
42166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    6, 8, 10, 12,
42266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 4
42366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
42466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
42566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecArray", function() { expect(result).toBe(vecArray); });
42666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
42766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
42866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
42966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when specifying an offset", function() {
43066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.forEach(vecArray, 0, 4, 0, vec4.add, vecA); });
43166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
43266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should update all values except the first vector", function() {
43366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(vecArray).toBeEqualish([
43466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 4,
43566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    6, 8, 10, 12,
43666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 4
43766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
43866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
43966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecArray", function() { expect(result).toBe(vecArray); });
44066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
44166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
44266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
44366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when specifying a count", function() {
44466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.forEach(vecArray, 0, 0, 2, vec4.add, vecA); });
44566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
44666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should update all values except the last vector", function() {
44766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(vecArray).toBeEqualish([
44866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    2, 4, 6, 8,
44966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    6, 8, 10, 12,
45066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 0, 0
45166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
45266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
45366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecArray", function() { expect(result).toBe(vecArray); });
45466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
45566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
45666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
45766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when specifying a stride", function() {
45866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = vec4.forEach(vecArray, 8, 0, 0, vec4.add, vecA); });
45966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
46066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should update all values except the second vector", function() {
46166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(vecArray).toBeEqualish([
46266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    2, 4, 6, 8,
46366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    5, 6, 7, 8,
46466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 4
46566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
46666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
46766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecArray", function() { expect(result).toBe(vecArray); });
46866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify vecA", function() { expect(vecA).toBeEqualish([1, 2, 3, 4]); });
46966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
47066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
47166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when calling a function that does not modify the out variable", function() {
47266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() {
47366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                result = vec3.forEach(vecArray, 0, 0, 0, function(out, vec) {});
47466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
47566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
47666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("values should remain unchanged", function() {
47766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(vecArray).toBeEqualish([
47866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 4,
47966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    5, 6, 7, 8,
48066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 0, 0
48166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
48266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
48366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return vecArray", function() { expect(result).toBe(vecArray); });
48466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
48566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
48666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
48766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("str", function() {
48866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = vec4.str(vecA); });
48966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
49066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return a string representation of the vector", function() { expect(result).toEqual("vec4(1, 2, 3, 4)"); });
49166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
49266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis});
493