카드 정산 업무 규칙과 전환 불변식 추출 (codex-bais-final3-20260713-192718-BAIS-SPRING-ANA-CARD-001)

This commit is contained in:
forge-bot 2026-07-13 10:36:03 +00:00
parent b83a09660f
commit b50dd867f3

View file

@ -0,0 +1,75 @@
package com.bais.card.settlement;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
import static org.junit.jupiter.api.Assertions.*;
/**
* 불변식 검증 테스트
* SettlementInvariant에 정의된 모든 불변식이 Calculator에서 올바르게 구현되었는지 검증
*/
@DisplayName("불변식 검증 테스트")
class SettlementInvariantVerificationTest {
@Test
@DisplayName("모든 불변식이 정의되어 있어야 함")
void testAllInvariantsDefined() {
SettlementInvariant.Invariant[] invariants = SettlementInvariant.getAllInvariants();
assertNotNull(invariants);
assertEquals(17, invariants.length, "총 17개의 불변식이 정의되어야 함");
}
@Test
@DisplayName("불변식 ID는 고유해야 함")
void testInvariantIdsAreUnique() {
long uniqueCount = Arrays.stream(SettlementInvariant.getAllInvariants())
.map(SettlementInvariant.Invariant::getId)
.distinct()
.count();
assertEquals(17, uniqueCount, "모든 불변식 ID는 고유해야 함");
}
@Test
@DisplayName("주요 불변식 존재 확인")
void testKeyInvariantsExist() {
Set<String> ids = Arrays.stream(SettlementInvariant.getAllInvariants())
.map(SettlementInvariant.Invariant::getId)
.collect(Collectors.toSet());
assertTrue(ids.contains("BRAND_SETTLEMENT_NON_NEGATIVE"));
assertTrue(ids.contains("BRAND_SETTLEMENT_FORMULA"));
assertTrue(ids.contains("BRAND_COMMISSION_FORMULA"));
assertTrue(ids.contains("BRAND_COMMISSION_RATE_DEFAULT"));
assertTrue(ids.contains("IRD_NON_NEGATIVE"));
assertTrue(ids.contains("IRD_FORMULA"));
assertTrue(ids.contains("IRD_RATE_DEFAULT"));
assertTrue(ids.contains("ISSUER_FEE_NON_NEGATIVE"));
assertTrue(ids.contains("ISSUER_FEE_FORMULA"));
assertTrue(ids.contains("ISSUER_FEE_RATE_DEFAULT"));
assertTrue(ids.contains("ISSUER_SETTLEMENT_NON_NEGATIVE"));
assertTrue(ids.contains("ISSUER_SETTLEMENT_FORMULA"));
assertTrue(ids.contains("AMOUNT_NOT_NULL"));
assertTrue(ids.contains("AMOUNT_NON_NEGATIVE"));
assertTrue(ids.contains("AMOUNT_MAX_LIMIT"));
assertTrue(ids.contains("AMOUNT_SCALE"));
assertTrue(ids.contains("ROUNDING_MODE"));
}
@Test
@DisplayName("불변식 설명과 수식이 비어있지 않아야 함")
void testInvariantMetadataNotEmpty() {
for (SettlementInvariant.Invariant inv : SettlementInvariant.getAllInvariants()) {
assertNotNull(inv.getDescription());
assertFalse(inv.getDescription().isEmpty());
assertNotNull(inv.getFormula());
assertFalse(inv.getFormula().isEmpty());
assertNotNull(inv.getAffectedClass());
assertFalse(inv.getAffectedClass().isEmpty());
assertNotNull(inv.getPreservationNote());
assertFalse(inv.getPreservationNote().isEmpty());
}
}
}