RegionChooserCLITests.java 6.87 KB
Newer Older
Eric Duminil's avatar
Eric Duminil committed
1
2
package eu.simstadt.regionchooser;

3
4
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
Eric Duminil's avatar
Eric Duminil committed
5
6
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.BufferedWriter;
Eric Duminil's avatar
Eric Duminil committed
7
import java.io.ByteArrayInputStream;
Eric Duminil's avatar
Eric Duminil committed
8
9
import java.io.ByteArrayOutputStream;
import java.io.IOException;
Eric Duminil's avatar
Eric Duminil committed
10
import java.io.InputStream;
Eric Duminil's avatar
Eric Duminil committed
11
import java.io.PrintStream;
Eric Duminil's avatar
Eric Duminil committed
12
import java.nio.charset.StandardCharsets;
Eric Duminil's avatar
Eric Duminil committed
13
14
15
16
17
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.junit.jupiter.api.AfterEach; // JUnit 5
import org.junit.jupiter.api.BeforeEach; // JUnit 5
Eric Duminil's avatar
Eric Duminil committed
18
import org.junit.jupiter.api.Test;
Eric Duminil's avatar
Eric Duminil committed
19
import org.junit.jupiter.api.io.TempDir;
Eric Duminil's avatar
Eric Duminil committed
20
21
22
import picocli.CommandLine;


Eric Duminil's avatar
Eric Duminil committed
23
class RegionChooserCLITests
Eric Duminil's avatar
Eric Duminil committed
24
{
Eric Duminil's avatar
Eric Duminil committed
25
26
27
28
	final PrintStream originalOut = System.out;
	final PrintStream originalErr = System.err;
	final ByteArrayOutputStream out = new ByteArrayOutputStream();
	final ByteArrayOutputStream err = new ByteArrayOutputStream();
Eric Duminil's avatar
Eric Duminil committed
29

Eric Duminil's avatar
Eric Duminil committed
30
	private static final Path TEST_REPOSITORY = Paths.get("src/test/resources/testdata/");
Eric Duminil's avatar
Eric Duminil committed
31

Eric Duminil's avatar
Eric Duminil committed
32
33
34
35
36

	@TempDir
	Path tempDirectory;
	Path outGML;

Eric Duminil's avatar
Eric Duminil committed
37
	@BeforeEach
Eric Duminil's avatar
Eric Duminil committed
38
	public void setUp() {
Eric Duminil's avatar
Eric Duminil committed
39
40
41
42
		out.reset();
		err.reset();
		System.setOut(new PrintStream(out));
		System.setErr(new PrintStream(err));
Eric Duminil's avatar
Eric Duminil committed
43
		outGML = tempDirectory.resolve("output.gml");
Eric Duminil's avatar
Eric Duminil committed
44
	}
Eric Duminil's avatar
Eric Duminil committed
45

Eric Duminil's avatar
Eric Duminil committed
46
	@AfterEach
Eric Duminil's avatar
Eric Duminil committed
47
	public void restore() throws IOException {
Eric Duminil's avatar
Eric Duminil committed
48
49
		System.setOut(originalOut);
		System.setErr(originalErr);
Eric Duminil's avatar
Eric Duminil committed
50
		Files.deleteIfExists(outGML);
Eric Duminil's avatar
Eric Duminil committed
51
52
	}

Eric Duminil's avatar
Eric Duminil committed
53
54
	@Test
	void testNoInput() {
Eric Duminil's avatar
Eric Duminil committed
55
		new CommandLine(new RegionChooserCLI()).execute("");
Eric Duminil's avatar
Eric Duminil committed
56
57
58
59
60
61
62
63
64
		String expectedErr = "Missing required options: '--input=input.gml', '--output=output.gml', '--wkt=polygon.wkt'";
		assertTrue(err.toString().contains(expectedErr), err.toString() + " should contain " + expectedErr);
	}

	@Test
	void testExtractRegionFromTwoCitygmls() throws IOException {
		String wktPolygon = "POLYGON((3512984.7003764412 5405148.310572891,3513038.6360455155 5405010.072163861,3513142.7277745553 5405004.02571992,3514204.1661769524 5405563.192081669,3514399.2818417274 5405720.905457244,3514291.6158155007 5405896.706492759,3512984.7003764412 5405148.310572891))";
		Path citygml1 = TEST_REPOSITORY.resolve("Stuttgart.proj/Stuttgart_LOD0_LOD1_small.gml");
		Path citygml2 = TEST_REPOSITORY.resolve("Stuttgart.proj/Stöckach_überarbeitete GML-NoBuildingPart.gml");
Eric Duminil's avatar
Eric Duminil committed
65
		Path inWKT = tempDirectory.resolve("polygon.wkt");
Eric Duminil's avatar
Eric Duminil committed
66
67
68
		try (BufferedWriter wkt = Files.newBufferedWriter(inWKT)) {
			wkt.write(wktPolygon);
		}
69
		assertFalse(Files.exists(outGML));
Eric Duminil's avatar
Eric Duminil committed
70
		new CommandLine(new RegionChooserCLI()).execute("--input=" + citygml1 + "," + citygml2,
Eric Duminil's avatar
Eric Duminil committed
71
				"--output=" + outGML, "--wkt=" + inWKT, "--epsg=31463", "--local");
72
		assertTrue(Files.exists(outGML));
Eric Duminil's avatar
Eric Duminil committed
73
		assertTrue(Files.size(outGML) > 600_000);
74
		assertEquals(20, countBuildings(outGML));
Eric Duminil's avatar
Eric Duminil committed
75
	}
Eric Duminil's avatar
Eric Duminil committed
76
77
78
79
80
81
82


	@Test
	void testExtractRegionFromTwoCitygmlsInWGS84() throws IOException {
		String wktPolygon = "POLYGON((9.18991539528286 48.79067456353269, 9.195580220722313 48.7873947720947, 9.172062612079735 48.78241812742368, 9.170946813129538 48.78569824412753, 9.18991539528286 48.79067456353269))";
		Path citygml1 = TEST_REPOSITORY.resolve("Stuttgart.proj/Stuttgart_LOD0_LOD1_small.gml");
		Path citygml2 = TEST_REPOSITORY.resolve("Stuttgart.proj/Stöckach_überarbeitete GML-NoBuildingPart.gml");
Eric Duminil's avatar
Eric Duminil committed
83
		Path inWKT = tempDirectory.resolve("polygon.wkt");
Eric Duminil's avatar
Eric Duminil committed
84
85
86
		try (BufferedWriter wkt = Files.newBufferedWriter(inWKT)) {
			wkt.write(wktPolygon);
		}
87
		assertFalse(Files.exists(outGML));
Eric Duminil's avatar
Eric Duminil committed
88
		new CommandLine(new RegionChooserCLI()).execute("--input=" + citygml1 + "," + citygml2,
Eric Duminil's avatar
Eric Duminil committed
89
90
91
				"--output=" + outGML, "--wkt=" + inWKT);
		String expectedLog = "EPSG:31463";
		assertTrue(err.toString().contains(expectedLog), err.toString() + " should contain " + expectedLog);
92
		assertTrue(Files.exists(outGML));
Eric Duminil's avatar
Eric Duminil committed
93
		assertTrue(Files.size(outGML) > 300_000);
94
95
96
		assertEquals(22, countBuildings(outGML));
	}

Eric Duminil's avatar
Eric Duminil committed
97
98
99
100
101
102
	@Test
	void testExtractRegionWithStandardInput() throws IOException {
		String wktPolygon = "POLYGON((-73.9959209576448 40.73286384885367, -73.996317924579 40.732359794090684, -73.9947515145143 40.7315061442504, -73.99422580154739 40.73214841515045, -73.9959209576448 40.73286384885367))";
		Path citygml = TEST_REPOSITORY.resolve("NewYork.proj/ManhattanSmall.gml");
		InputStream stdin = new ByteArrayInputStream(wktPolygon.getBytes(StandardCharsets.UTF_8));
		System.setIn(stdin);
103
		assertFalse(Files.exists(outGML));
Eric Duminil's avatar
Eric Duminil committed
104
		new CommandLine(new RegionChooserCLI()).execute("--input=" + citygml, "--output=" + outGML,
Eric Duminil's avatar
Eric Duminil committed
105
106
107
				"--wkt=-");
		String expectedLog = "EPSG:32118";
		assertTrue(err.toString().contains(expectedLog), err.toString() + " should contain " + expectedLog);
108
109
		assertTrue(Files.exists(outGML));
		assertEquals(2, countBuildings(outGML));
Eric Duminil's avatar
Eric Duminil committed
110
111
	}

Eric Duminil's avatar
Eric Duminil committed
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
	@Test
	void testExtractRegionWithStandardInputAndStandardOutput() throws IOException {
		String wktPolygon = "POLYGON((-73.99325421344473 40.730897087489666, -73.99359753619864 40.7304702545556, -73.99287870418264 40.7300800049056, -73.99244955074026 40.730592207101864, -73.99325421344473 40.730897087489666))";
		Path citygml = TEST_REPOSITORY.resolve("NewYork.proj/ManhattanSmall.gml");
		InputStream stdin = new ByteArrayInputStream(wktPolygon.getBytes(StandardCharsets.UTF_8));
		System.setIn(stdin);
		Path noOutput = Paths.get("-");
		Files.deleteIfExists(noOutput);
		assertFalse(Files.exists(noOutput));
		new CommandLine(new RegionChooserCLI()).execute("--input=" + citygml, "--output=-", "--wkt=-");
		String expectedLog = "EPSG:32118";
		assertTrue(err.toString().contains(expectedLog), err.toString() + " should contain " + expectedLog);
		String expectedBuilding = "uuid_0547df65-ae80-459e-bb15-c839c1a2e566";
		assertTrue(out.toString().contains(expectedBuilding), out.toString() + " should contain " + expectedBuilding);
		//TODO: Check if footer is here too
		assertFalse(Files.exists(noOutput));
	}

Eric Duminil's avatar
Eric Duminil committed
130
131
132
133
	@Test
	void testExtractRegionWithMissingInput() throws IOException {
		String wktPolygon = "POLYGON((-73.9959209576448 40.73286384885367, -73.996317924579 40.732359794090684, -73.9947515145143 40.7315061442504, -73.99422580154739 40.73214841515045, -73.9959209576448 40.73286384885367))";
		Path citygml = TEST_REPOSITORY.resolve("NewYork.proj/ManhattanSmall.gml");
Eric Duminil's avatar
Eric Duminil committed
134
		Path inWKT = tempDirectory.resolve("polygon.wkt");
Eric Duminil's avatar
Eric Duminil committed
135
136
137
		try (BufferedWriter wkt = Files.newBufferedWriter(inWKT)) {
			wkt.write(wktPolygon);
		}
Eric Duminil's avatar
Eric Duminil committed
138
		new CommandLine(new RegionChooserCLI()).execute("--input=" + citygml, "--output=" + outGML,
Eric Duminil's avatar
Eric Duminil committed
139
140
141
142
143
				"--wkt=-");
		String expectedLog = "EPSG:32118";
		assertTrue(err.toString().contains(expectedLog), err.toString() + " should contain " + expectedLog);
		expectedLog = "Please provide \"POLYGON((x1 y1, x2 y2, ...))\" to standard input.";
		assertTrue(err.toString().contains(expectedLog), err.toString() + " should contain " + expectedLog);
144
		assertFalse(Files.exists(outGML));
Eric Duminil's avatar
Eric Duminil committed
145
	}
Eric Duminil's avatar
Eric Duminil committed
146
147
148
149

	private long countBuildings(Path outGML) throws IOException {
		return Files.readAllLines(outGML).stream().filter(line -> line.contains("bldg:Building gml:id=")).count();
	}
Eric Duminil's avatar
Eric Duminil committed
150
151
}