[#3027] testI(numberOfPairs): add C# unit test cases
This commit is contained in:
@@ -0,0 +1,313 @@
|
|||||||
|
// LeetCode 3027 單元測試
|
||||||
|
// 使用 xUnit 框架
|
||||||
|
|
||||||
|
using Xunit;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
public class SolutionTests
|
||||||
|
{
|
||||||
|
private readonly Solution _solution;
|
||||||
|
|
||||||
|
public SolutionTests()
|
||||||
|
{
|
||||||
|
_solution = new Solution();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TestCase1_ExampleFromProblem()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
int[][] points = new int[][] {
|
||||||
|
new int[] {6, 2},
|
||||||
|
new int[] {4, 4},
|
||||||
|
new int[] {2, 6}
|
||||||
|
};
|
||||||
|
int expected = 2;
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = _solution.NumberOfPairs(points);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expected, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TestCase2_TwoPoints()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
int[][] points = new int[][] {
|
||||||
|
new int[] {1, 3},
|
||||||
|
new int[] {2, 1}
|
||||||
|
};
|
||||||
|
int expected = 1;
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = _solution.NumberOfPairs(points);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expected, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TestCase3_NoValidPairs()
|
||||||
|
{
|
||||||
|
// Arrange - 沒有有效點對的情況
|
||||||
|
int[][] points = new int[][] {
|
||||||
|
new int[] {1, 1},
|
||||||
|
new int[] {2, 2},
|
||||||
|
new int[] {3, 3}
|
||||||
|
};
|
||||||
|
int expected = 0;
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = _solution.NumberOfPairs(points);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expected, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TestCase4_SameXCoordinate()
|
||||||
|
{
|
||||||
|
// Arrange - x 座標相同的情況
|
||||||
|
int[][] points = new int[][] {
|
||||||
|
new int[] {3, 5},
|
||||||
|
new int[] {3, 2},
|
||||||
|
new int[] {3, 1}
|
||||||
|
};
|
||||||
|
int expected = 2;
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = _solution.NumberOfPairs(points);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expected, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TestCase5_SameYCoordinate()
|
||||||
|
{
|
||||||
|
// Arrange - y 座標相同的情況
|
||||||
|
int[][] points = new int[][] {
|
||||||
|
new int[] {1, 4},
|
||||||
|
new int[] {3, 4},
|
||||||
|
new int[] {5, 4}
|
||||||
|
};
|
||||||
|
int expected = 2;
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = _solution.NumberOfPairs(points);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expected, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TestCase6_PointsInsideRectangle()
|
||||||
|
{
|
||||||
|
// Arrange - 矩形內有其他點的情況
|
||||||
|
int[][] points = new int[][] {
|
||||||
|
new int[] {0, 4}, // A
|
||||||
|
new int[] {4, 0}, // B
|
||||||
|
new int[] {2, 2} // C (在 A-B 矩形內)
|
||||||
|
};
|
||||||
|
|
||||||
|
int expected = 2;
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = _solution.NumberOfPairs(points);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expected, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TestCase7_PointsOnBorder()
|
||||||
|
{
|
||||||
|
// Arrange - 點在矩形邊界上的情況
|
||||||
|
int[][] points = new int[][] {
|
||||||
|
new int[] {0, 3}, // A
|
||||||
|
new int[] {3, 0}, // B
|
||||||
|
new int[] {0, 0} // C (在矩形邊界上)
|
||||||
|
};
|
||||||
|
int expected = 2; // (A,C) 和 (C,B) 有效
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = _solution.NumberOfPairs(points);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expected, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TestCase8_NegativeCoordinates()
|
||||||
|
{
|
||||||
|
// Arrange - 負座標情況 (題目一允許 -10^9 到 10^9)
|
||||||
|
int[][] points = new int[][] {
|
||||||
|
new int[] {-5, 5},
|
||||||
|
new int[] {5, -5},
|
||||||
|
new int[] {0, 0}
|
||||||
|
};
|
||||||
|
int expected = 2; // (-5,5) -> (0,0) 和 (0,0) -> (5,-5) 有效
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = _solution.NumberOfPairs(points);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expected, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TestCase9_LargeCoordinates()
|
||||||
|
{
|
||||||
|
// Arrange - 大座標值情況
|
||||||
|
int[][] points = new int[][] {
|
||||||
|
new int[] {-1000000, 1000000},
|
||||||
|
new int[] {1000000, -1000000},
|
||||||
|
new int[] {0, 0}
|
||||||
|
};
|
||||||
|
int expected = 2;
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = _solution.NumberOfPairs(points);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expected, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TestEdgeCases_MinimumPoints()
|
||||||
|
{
|
||||||
|
// Arrange - 最少點數情況 (題目限制 n >= 2)
|
||||||
|
int[][] points = new int[][] {
|
||||||
|
new int[] {0, 1},
|
||||||
|
new int[] {1, 0}
|
||||||
|
};
|
||||||
|
int expected = 1; // (0,1) 在 (1,0) 的左上方
|
||||||
|
|
||||||
|
// Act
|
||||||
|
int result = _solution.NumberOfPairs(points);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expected, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TestEdgeCases_MaximumCoordinateRange()
|
||||||
|
{
|
||||||
|
// Arrange - 最大座標範圍測試
|
||||||
|
int[][] points = new int[][] {
|
||||||
|
new int[] {-1000000000, 1000000000}, // 最小x,最大y
|
||||||
|
new int[] {1000000000, -1000000000}, // 最大x,最小y
|
||||||
|
new int[] {0, 0} // 中心點
|
||||||
|
};
|
||||||
|
int expected = 2;
|
||||||
|
|
||||||
|
// Act
|
||||||
|
int result = _solution.NumberOfPairs(points);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expected, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TestCase_LargerDataSet()
|
||||||
|
{
|
||||||
|
// Arrange - 較大的數據集 (接近題目一的限制 n <= 1000)
|
||||||
|
var points = new List<int[]>();
|
||||||
|
|
||||||
|
// 創建 100 個不同的點 (可以增加到更接近 1000,但為了測試速度這裡用 100)
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < 10; j++)
|
||||||
|
{
|
||||||
|
points.Add(new int[] { i * 100 - 500, j * 100 - 500 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int[][] pointsArray = points.ToArray();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
int result = _solution.NumberOfPairs(pointsArray);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.True(result >= 0); // 結果應該是非負數
|
||||||
|
Assert.True(result <= 100 * 99); // 最多不會超過所有可能的點對
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TestCase_StressTest_MediumSize()
|
||||||
|
{
|
||||||
|
// Arrange - 中等規模壓力測試 (200個點)
|
||||||
|
var points = new List<int[]>();
|
||||||
|
var usedPoints = new HashSet<string>();
|
||||||
|
var random = new Random(42); // 固定種子確保可重現
|
||||||
|
|
||||||
|
while (points.Count < 200)
|
||||||
|
{
|
||||||
|
int x = random.Next(-10000, 10001); // 較大範圍
|
||||||
|
int y = random.Next(-10000, 10001);
|
||||||
|
string pointKey = $"{x},{y}";
|
||||||
|
|
||||||
|
if (!usedPoints.Contains(pointKey))
|
||||||
|
{
|
||||||
|
usedPoints.Add(pointKey);
|
||||||
|
points.Add(new int[] { x, y });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int[][] pointsArray = points.ToArray();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var startTime = DateTime.Now;
|
||||||
|
int result = _solution.NumberOfPairs(pointsArray);
|
||||||
|
var endTime = DateTime.Now;
|
||||||
|
var elapsed = endTime - startTime;
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.True(result >= 0);
|
||||||
|
Assert.True(result <= 200 * 199);
|
||||||
|
Assert.True(elapsed.TotalMilliseconds < 5000); // 應該在5秒內完成
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TestCase_AllPointsOnSameLine_Vertical()
|
||||||
|
{
|
||||||
|
// Arrange - 所有點在同一條垂直線上
|
||||||
|
int[][] points = new int[][] {
|
||||||
|
new int[] {0, 10},
|
||||||
|
new int[] {0, 5},
|
||||||
|
new int[] {0, 0},
|
||||||
|
new int[] {0, -5},
|
||||||
|
new int[] {0, -10}
|
||||||
|
};
|
||||||
|
int expected = 4; // 每個點都可以與y座標更小的點配對
|
||||||
|
|
||||||
|
// Act
|
||||||
|
int result = _solution.NumberOfPairs(points);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expected, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TestCase_AllPointsOnSameLine_Horizontal()
|
||||||
|
{
|
||||||
|
// Arrange - 所有點在同一條水平線上
|
||||||
|
int[][] points = new int[][] {
|
||||||
|
new int[] {-10, 0},
|
||||||
|
new int[] {-5, 0},
|
||||||
|
new int[] {0, 0},
|
||||||
|
new int[] {5, 0},
|
||||||
|
new int[] {10, 0}
|
||||||
|
};
|
||||||
|
int expected = 4; // 每個點都可以與x座標更大的點配對
|
||||||
|
|
||||||
|
// Act
|
||||||
|
int result = _solution.NumberOfPairs(points);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(expected, result);
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,22 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<IsPackable>false</IsPackable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
|
||||||
|
<PackageReference Include="xunit" Version="2.4.1" />
|
||||||
|
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
</PackageReference>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="../csharp/csharp.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
20
problems/3027-find-the-number-of-ways-to-place-people-ii/test/run_tests.sh
Executable file
20
problems/3027-find-the-number-of-ways-to-place-people-ii/test/run_tests.sh
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "🧪 執行 LeetCode 題目測試"
|
||||||
|
echo "=========================="
|
||||||
|
|
||||||
|
# 執行 C# 測試
|
||||||
|
echo "📋 C# 測試結果:"
|
||||||
|
cd ../csharp
|
||||||
|
if dotnet build > /dev/null 2>&1; then
|
||||||
|
cd ../test
|
||||||
|
if dotnet test --logger "console;verbosity=minimal" 2>/dev/null; then
|
||||||
|
echo "✅ C# 測試通過"
|
||||||
|
else
|
||||||
|
echo "❌ C# 測試失敗"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "❌ C# 編譯失敗"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "📊 測試完成!"
|
Reference in New Issue
Block a user