feat(ground): 해상 selectable with MSL levels, 고조위·저조위, and checks

- Rules confirmed (승인 2026-10-26): datum MSL; 고조위 HWL and 저조위 LWL as
  two levels; 세굴 깊이 as for 하상; 파랑과 선박 하중 excluded from this scope.
- Checks: G13 levels missing, G10 해저면 not below 고조위, G11 저조위 not
  below 고조위, G14 pile wall at or below the corrosion allowance reference.
- CORROSION_ALLOWANCE_MM = 1 is a PLACEHOLDER reference (not in the RAG
  documents); the card and G14 mark it as to be confirmed.
- Card: the 해상 inputs; the section draws 고조위 (solid), 저조위 (dashed),
  and labels the ground line 해저면 EL.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
ypshimandClaude Haiku 5.5 committed 2026-10-26 11:11:31 +09:00
1 parent 26a5aff517
commit b6e7f36091
9 files changed
+132 -22

No files matched your search

+33
View File
@@ -216,3 +216,36 @@ describe('하상 (승인 2026-10-26: 설계홍수위 DHWL, 세굴 깊이)', () =
expect(svg).not.toContain('지하수위 25');
});
});
describe('해상 (승인 2026-10-26: MSL 기준, 고조위·저조위 두 개, 부식 여유 기준값, 파랑·선박 하중 제외)', () => {
const sea = { groundPosition: '해상' as const };
it('G13: a 해상 without both the 고조위 and the 저조위', () => {
expect(ground(withGround({ ...sea, highWaterEl: 30 }))).toEqual(['G13']);
});
it('G10: the 해저면 not below the 고조위', () => {
expect(ground(withGround({ ...sea, highWaterEl: 28, lowWaterEl: 25 }))).toEqual(['G10']);
});
it('G11: the 저조위 not below the 고조위', () => {
expect(ground(withGround({ ...sea, highWaterEl: 30, lowWaterEl: 31 }))).toEqual(['G11']);
});
it('a valid 해상 passes, and the 육상 groundwater and 하상 flood inputs are ignored', () => {
expect(ground(withGround({ ...sea, highWaterEl: 30, lowWaterEl: 25, groundWaterOn: true, groundWaterEl: 99, floodLevelEl: 99 }))).toEqual([]);
});
it('G14: a pile wall at or below the corrosion allowance reference', () => {
const issues: Issue[] = [];
validateGround(withGround({ ...sea, highWaterEl: 30, lowWaterEl: 25, pileThicknessMm: 1 }), issues);
expect(issues.map((i) => i.code)).toEqual(['G14']);
});
it('the section shows the 고조위 (solid), the 저조위 (dashed), and the 해저면 label', () => {
const svg = groundSectionSvg(withGround({ ...sea, highWaterEl: 30, lowWaterEl: 25 }), buildPier(base));
expect(svg).toContain('고조위 HWL 30.000');
expect(svg).toContain('저조위 LWL 25.000');
expect(svg).toContain('해저면 EL 28.931');
});
});
+3 -2
View File
@@ -36,8 +36,9 @@ describe('형상 선택지 (spec §5.2, plan C5)', () => {
});
});
it('하상 is the only confirmed ground option; 해상 stays refused until its rule is confirmed', () => {
it('하상 and 해상 are confirmed ground options (승인 2026-10-26); 육상 is the default', () => {
const ground = SHAPE_GROUPS.ground[0].options;
expect(ground.find((o) => o.label === '하상')!.confirmed).toBe(true);
expect(() => choose('ground', 0, '해상')).toThrow('규칙 미정');
expect(ground.find((o) => o.label === '해상')!.confirmed).toBe(true);
expect(choose('ground', 0, '해상')).toBe('해상');
});