Skip to content

Commit 623d3dc

Browse files
committed
feat: add RcVec2i and RcVec3i structs with unit tests
- Added integer-based 2D and 3D vector types. - Implemented operator overloading and equality members. - Included comprehensive unit tests for both types.
1 parent 96b1e14 commit 623d3dc

File tree

4 files changed

+280
-2
lines changed

4 files changed

+280
-2
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using System;
2+
3+
namespace DotRecast.Core.Numerics
4+
{
5+
public struct RcVec2i : IEquatable<RcVec2i>
6+
{
7+
public int X;
8+
public int Y;
9+
10+
public static RcVec2i Zero => new RcVec2i(0, 0);
11+
public static RcVec2i UnitX => new RcVec2i(1, 0);
12+
public static RcVec2i UnitY => new RcVec2i(0, 1);
13+
14+
// Comparison Operators
15+
public static bool operator ==(RcVec2i left, RcVec2i right) => left.Equals(right);
16+
public static bool operator !=(RcVec2i left, RcVec2i right) => !left.Equals(right);
17+
18+
// Arithmetic Operators
19+
public static RcVec2i operator +(RcVec2i a, RcVec2i b) => new RcVec2i(a.X + b.X, a.Y + b.Y);
20+
public static RcVec2i operator -(RcVec2i a, RcVec2i b) => new RcVec2i(a.X - b.X, a.Y - b.Y);
21+
public static RcVec2i operator *(RcVec2i a, int scalar) => new RcVec2i(a.X * scalar, a.Y * scalar);
22+
23+
public RcVec2i(int x, int y)
24+
{
25+
X = x;
26+
Y = y;
27+
}
28+
29+
public int this[int index]
30+
{
31+
get
32+
{
33+
return index switch
34+
{
35+
0 => X,
36+
1 => Y,
37+
_ => throw new IndexOutOfRangeException()
38+
};
39+
}
40+
}
41+
42+
43+
public bool Equals(RcVec2i other)
44+
{
45+
return X == other.X && Y == other.Y;
46+
}
47+
48+
public override bool Equals(object? obj)
49+
{
50+
return obj is RcVec2i other && Equals(other);
51+
}
52+
53+
public override int GetHashCode()
54+
{
55+
return HashCode.Combine(X, Y);
56+
}
57+
58+
public override string ToString()
59+
{
60+
return $"({X}, {Y})";
61+
}
62+
}
63+
64+
}
Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,67 @@
1-
namespace DotRecast.Core.Numerics
1+
using System;
2+
3+
namespace DotRecast.Core.Numerics
24
{
3-
public struct RcVec3i
5+
public struct RcVec3i : IEquatable<RcVec3i>
46
{
57
public int X;
68
public int Y;
79
public int Z;
10+
11+
public static RcVec3i Zero => new RcVec3i(0, 0, 0);
12+
public static RcVec3i UnitX => new RcVec3i(1, 0, 0);
13+
public static RcVec3i UnitY => new RcVec3i(0, 1, 0);
14+
public static RcVec3i UnitZ => new RcVec3i(0, 1, 1);
15+
16+
// Comparison Operators
17+
public static bool operator ==(RcVec3i left, RcVec3i right) => left.Equals(right);
18+
public static bool operator !=(RcVec3i left, RcVec3i right) => !left.Equals(right);
19+
20+
// Arithmetic Operators
21+
public static RcVec3i operator +(RcVec3i a, RcVec3i b) => new RcVec3i(a.X + b.X, a.Y + b.Y, a.Z + b.Z);
22+
public static RcVec3i operator -(RcVec3i a, RcVec3i b) => new RcVec3i(a.X - b.X, a.Y - b.Y, a.Z - b.Z);
23+
public static RcVec3i operator *(RcVec3i a, int scalar) => new RcVec3i(a.X * scalar, a.Y * scalar, a.Z * scalar);
24+
25+
public RcVec3i(int x, int y, int z)
26+
{
27+
X = x;
28+
Y = y;
29+
Z = z;
30+
}
31+
32+
public int this[int index]
33+
{
34+
get
35+
{
36+
return index switch
37+
{
38+
0 => X,
39+
1 => Y,
40+
2 => Z,
41+
_ => throw new IndexOutOfRangeException()
42+
};
43+
}
44+
}
45+
46+
47+
public bool Equals(RcVec3i other)
48+
{
49+
return X == other.X && Y == other.Y && Z == other.Z;
50+
}
51+
52+
public override bool Equals(object? obj) // null 허용 확인
53+
{
54+
return obj is RcVec3i other && Equals(other);
55+
}
56+
57+
public override int GetHashCode()
58+
{
59+
return HashCode.Combine(X, Y, Z);
60+
}
61+
62+
public override string ToString()
63+
{
64+
return $"({X}, {Y}, {Z})";
65+
}
866
}
967
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
using System;
2+
using DotRecast.Core.Numerics;
3+
using NUnit.Framework;
4+
5+
namespace DotRecast.Core.Test;
6+
7+
public class RcVec2iTest
8+
{
9+
[Test]
10+
[Repeat(100000)]
11+
public void TestEquals()
12+
{
13+
var x = Random.Shared.Next();
14+
var y = Random.Shared.Next();
15+
16+
var v1 = new RcVec2i(x, y);
17+
var v2 = new RcVec2i(x, y);
18+
var v3 = new RcVec2i(x + 1, y);
19+
20+
Assert.That(v1, Is.EqualTo(v2));
21+
Assert.That(v1 == v2, Is.True);
22+
Assert.That(v1 != v3, Is.True);
23+
Assert.That(v1.Equals(v2), Is.True);
24+
Assert.That(v1.Equals((object)v2), Is.True);
25+
Assert.That(v1.GetHashCode(), Is.EqualTo(v2.GetHashCode()));
26+
}
27+
28+
[Test]
29+
[Repeat(100000)]
30+
public void TestArithmetic()
31+
{
32+
var v1 = new RcVec2i(Random.Shared.Next(1000), Random.Shared.Next(1000));
33+
var v2 = new RcVec2i(Random.Shared.Next(1000), Random.Shared.Next(1000));
34+
var scalar = Random.Shared.Next(100);
35+
36+
// Add
37+
var vAdd = v1 + v2;
38+
Assert.That(vAdd.X, Is.EqualTo(v1.X + v2.X));
39+
Assert.That(vAdd.Y, Is.EqualTo(v1.Y + v2.Y));
40+
41+
// Subtract
42+
var vSub = v1 - v2;
43+
Assert.That(vSub.X, Is.EqualTo(v1.X - v2.X));
44+
Assert.That(vSub.Y, Is.EqualTo(v1.Y - v2.Y));
45+
46+
// Multiply
47+
var vMul = v1 * scalar;
48+
Assert.That(vMul.X, Is.EqualTo(v1.X * scalar));
49+
Assert.That(vMul.Y, Is.EqualTo(v1.Y * scalar));
50+
}
51+
52+
[Test]
53+
public void TestIndexer()
54+
{
55+
var v = new RcVec2i(1, 2);
56+
Assert.That(v[0], Is.EqualTo(1));
57+
Assert.That(v[1], Is.EqualTo(2));
58+
Assert.Throws<IndexOutOfRangeException>(() => { var _ = v[2]; });
59+
}
60+
61+
[Test]
62+
public void TestToString()
63+
{
64+
var v = new RcVec2i(1, 2);
65+
Assert.That(v.ToString(), Is.EqualTo("(1, 2)"));
66+
}
67+
68+
[Test]
69+
public void TestStaticProperties()
70+
{
71+
Assert.That(RcVec2i.Zero, Is.EqualTo(new RcVec2i(0, 0)));
72+
Assert.That(RcVec2i.UnitX, Is.EqualTo(new RcVec2i(1, 0)));
73+
Assert.That(RcVec2i.UnitY, Is.EqualTo(new RcVec2i(0, 1)));
74+
}
75+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
using System;
2+
using DotRecast.Core.Numerics;
3+
using NUnit.Framework;
4+
5+
namespace DotRecast.Core.Test;
6+
7+
public class RcVec3iTest
8+
{
9+
[Test]
10+
[Repeat(100000)]
11+
public void TestEquals()
12+
{
13+
var x = Random.Shared.Next();
14+
var y = Random.Shared.Next();
15+
var z = Random.Shared.Next();
16+
17+
var v1 = new RcVec3i(x, y, z);
18+
var v2 = new RcVec3i(x, y, z);
19+
var v3 = new RcVec3i(x + 1, y, z);
20+
21+
Assert.That(v1, Is.EqualTo(v2));
22+
Assert.That(v1 == v2, Is.True);
23+
Assert.That(v1 != v3, Is.True);
24+
Assert.That(v1.Equals(v2), Is.True);
25+
Assert.That(v1.Equals((object)v2), Is.True);
26+
Assert.That(v1.GetHashCode(), Is.EqualTo(v2.GetHashCode()));
27+
}
28+
29+
[Test]
30+
[Repeat(100000)]
31+
public void TestArithmetic()
32+
{
33+
var v1 = new RcVec3i(Random.Shared.Next(1000), Random.Shared.Next(1000), Random.Shared.Next(1000));
34+
var v2 = new RcVec3i(Random.Shared.Next(1000), Random.Shared.Next(1000), Random.Shared.Next(1000));
35+
var scalar = Random.Shared.Next(100);
36+
37+
// Add
38+
var vAdd = v1 + v2;
39+
Assert.That(vAdd.X, Is.EqualTo(v1.X + v2.X));
40+
Assert.That(vAdd.Y, Is.EqualTo(v1.Y + v2.Y));
41+
Assert.That(vAdd.Z, Is.EqualTo(v1.Z + v2.Z));
42+
43+
// Subtract
44+
var vSub = v1 - v2;
45+
Assert.That(vSub.X, Is.EqualTo(v1.X - v2.X));
46+
Assert.That(vSub.Y, Is.EqualTo(v1.Y - v2.Y));
47+
Assert.That(vSub.Z, Is.EqualTo(v1.Z - v2.Z));
48+
49+
// Multiply
50+
var vMul = v1 * scalar;
51+
Assert.That(vMul.X, Is.EqualTo(v1.X * scalar));
52+
Assert.That(vMul.Y, Is.EqualTo(v1.Y * scalar));
53+
Assert.That(vMul.Z, Is.EqualTo(v1.Z * scalar));
54+
}
55+
56+
[Test]
57+
public void TestIndexer()
58+
{
59+
var v = new RcVec3i(1, 2, 3);
60+
Assert.That(v[0], Is.EqualTo(1));
61+
Assert.That(v[1], Is.EqualTo(2));
62+
Assert.That(v[2], Is.EqualTo(3));
63+
Assert.Throws<IndexOutOfRangeException>(() => { var _ = v[3]; });
64+
}
65+
66+
[Test]
67+
public void TestToString()
68+
{
69+
var v = new RcVec3i(1, 2, 3);
70+
Assert.That(v.ToString(), Is.EqualTo("(1, 2, 3)"));
71+
}
72+
73+
[Test]
74+
public void TestStaticProperties()
75+
{
76+
Assert.That(RcVec3i.Zero, Is.EqualTo(new RcVec3i(0, 0, 0)));
77+
Assert.That(RcVec3i.UnitX, Is.EqualTo(new RcVec3i(1, 0, 0)));
78+
Assert.That(RcVec3i.UnitY, Is.EqualTo(new RcVec3i(0, 1, 0)));
79+
Assert.That(RcVec3i.UnitZ, Is.EqualTo(new RcVec3i(0, 1, 1)));
80+
}
81+
}

0 commit comments

Comments
 (0)