Files
ENIG/Cs_HMI/AGVPathTester/TestCases.cs
ChiKyun Kim c5f2dbc477 fix: AGV 방향 전환 시스템 대폭 개선
- 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>
2025-09-17 10:49:06 +09:00

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;
}
}
}