Завершить контентную архитектуру этапа 4

This commit is contained in:
2026-08-18 22:03:38 +03:00
parent 2ddac2775f
commit 5051f316fe
39 changed files with 1954 additions and 259 deletions
@@ -0,0 +1,82 @@
package com.projectsacrifice.game;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
public final class LevelContentToolTest {
@Rule public final TemporaryFolder temporary = new TemporaryFolder();
@Test
public void validateCommandLoadsARealDirectoryAndReportsVersions() throws Exception {
Path levels = temporary.newFolder("levels").toPath();
writeFixture(levels);
ByteArrayOutputStream output = new ByteArrayOutputStream();
ByteArrayOutputStream errors = new ByteArrayOutputStream();
int exitCode = LevelContentTool.run(
new String[]{"validate", levels.toString()},
new PrintStream(output, true, StandardCharsets.UTF_8),
new PrintStream(errors, true, StandardCharsets.UTF_8));
assertEquals(0, exitCode);
assertEquals("Validated 1 level(s); format=1; physics=1\n",
output.toString(StandardCharsets.UTF_8));
assertEquals("", errors.toString(StandardCharsets.UTF_8));
}
@Test
public void previewCommandProducesByteIdenticalSvgAndCoordinateExport() throws Exception {
Path levels = temporary.newFolder("preview-levels").toPath();
Path first = temporary.newFolder("preview-first").toPath();
Path second = temporary.newFolder("preview-second").toPath();
writeFixture(levels);
assertEquals(0, LevelContentTool.run(
new String[]{"preview", levels.toString(), first.toString()},
new PrintStream(new ByteArrayOutputStream()),
new PrintStream(new ByteArrayOutputStream())));
assertEquals(0, LevelContentTool.run(
new String[]{"preview", levels.toString(), second.toString()},
new PrintStream(new ByteArrayOutputStream()),
new PrintStream(new ByteArrayOutputStream())));
byte[] firstSvg = Files.readAllBytes(first.resolve("level-01.svg"));
byte[] secondSvg = Files.readAllBytes(second.resolve("level-01.svg"));
assertArrayEquals(firstSvg, secondSvg);
assertArrayEquals(Files.readAllBytes(first.resolve("catalog.tsv")),
Files.readAllBytes(second.resolve("catalog.tsv")));
String svg = new String(firstSvg, StandardCharsets.UTF_8);
assertTrue(svg, svg.contains("viewBox=\"0 0 1920 1080\""));
assertTrue(svg, svg.contains("data-kind=\"spawn\""));
assertTrue(svg, svg.contains("data-kind=\"goal\""));
}
private static void writeFixture(Path levels) throws Exception {
Files.writeString(levels.resolve("index.json"),
"{\"formatVersion\":1,\"physicsVersion\":1,\"levels\":[\"level-01.json\"]}");
Files.writeString(levels.resolve("level-01.json"), validLevelJson());
}
private static String validLevelJson() {
return "{\"formatVersion\":1,\"physicsVersion\":1,\"number\":1,"
+ "\"copy\":{\"en\":{\"title\":\"Test\",\"hint\":\"Go.\"},"
+ "\"ru\":{\"title\":\"Тест\",\"hint\":\"Идите.\"}},"
+ "\"world\":{\"width\":1920,\"height\":1080},"
+ "\"spawn\":{\"x\":130,\"y\":760},"
+ "\"goal\":{\"x\":1690,\"y\":770,\"width\":86,\"height\":110},"
+ "\"targets\":{\"deaths\":0,\"seconds\":30},"
+ "\"platforms\":[{\"box\":{\"x\":0,\"y\":880,\"width\":1920,\"height\":200}}],"
+ "\"hazards\":[],\"switches\":[],\"doors\":[]}";
}
}