166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved.
266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
366a37686207944273ced825e0e8b6b6375f8c3deJamie GennisRedistribution and use in source and binary forms, with or without modification,
466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisare permitted provided that the following conditions are met:
566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  * Redistributions of source code must retain the above copyright notice, this
766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    list of conditions and the following disclaimer.
866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  * Redistributions in binary form must reproduce the above copyright notice,
966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    this list of conditions and the following disclaimer in the documentation
1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    and/or other materials provided with the distribution.
1166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
1266a37686207944273ced825e0e8b6b6375f8c3deJamie GennisTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
1366a37686207944273ced825e0e8b6b6375f8c3deJamie GennisANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1466a37686207944273ced825e0e8b6b6375f8c3deJamie GennisWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1566a37686207944273ced825e0e8b6b6375f8c3deJamie GennisDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
1666a37686207944273ced825e0e8b6b6375f8c3deJamie GennisANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
1766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
1866a37686207944273ced825e0e8b6b6375f8c3deJamie GennisLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
1966a37686207944273ced825e0e8b6b6375f8c3deJamie GennisANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2166a37686207944273ced825e0e8b6b6375f8c3deJamie GennisSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
2266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisdescribe("mat4", function() {
2466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var out, matA, matB, identity, result;
2566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    beforeEach(function() {
2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        // Attempting to portray a semi-realistic transform matrix
2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        matA = [1, 0, 0, 0,
2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 1, 0, 0,
3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 0, 1, 0,
3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                1, 2, 3, 1];
3266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
3366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        matB = [1, 0, 0, 0,
3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 1, 0, 0,
3566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 0, 1, 0,
3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                4, 5, 6, 1];
3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        out =  [0, 0, 0, 0,
3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 0, 0, 0,
4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 0, 0, 0,
4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 0, 0, 0];
4266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        identity = [1, 0, 0, 0,
4466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 0, 1];
4766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
4866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("create", function() {
5066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = mat4.create(); });
5166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return a 16 element array initialized to a 4x4 identity matrix", function() { expect(result).toBeEqualish(identity); });
5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("clone", function() {
5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = mat4.clone(matA); });
5666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return a 16 element array initialized to the values in matA", function() { expect(result).toBeEqualish(matA); });
5766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
5866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("copy", function() {
6066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = mat4.copy(out, matA); });
6166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should place values into out", function() { expect(out).toBeEqualish(matA); });
6266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return out", function() { expect(result).toBe(out); });
6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("identity", function() {
6666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = mat4.identity(out); });
6766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should place values into out", function() { expect(result).toBeEqualish(identity); });
6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return out", function() { expect(result).toBe(out); });
6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
7066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("transpose", function() {
7266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output matrix", function() {
7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.transpose(out, matA); });
7466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() {
7666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(out).toBeEqualish([
7766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 1,
7866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 2,
7966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 3,
8066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 0, 1
8166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
8266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
8366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
8466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify matA", function() {
8566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
8666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
8766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
8866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
8966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
9066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
9166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
9266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
9366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
9466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when matA is the output matrix", function() {
9566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.transpose(matA, matA); });
9666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
9766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into matA", function() {
9866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
9966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 1,
10066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 2,
10166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 3,
10266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 0, 1
10366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
10466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
10566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return matA", function() { expect(result).toBe(matA); });
10666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
10766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
10866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
10966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("invert", function() {
11066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output matrix", function() {
11166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.invert(out, matA); });
11266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
11366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() {
11466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(out).toBeEqualish([
11566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
11666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
11766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
11866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    -1, -2, -3, 1
11966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
12066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
12166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
12266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify matA", function() {
12366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
12466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
12566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
12666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
12766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
12866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
12966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
13066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
13166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
13266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when matA is the output matrix", function() {
13366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.invert(matA, matA); });
13466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
13566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into matA", function() {
13666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
13766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
13866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
13966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
14066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    -1, -2, -3, 1
14166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
14266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
14366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return matA", function() { expect(result).toBe(matA); });
14466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
14566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
14666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
14766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("adjoint", function() {
14866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output matrix", function() {
14966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.adjoint(out, matA); });
15066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
15166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() {
15266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(out).toBeEqualish([
15366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
15466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
15566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
15666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    -1, -2, -3, 1
15766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
15866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
15966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
16066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify matA", function() {
16166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
16266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
16366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
16466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
16566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
16666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
16766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
16866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
16966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
17066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when matA is the output matrix", function() {
17166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.adjoint(matA, matA); });
17266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
17366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into matA", function() {
17466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
17566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
17666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
17766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
17866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    -1, -2, -3, 1
17966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
18066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
18166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return matA", function() { expect(result).toBe(matA); });
18266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
18366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
18466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
18566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("determinant", function() {
18666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = mat4.determinant(matA); });
18766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
18866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return the determinant", function() { expect(result).toEqual(1); });
18966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
19066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
19166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("multiply", function() {
19266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should have an alias called 'mul'", function() { expect(mat4.mul).toEqual(mat4.multiply); });
19366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
19466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output matrix", function() {
19566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.multiply(out, matA, matB); });
19666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
19766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() {
19866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(out).toBeEqualish([
19966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
20066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
20166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
20266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    5, 7, 9, 1
20366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
20466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
20566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
20666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify matA", function() {
20766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
20866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
20966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
21066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
21166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
21266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
21366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
21466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify matB", function() {
21566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matB).toBeEqualish([
21666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
21766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
21866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
21966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    4, 5, 6, 1
22066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
22166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
22266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
22366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
22466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when matA is the output matrix", function() {
22566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.multiply(matA, matA, matB); });
22666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
22766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into matA", function() {
22866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
22966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
23066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
23166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
23266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    5, 7, 9, 1
23366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
23466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
23566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return matA", function() { expect(result).toBe(matA); });
23666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify matB", function() {
23766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matB).toBeEqualish([
23866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
23966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
24066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
24166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    4, 5, 6, 1
24266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
24366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
24466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
24566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
24666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when matB is the output matrix", function() {
24766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.multiply(matB, matA, matB); });
24866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
24966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into matB", function() {
25066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matB).toBeEqualish([
25166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
25266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
25366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
25466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    5, 7, 9, 1
25566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
25666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
25766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return matB", function() { expect(result).toBe(matB); });
25866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify matA", function() {
25966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
26066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
26166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
26266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
26366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
26466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
26566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
26666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
26766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
26866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
26966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("translate", function() {
27066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output matrix", function() {
27166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.translate(out, matA, [4, 5, 6]); });
27266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
27366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() {
27466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(out).toBeEqualish([
27566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
27666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
27766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
27866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    5, 7, 9, 1
27966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
28066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
28166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
28266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify matA", function() {
28366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
28466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
28566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
28666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
28766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
28866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
28966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
29066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
29166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
29266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when matA is the output matrix", function() {
29366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.translate(matA, matA, [4, 5, 6]); });
29466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
29566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into matA", function() {
29666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
29766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
29866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
29966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
30066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    5, 7, 9, 1
30166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
30266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
30366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return matA", function() { expect(result).toBe(matA); });
30466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
30566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
30666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
30766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("scale", function() {
30866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output matrix", function() {
30966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.scale(out, matA, [4, 5, 6]); });
31066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
31166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() {
31266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(out).toBeEqualish([
31366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    4, 0, 0, 0,
31466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 5, 0, 0,
31566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 6, 0,
31666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
31766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
31866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
31966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
32066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify matA", function() {
32166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
32266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
32366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
32466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
32566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
32666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
32766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
32866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
32966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
33066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when matA is the output matrix", function() {
33166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.scale(matA, matA, [4, 5, 6]); });
33266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
33366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into matA", function() {
33466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
33566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    4, 0, 0, 0,
33666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 5, 0, 0,
33766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 6, 0,
33866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
33966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
34066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
34166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return matA", function() { expect(result).toBe(matA); });
34266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
34366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
34466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
34566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("rotate", function() {
34666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var rad = Math.PI * 0.5;
34766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var axis = [1, 0, 0];
34866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
34966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output matrix", function() {
35066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.rotate(out, matA, rad, axis); });
35166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
35266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() {
35366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(out).toBeEqualish([
35466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
35566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, Math.cos(rad), Math.sin(rad), 0,
35666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, -Math.sin(rad), Math.cos(rad), 0,
35766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
35866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
35966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
36066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
36166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify matA", function() {
36266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
36366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
36466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
36566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
36666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
36766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
36866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
36966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
37066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
37166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when matA is the output matrix", function() {
37266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.rotate(matA, matA, rad, axis); });
37366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
37466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into matA", function() {
37566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
37666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
37766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, Math.cos(rad), Math.sin(rad), 0,
37866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, -Math.sin(rad), Math.cos(rad), 0,
37966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
38066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
38166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
38266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return matA", function() { expect(result).toBe(matA); });
38366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
38466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
38566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
38666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("rotateX", function() {
38766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var rad = Math.PI * 0.5;
38866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
38966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output matrix", function() {
39066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.rotateX(out, matA, rad); });
39166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
39266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() {
39366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(out).toBeEqualish([
39466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
39566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, Math.cos(rad), Math.sin(rad), 0,
39666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, -Math.sin(rad), Math.cos(rad), 0,
39766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
39866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
39966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
40066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
40166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify matA", function() {
40266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
40366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
40466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
40566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
40666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
40766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
40866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
40966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
41066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
41166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when matA is the output matrix", function() {
41266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.rotateX(matA, matA, rad); });
41366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
41466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into matA", function() {
41566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
41666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
41766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, Math.cos(rad), Math.sin(rad), 0,
41866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, -Math.sin(rad), Math.cos(rad), 0,
41966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
42066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
42166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
42266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return matA", function() { expect(result).toBe(matA); });
42366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
42466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
42566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
42666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("rotateY", function() {
42766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var rad = Math.PI * 0.5;
42866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
42966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output matrix", function() {
43066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.rotateY(out, matA, rad); });
43166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
43266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() {
43366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(out).toBeEqualish([
43466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    Math.cos(rad), 0, -Math.sin(rad), 0,
43566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
43666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    Math.sin(rad), 0, Math.cos(rad), 0,
43766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
43866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
43966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
44066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
44166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify matA", function() {
44266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
44366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
44466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
44566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
44666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
44766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
44866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
44966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
45066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
45166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when matA is the output matrix", function() {
45266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.rotateY(matA, matA, rad); });
45366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
45466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into matA", function() {
45566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
45666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    Math.cos(rad), 0, -Math.sin(rad), 0,
45766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
45866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    Math.sin(rad), 0, Math.cos(rad), 0,
45966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
46066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
46166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
46266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return matA", function() { expect(result).toBe(matA); });
46366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
46466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
46566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
46666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("rotateZ", function() {
46766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var rad = Math.PI * 0.5;
46866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
46966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("with a separate output matrix", function() {
47066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.rotateZ(out, matA, rad); });
47166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
47266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into out", function() {
47366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(out).toBeEqualish([
47466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    Math.cos(rad), Math.sin(rad), 0, 0,
47566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    -Math.sin(rad), Math.cos(rad), 0, 0,
47666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
47766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
47866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
47966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
48066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return out", function() { expect(result).toBe(out); });
48166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should not modify matA", function() {
48266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
48366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 0, 0, 0,
48466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 1, 0, 0,
48566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
48666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
48766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
48866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
48966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
49066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
49166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        describe("when matA is the output matrix", function() {
49266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            beforeEach(function() { result = mat4.rotateZ(matA, matA, rad); });
49366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
49466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should place values into matA", function() {
49566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                expect(matA).toBeEqualish([
49666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    Math.cos(rad), Math.sin(rad), 0, 0,
49766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    -Math.sin(rad), Math.cos(rad), 0, 0,
49866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    0, 0, 1, 0,
49966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                    1, 2, 3, 1
50066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                ]);
50166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            });
50266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            it("should return matA", function() { expect(result).toBe(matA); });
50366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
50466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
50566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
50666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    // TODO: fromRotationTranslation
50766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
50866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("frustum", function() {
50966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = mat4.frustum(out, -1, 1, -1, 1, -1, 1); });
51066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should place values into out", function() { expect(result).toBeEqualish([
51166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                -1, 0, 0, 0,
51266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, -1, 0, 0,
51366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 0, 0, -1,
51466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 0, 1, 0
51566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            ]);
51666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
51766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return out", function() { expect(result).toBe(out); });
51866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
51966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
52066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("perspective", function() {
52166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var fovy = Math.PI * 0.5;
52266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = mat4.perspective(out, fovy, 1, 0, 1); });
52366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should place values into out", function() { expect(result).toBeEqualish([
52466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                1, 0, 0, 0,
52566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 1, 0, 0,
52666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 0, -1, -1,
52766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 0, 0, 0
52866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            ]);
52966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
53066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return out", function() { expect(result).toBe(out); });
53166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
53266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
53366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("ortho", function() {
53466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = mat4.ortho(out, -1, 1, -1, 1, -1, 1); });
53566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should place values into out", function() { expect(result).toBeEqualish([
53666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                1, 0, 0, 0,
53766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 1, 0, 0,
53866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 0, -1, 0,
53966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 0, 0, 1
54066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            ]);
54166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
54266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return out", function() { expect(result).toBe(out); });
54366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
54466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
54566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("lookAt", function() {
54666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var eye = [0, 0, 1];
54766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var center = [0, 0, -1];
54866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var up = [0, 1, 0];
54966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
55066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = mat4.lookAt(out, eye, center, up); });
55166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should place values into out", function() { expect(result).toBeEqualish([
55266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                1, 0, 0, 0,
55366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 1, 0, 0,
55466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 0, 1, 0,
55566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                0, 0, -1, 1
55666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            ]);
55766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        });
55866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return out", function() { expect(result).toBe(out); });
55966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
56066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
56166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    describe("str", function() {
56266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        beforeEach(function() { result = mat4.str(matA); });
56366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
56466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        it("should return a string representation of the matrix", function() { expect(result).toEqual("mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 2, 3, 1)"); });
56566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    });
56666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis});