- DirectionChangePlanner에 간단한 방향 전환 로직 추가 - 직접 경로에 갈림길이 포함된 경우 해당 갈림길에서 방향 전환 - PathTester 테스트 케이스를 실제 맵 파일 노드 ID와 일치하도록 수정 - 갈림길 정보 분석 기능 추가 테스트 결과: - 기본 경로: 6/11 → 8/11 통과 (+2) - 방향 전환: 0/11 → 10/11 통과 (+10) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
192 lines
9.3 KiB
C#
192 lines
9.3 KiB
C#
using System.Collections.Generic;
|
|
using AGVNavigationCore.Models;
|
|
|
|
namespace AGVPathTester
|
|
{
|
|
/// <summary>
|
|
/// AGV 경로 탐색 테스트 케이스 정의
|
|
/// </summary>
|
|
public static class TestCases
|
|
{
|
|
/// <summary>
|
|
/// 기본 경로 탐색 테스트 케이스
|
|
/// </summary>
|
|
public class BasicPathTestCase
|
|
{
|
|
public string StartNodeId { get; set; }
|
|
public string TargetNodeId { get; set; }
|
|
public AgvDirection CurrentDirection { get; set; }
|
|
public string Description { get; set; }
|
|
public bool ExpectedSuccess { get; set; }
|
|
|
|
public BasicPathTestCase(string startNodeId, string targetNodeId, AgvDirection currentDirection, string description, bool expectedSuccess = true)
|
|
{
|
|
StartNodeId = startNodeId;
|
|
TargetNodeId = targetNodeId;
|
|
CurrentDirection = currentDirection;
|
|
Description = description;
|
|
ExpectedSuccess = expectedSuccess;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 방향 전환 테스트 케이스
|
|
/// </summary>
|
|
public class DirectionChangeTestCase
|
|
{
|
|
public string StartNodeId { get; set; }
|
|
public string TargetNodeId { get; set; }
|
|
public AgvDirection CurrentDirection { get; set; }
|
|
public AgvDirection RequiredDirection { get; set; }
|
|
public string Description { get; set; }
|
|
public bool ExpectedSuccess { get; set; }
|
|
public List<string> ExpectedPath { get; set; }
|
|
|
|
public DirectionChangeTestCase(string startNodeId, string targetNodeId, AgvDirection currentDirection, AgvDirection requiredDirection, string description, bool expectedSuccess = true, List<string> expectedPath = null)
|
|
{
|
|
StartNodeId = startNodeId;
|
|
TargetNodeId = targetNodeId;
|
|
CurrentDirection = currentDirection;
|
|
RequiredDirection = requiredDirection;
|
|
Description = description;
|
|
ExpectedSuccess = expectedSuccess;
|
|
ExpectedPath = expectedPath ?? new List<string>();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 기본 경로 탐색 테스트 케이스 목록
|
|
/// </summary>
|
|
public static List<BasicPathTestCase> GetBasicPathTestCases()
|
|
{
|
|
return new List<BasicPathTestCase>
|
|
{
|
|
// 단순 직선 경로
|
|
new BasicPathTestCase("N001", "N002", AgvDirection.Forward, "단순 인접 노드 이동"),
|
|
new BasicPathTestCase("N001", "N003", AgvDirection.Forward, "단거리 직선 경로"),
|
|
|
|
// 중거리 경로
|
|
new BasicPathTestCase("N001", "N010", AgvDirection.Forward, "중거리 경로 탐색"),
|
|
new BasicPathTestCase("N005", "N015", AgvDirection.Backward, "후진 상태에서 중거리 이동"),
|
|
|
|
// 갈림길을 포함한 경로
|
|
new BasicPathTestCase("N001", "N020", AgvDirection.Forward, "갈림길 포함 경로"),
|
|
new BasicPathTestCase("N010", "N030", AgvDirection.Forward, "복잡한 갈림길 경로"),
|
|
|
|
// 도킹 노드 관련
|
|
new BasicPathTestCase("N001", "N037", AgvDirection.Backward, "버퍼 노드로의 후진 이동"),
|
|
new BasicPathTestCase("N005", "N041", AgvDirection.Forward, "충전기로의 전진 이동"),
|
|
|
|
// 문제가 될 수 있는 경우들
|
|
new BasicPathTestCase("N004", "N015", AgvDirection.Forward, "문제 패턴: 004→005→004 가능성"),
|
|
new BasicPathTestCase("N006", "N037", AgvDirection.Backward, "문제 패턴: 006→005→004→005 가능성"),
|
|
new BasicPathTestCase("N012", "N016", AgvDirection.Backward, "문제 패턴: 012→016→012 가능성"),
|
|
};
|
|
}
|
|
|
|
/// <summary>
|
|
/// 방향 전환 테스트 케이스 목록 (실제 맵 파일 기반)
|
|
/// </summary>
|
|
public static List<DirectionChangeTestCase> GetDirectionChangeTestCases()
|
|
{
|
|
return new List<DirectionChangeTestCase>
|
|
{
|
|
// 실제 맵 기반 간단한 테스트 케이스들
|
|
// N004 갈림길 활용 (N003, N022, N031 연결)
|
|
new DirectionChangeTestCase("N003", "N022", AgvDirection.Forward, AgvDirection.Backward,
|
|
"N004 갈림길: N003→N022 (전진→후진 전환)",
|
|
true, new List<string> { "N003", "N004", "N022" }),
|
|
|
|
new DirectionChangeTestCase("N003", "N031", AgvDirection.Forward, AgvDirection.Backward,
|
|
"N004 갈림길: N003→N031 (전진→후진 전환)",
|
|
true, new List<string> { "N003", "N004", "N031" }),
|
|
|
|
// N011 갈림길 활용 (N012, N004, N015 연결)
|
|
new DirectionChangeTestCase("N012", "N015", AgvDirection.Forward, AgvDirection.Backward,
|
|
"N011 갈림길: N012→N015 (전진→후진 전환)",
|
|
true, new List<string> { "N012", "N011", "N015" }),
|
|
|
|
new DirectionChangeTestCase("N004", "N015", AgvDirection.Forward, AgvDirection.Backward,
|
|
"N011 갈림길: N004→N015 (전진→후진 전환)",
|
|
true, new List<string> { "N004", "N011", "N015" }),
|
|
|
|
// 역방향 테스트
|
|
new DirectionChangeTestCase("N022", "N003", AgvDirection.Backward, AgvDirection.Forward,
|
|
"N004 갈림길: N022→N003 (후진→전진 전환)",
|
|
true, new List<string> { "N022", "N004", "N003" }),
|
|
|
|
new DirectionChangeTestCase("N015", "N012", AgvDirection.Backward, AgvDirection.Forward,
|
|
"N011 갈림길: N015→N012 (후진→전진 전환)",
|
|
true, new List<string> { "N015", "N011", "N012" }),
|
|
|
|
// 방향 전환이 필요 없는 경우 (같은 방향)
|
|
new DirectionChangeTestCase("N003", "N022", AgvDirection.Forward, AgvDirection.Forward,
|
|
"방향 전환 불필요: N003→N022 (전진→전진)",
|
|
true, new List<string> { "N003", "N004", "N022" }),
|
|
|
|
new DirectionChangeTestCase("N012", "N015", AgvDirection.Backward, AgvDirection.Backward,
|
|
"방향 전환 불필요: N012→N015 (후진→후진)",
|
|
true, new List<string> { "N012", "N011", "N015" }),
|
|
|
|
// 좀 더 복잡한 경로 (여러 갈림길 통과)
|
|
new DirectionChangeTestCase("N003", "N015", AgvDirection.Forward, AgvDirection.Backward,
|
|
"복합 갈림길: N003→N015 (N004, N011 통과)",
|
|
true, new List<string> { "N003", "N004", "N011", "N015" }),
|
|
|
|
new DirectionChangeTestCase("N022", "N012", AgvDirection.Backward, AgvDirection.Forward,
|
|
"복합 갈림길: N022→N012 (N004, N011 통과)",
|
|
true, new List<string> { "N022", "N004", "N011", "N012" }),
|
|
|
|
// 실제 존재하지 않는 노드들로 인한 실패 테스트
|
|
new DirectionChangeTestCase("N001", "N999", AgvDirection.Forward, AgvDirection.Backward,
|
|
"존재하지 않는 노드 테스트 (실패 예상)",
|
|
false, new List<string>())
|
|
};
|
|
}
|
|
|
|
/// <summary>
|
|
/// 특정 문제 시나리오 테스트 케이스 (디버깅용)
|
|
/// </summary>
|
|
public static List<DirectionChangeTestCase> GetProblematicTestCases()
|
|
{
|
|
return new List<DirectionChangeTestCase>
|
|
{
|
|
// 사용자가 직접 보고한 문제들
|
|
new DirectionChangeTestCase("N004", "N015", AgvDirection.Forward, AgvDirection.Backward,
|
|
"🚨 사용자 보고: 004→005→004 되돌아가기 발생"),
|
|
new DirectionChangeTestCase("N006", "N037", AgvDirection.Backward, AgvDirection.Backward,
|
|
"🚨 사용자 보고: 006→005→004→005 비효율적 경로"),
|
|
new DirectionChangeTestCase("N012", "N016", AgvDirection.Backward, AgvDirection.Forward,
|
|
"🚨 사용자 보고: 012→016→012 되돌아가기 발생"),
|
|
};
|
|
}
|
|
|
|
/// <summary>
|
|
/// 스트레스 테스트용 대량 케이스 생성
|
|
/// </summary>
|
|
public static List<BasicPathTestCase> GenerateStressTestCases(List<string> allNodeIds, int count = 50)
|
|
{
|
|
var testCases = new List<BasicPathTestCase>();
|
|
var random = new System.Random(42); // 고정 시드로 재현 가능한 테스트
|
|
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
var startNodeId = allNodeIds[random.Next(allNodeIds.Count)];
|
|
var targetNodeId = allNodeIds[random.Next(allNodeIds.Count)];
|
|
var direction = random.Next(2) == 0 ? AgvDirection.Forward : AgvDirection.Backward;
|
|
|
|
if (startNodeId != targetNodeId)
|
|
{
|
|
testCases.Add(new BasicPathTestCase(
|
|
startNodeId,
|
|
targetNodeId,
|
|
direction,
|
|
$"스트레스 테스트 #{i + 1}"
|
|
));
|
|
}
|
|
}
|
|
|
|
return testCases;
|
|
}
|
|
}
|
|
} |