Index: tests/vector/.expect/vec2_double.txt
===================================================================
--- tests/vector/.expect/vec2_double.txt	(revision 11881953ca54519ac6075af439004447ec006cda)
+++ tests/vector/.expect/vec2_double.txt	(revision 11881953ca54519ac6075af439004447ec006cda)
@@ -0,0 +1,2 @@
+ctor(x,y):<1.79769313486232e+308,2.2250738585072e-308>
+dot(v2,v3):324.670709736639
Index: tests/vector/.expect/vec2_float.txt
===================================================================
--- tests/vector/.expect/vec2_float.txt	(revision 11881953ca54519ac6075af439004447ec006cda)
+++ tests/vector/.expect/vec2_float.txt	(revision 11881953ca54519ac6075af439004447ec006cda)
@@ -0,0 +1,31 @@
+ctor(x,y):<1.,2.>
+copy ctor:<1.,2.>
+assignment:<3.,4.2>
+move assignment:<1.,2.>
+zero-init:<0.,0.>
+zero-assign:<0.,0.>
+fill-ctor:<1.23,1.23>
+?-?:<0.02,0.43>
+?-=?:<3.23,-6.57>
+-?:<-3.23,6.57>
+?+?:<2.3,2.45>
+?+=?:<2.3,2.45>
+v*s:<4.5,8.25>
+s*v:<4.5,8.25>
+?*=?:<4.5,8.25>
+?/?:<0.666667,-0.0333333>
+?/=?:<0.666667,-0.0333333>
+dot_1:0.
+dot_2:8.6
+length:5.
+length_squared:25.
+distance:6.5146
+normalize:<0.882353,-0.470588>
+normalize_2:<1.,0.>
+project:<5.,0.>
+project_2:<5.5,5.5>
+reflect:<-5.,6.>
+refract:<5.,6.>
+refract:<3.7594,4.5592>
+faceforward_nochange:<4.,5.5>
+faceforward_flip:<-4.,-5.5>
Index: tests/vector/.expect/vec2_int.txt
===================================================================
--- tests/vector/.expect/vec2_int.txt	(revision 11881953ca54519ac6075af439004447ec006cda)
+++ tests/vector/.expect/vec2_int.txt	(revision 11881953ca54519ac6075af439004447ec006cda)
@@ -0,0 +1,32 @@
+ctor(x,y):<1.,2.>
+copy ctor:<1.,2.>
+assignment:<3.,4.2>
+move assignment:<1.,2.>
+zero-init:<0.,0.>
+zero-assign:<0.,0.>
+fill-ctor:<1.23,1.23>
+?-?:<2,43>
+?-=?:<125,-657>
+-?:<-125,657>
+?+?:<23,245>
+?+=?:<23,245>
+v*s:<45,825>
+s*v:<45,825>
+?*=?:<45,825>
+?/?:<0,-3>
+?/=?:<0,-3>
+limits:<2147483647,-2147483648>
+dot_1:0
+dot_2:32
+length:5
+length_squared:25
+distance:9
+normalize:<0,0>
+normalize_2:<1,0>
+project:<5,0>
+project_2:<5.5,5.5>
+reflect:<-5.,6.>
+refract:<5.,6.>
+refract:<3.7594,4.5592>
+faceforward_nochange:<4.,5.5>
+faceforward_flip:<-4.,-5.5>
Index: tests/vector/.expect/vec2_ldouble.txt
===================================================================
--- tests/vector/.expect/vec2_ldouble.txt	(revision 11881953ca54519ac6075af439004447ec006cda)
+++ tests/vector/.expect/vec2_ldouble.txt	(revision 11881953ca54519ac6075af439004447ec006cda)
@@ -0,0 +1,2 @@
+ctor(x,y):<1.18973149535723177e+4932,3.36210314311209351e-4932>
+dot(v2,v3):324.670709736639038
Index: tests/vector/vec2_double.cfa
===================================================================
--- tests/vector/vec2_double.cfa	(revision 11881953ca54519ac6075af439004447ec006cda)
+++ tests/vector/vec2_double.cfa	(revision 11881953ca54519ac6075af439004447ec006cda)
@@ -0,0 +1,12 @@
+#include "../../libcfa/src/vec/vec2.hfa"
+#include <fstream.hfa>
+#include <limits.hfa>
+
+int main(void) {
+    vec2(double) v1 = {(double)MAX,(double)MIN};
+    sout | "ctor(x,y):" | v1;
+
+    vec2(double) v2 = {3.4144423, -1.2342315};
+    vec2(double) v3 = {100.23125123, 14.23};
+    sout | "dot(v2,v3):" | dot(v2, v3);
+}
Index: tests/vector/vec2_float.cfa
===================================================================
--- tests/vector/vec2_float.cfa	(revision 11881953ca54519ac6075af439004447ec006cda)
+++ tests/vector/vec2_float.cfa	(revision 11881953ca54519ac6075af439004447ec006cda)
@@ -0,0 +1,93 @@
+#include "../../libcfa/src/vec/vec2.hfa"
+#include <fstream.hfa>
+
+int main(void) {
+    vec2(float) v1 = {1.f,2.f};
+    sout | "ctor(x,y):" | v1;
+
+    vec2(float) v2 = v1;
+    sout | "copy ctor:" | v2;
+
+    v2 = (vec2(float)){3.f, 4.2f};
+    sout | "assignment:" | v2;
+
+    v2 = v1;
+    sout | "move assignment:" | v2;
+
+    vec2(float) v3 = 0;
+    sout | "zero-init:" | v3;
+
+    v1 = 0;
+    sout | "zero-assign:" | v1;
+
+    vec2(float) v4 = {1.23f};
+    sout | "fill-ctor:" | v4;
+
+    v1 = (vec2(float)){1.23f, 3.43f};
+    sout | "?-?:" | (v1 - (vec2(float)){1.21f,3});
+
+    v1 -= (vec2(float)){-2, 10};
+    sout | "?-=?:" | v1;
+
+    v1 = -v1;
+    sout | "-?:" | v1;
+
+    v1 = (vec2(float)){1.5f, 2.75f};
+    sout | "?+?:" | (v1 + (vec2(float)){0.8f, -0.3f});
+
+    v1 += (vec2(float)){0.8f, -0.3f};
+    sout | "?+=?:" | v1;
+
+    v1 = (vec2(float)){1.5f, 2.75f};
+    sout | "v*s:" | v1 * 3.f;
+
+    sout | "s*v:" | 3.f * v1;
+
+    v1 *= 3;
+    sout | "?*=?:" | v1;
+
+    v1 = (vec2(float)){2, -0.1f};
+    sout | "?/?:" | (v1 / 3);
+
+    v1 /= 3;
+    sout | "?/=?:" | v1;
+
+    v1 = (vec2(float)){2, 3};
+    v2 = (vec2(float)){-3, 2};
+    sout | "dot_1:" | dot(v1, v2);
+
+    v2 = (vec2(float)){1.3f, 2};
+    sout | "dot_2:" | dot(v1, v2);
+
+    v1 = (vec2(float)){4, 3};
+    sout | "length:" | length(v1);
+
+    sout | "length_squared:" | length_squared(v1);
+
+    v2 = (vec2(float)){6, -3.2f};
+    sout | "distance:" | distance(v1, v2);
+
+    sout | "normalize:" | normalize(v2);
+
+    v1 = (vec2(float)){1,0};
+    sout | "normalize_2:" | normalize(v1);
+
+    sout | "project:" | project((vec2(float)){5,6}, (vec2(float)){1, 0});
+    sout | "project_2:" | project((vec2(float)){5,6}, (vec2(float)){1, 1});
+
+    v1 = (vec2(float)){5,6};
+    v2 = (vec2(float)){1,0};
+    sout | "reflect:" | reflect(v1,v2);
+
+    v2 = (vec2(float)){0,-1};
+    sout | "refract:" | refract(v1,v2,1);
+    sout | "refract:" | refract(v1,v2,1.f/1.33f);
+
+    vec2(float) geometric_normal = {5,6};
+    vec2(float) perturbed_normal = {4,5.5f};
+    vec2(float) eyeline = {-1,0.002f};
+    sout | "faceforward_nochange:" | faceforward(perturbed_normal, eyeline, geometric_normal);
+
+    eyeline = (vec2(float)){1,0.002f};
+    sout | "faceforward_flip:" | faceforward(perturbed_normal, eyeline, geometric_normal);
+}
Index: tests/vector/vec2_int.cfa
===================================================================
--- tests/vector/vec2_int.cfa	(revision 11881953ca54519ac6075af439004447ec006cda)
+++ tests/vector/vec2_int.cfa	(revision 11881953ca54519ac6075af439004447ec006cda)
@@ -0,0 +1,95 @@
+#include "../../libcfa/src/vec/vec2.hfa"
+#include <fstream.hfa>
+#include <limits.hfa>
+
+int main(void) {
+    vec2(int) v1 = {1,2};
+    sout | "ctor(x,y):" | v1;
+
+    vec2(int) v2 = v1;
+    sout | "copy ctor:" | v2;
+
+    v2 = (vec2(int)){3, 42};
+    sout | "assignment:" | v2;
+
+    v2 = v1;
+    sout | "move assignment:" | v2;
+
+    vec2(int) v3 = 0;
+    sout | "zero-init:" | v3;
+
+    v1 = 0;
+    sout | "zero-assign:" | v1;
+
+    vec2(int) v4 = {100};
+    sout | "fill-ctor:" | v4;
+
+    v1 = (vec2(int)){123, 343};
+    sout | "?-?:" | (v1 - (vec2(int)){121,300});
+
+    v1 -= (vec2(int)){-2, 1000};
+    sout | "?-=?:" | v1;
+
+    v1 = -v1;
+    sout | "-?:" | v1;
+
+    v1 = (vec2(int)){15, 275};
+    sout | "?+?:" | (v1 + (vec2(int)){8, -30});
+
+    v1 += (vec2(int)){8, -30};
+    sout | "?+=?:" | v1;
+
+    v1 = (vec2(int)){15, 275};
+    sout | "v*s:" | v1 * 3;
+
+    sout | "s*v:" | 3 * v1;
+
+    v1 *= 3;
+    sout | "?*=?:" | v1;
+
+    v1 = (vec2(int)){2, -10};
+    sout | "?/?:" | (v1 / 3);
+
+    v1 /= 3;
+    sout | "?/=?:" | v1;
+
+    v1 = (vec2(int)){MAX, MIN};
+    sout | "limits:" | v1;
+
+    v1 = (vec2(int)){2, 3};
+    v2 = (vec2(int)){-3, 2};
+    sout | "dot_1:" | dot(v1, v2);
+
+    v2 = (vec2(int)){13, 2};
+    sout | "dot_2:" | dot(v1, v2);
+
+    v1 = (vec2(int)){4, 3};
+    sout | "length:" | length(v1);
+
+    sout | "length_squared:" | length_squared(v1);
+
+    v2 = (vec2(int)){6, 12};
+    sout | "distance:" | distance(v1, v2);
+
+    sout | "normalize:" | normalize(v2);
+    sout | "normalize_2:" | normalize((vec2(int)){20,0});
+
+    sout | "project:" | project((vec2(int)){5,6}, (vec2(int)){1, 0});
+    sout | "project_2:" | project((vec2(int)){5,6}, (vec2(int)){1, 1});
+
+    v1 = (vec2(int)){5,6};
+    v2 = (vec2(int)){1,0};
+    sout | "reflect:" | reflect(v1,v2);
+
+    v2 = (vec2(int)){0,-1};
+    sout | "refract:" | refract(v1,v2,1);
+    sout | "refract:" | refract(v1,v2,1/1.33f);
+
+    vec2(int) geometric_normal = {5,6};
+    vec2(int) perturbed_normal = {4,5.5};
+    vec2(int) eyeline = {-1,0.002};
+    sout | "faceforward_nochange:" | faceforward(perturbed_normal, eyeline, geometric_normal);
+
+    eyeline = (vec2(int)){1,0.002};
+    sout | "faceforward_flip:" | faceforward(perturbed_normal, eyeline, geometric_normal);
+}
Index: tests/vector/vec2_ldouble.cfa
===================================================================
--- tests/vector/vec2_ldouble.cfa	(revision 11881953ca54519ac6075af439004447ec006cda)
+++ tests/vector/vec2_ldouble.cfa	(revision 11881953ca54519ac6075af439004447ec006cda)
@@ -0,0 +1,12 @@
+#include "../../libcfa/src/vec/vec2.hfa"
+#include <fstream.hfa>
+#include <limits.hfa>
+
+int main(void) {
+    vec2(long double) v1 = {(long double)MAX,(long double)MIN};
+    sout | "ctor(x,y):" | v1;
+
+    vec2(long double) v2 = {3.4144423, -1.2342315};
+    vec2(long double) v3 = {100.23125123, 14.23};
+    sout | "dot(v2,v3):" | dot(v2, v3);
+}
