OR-Tools  9.6
carp_parser_test.cc
Go to the documentation of this file.
1 // Copyright 2010-2022 Google LLC
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
15 
16 #include <string>
17 
18 #include "absl/base/log_severity.h"
19 #include "absl/flags/flag.h"
20 #include "absl/log/scoped_mock_log.h"
21 #include "gtest/gtest.h"
22 #include "ortools/base/path.h"
23 
24 #if defined(_MSC_VER)
25 #define ROOT_DIR "../../../../../../../"
26 #else
27 #define ROOT_DIR
28 #endif // _MSC_VER
29 
30 ABSL_FLAG(std::string, test_srcdir, "", "REQUIRED: src dir");
31 
32 namespace operations_research {
33 namespace {
34 TEST(CarpParserTest, Constructor) {
35  CarpParser parser;
36  EXPECT_EQ(parser.name(), "");
37  EXPECT_EQ(parser.comment(), "");
38  EXPECT_EQ(parser.NumberOfNodes(), 0);
39  EXPECT_EQ(parser.NumberOfEdgesWithServicing(), 0);
40  EXPECT_EQ(parser.NumberOfEdgesWithoutServicing(), 0);
41  EXPECT_EQ(parser.NumberOfEdges(), 0);
42  EXPECT_EQ(parser.NumberOfVehicles(), 0);
43  EXPECT_EQ(parser.capacity(), 0);
44  EXPECT_EQ(parser.TotalServicingCost(), 0);
45  EXPECT_EQ(parser.depot(), 0);
46 }
47 
48 TEST(CarpParserTest, LoadEmptyFileName) {
49  std::string empty_file_name;
50  CarpParser parser;
51  EXPECT_FALSE(parser.LoadFile(empty_file_name));
52 }
53 
54 TEST(CarpParserTest, LoadNonExistingFile) {
55  CarpParser parser;
56  EXPECT_FALSE(parser.LoadFile(""));
57 }
58 
59 TEST(CarpParserTest, LoadInvalidFileIncorrectNumberOfNodes) {
60  absl::ScopedMockLog log;
61  EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_,
62  "Error when parsing the number of nodes: -4"));
63  EXPECT_CALL(
64  log,
65  Log(absl::LogSeverity::kError, testing::_,
66  "Error when parsing the following metadata line: VERTICES : -4"));
67  log.StartCapturingLogs();
68 
69  CarpParser parser;
70  EXPECT_FALSE(
71  parser.LoadFile(file::JoinPath(absl::GetFlag(FLAGS_test_srcdir), ROOT_DIR
72  "ortools/routing/testdata/"
73  "carp_gdb19_incorrecto_vertices.dat")));
74 }
75 
76 TEST(CarpParserTest, LoadInvalidFileIncorrectNumberOfArcsWithServicings) {
77  absl::ScopedMockLog log;
78  EXPECT_CALL(
79  log, Log(absl::LogSeverity::kError, testing::_,
80  "Error when parsing the number of edges with servicing: -11"));
81  EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_,
82  "Error when parsing the following metadata line: "
83  "ARISTAS_REQ : -11"));
84  log.StartCapturingLogs();
85 
86  CarpParser parser;
87  EXPECT_FALSE(
88  parser.LoadFile(file::JoinPath(absl::GetFlag(FLAGS_test_srcdir), ROOT_DIR
89  "ortools/routing/testdata/"
90  "carp_gdb19_incorrecto_arireq.dat")));
91 }
92 
93 TEST(CarpParserTest, LoadInvalidFileIncorrectNumberOfArcsWithoutServicings) {
94  absl::ScopedMockLog log;
95  EXPECT_CALL(
96  log, Log(absl::LogSeverity::kError, testing::_,
97  "Error when parsing the number of edges without servicing: a"));
98  EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_,
99  "Error when parsing the following metadata line: "
100  "ARISTAS_NOREQ : a"));
101  log.StartCapturingLogs();
102 
103  CarpParser parser;
104  EXPECT_FALSE(
105  parser.LoadFile(file::JoinPath(absl::GetFlag(FLAGS_test_srcdir), ROOT_DIR
106  "ortools/routing/testdata/"
107  "carp_gdb19_incorrecto_arinoreq.dat")));
108 }
109 
110 TEST(CarpParserTest, LoadInvalidFileIncorrectNumberOfVehicles) {
111  absl::ScopedMockLog log;
112  EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_,
113  "Error when parsing the number of vehicles: 0"));
114  EXPECT_CALL(
115  log,
116  Log(absl::LogSeverity::kError, testing::_,
117  "Error when parsing the following metadata line: VEHICULOS : 0"));
118  log.StartCapturingLogs();
119 
120  CarpParser parser;
121  EXPECT_FALSE(
122  parser.LoadFile(file::JoinPath(absl::GetFlag(FLAGS_test_srcdir), ROOT_DIR
123  "ortools/routing/testdata/"
124  "carp_gdb19_incorrecto_vehiculos.dat")));
125 }
126 
127 TEST(CarpParserTest, LoadInvalidFileIncorrectCapacity) {
128  absl::ScopedMockLog log;
129  EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_,
130  "Error when parsing the capacity: 0"));
131  EXPECT_CALL(
132  log,
133  Log(absl::LogSeverity::kError, testing::_,
134  "Error when parsing the following metadata line: CAPACIDAD : 0"));
135  log.StartCapturingLogs();
136 
137  CarpParser parser;
138  EXPECT_FALSE(
139  parser.LoadFile(file::JoinPath(absl::GetFlag(FLAGS_test_srcdir), ROOT_DIR
140  "ortools/routing/testdata/"
141  "carp_gdb19_incorrecto_capacidad.dat")));
142 }
143 
144 TEST(CarpParserTest, LoadInvalidFileIncorrectTypeOfArcCost) {
145  absl::ScopedMockLog log;
146  EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_,
147  "Value of TIPO_COSTES_ARISTAS is unexpected, only "
148  "EXPLICITOS is supported, but IMPLICITOS was found"));
149  EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_,
150  "Error when parsing the following metadata line: "
151  "TIPO_COSTES_ARISTAS : IMPLICITOS"));
152  log.StartCapturingLogs();
153 
154  CarpParser parser;
155  EXPECT_FALSE(
156  parser.LoadFile(file::JoinPath(absl::GetFlag(FLAGS_test_srcdir), ROOT_DIR
157  "ortools/routing/testdata/"
158  "carp_gdb19_incorrecto_tipo.dat")));
159 }
160 
161 TEST(CarpParserTest, LoadInvalidFileIncorrectTotalServicingCost) {
162  absl::ScopedMockLog log;
163  EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_,
164  "Error when parsing the total servicing cost: qwertz"));
165  EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_,
166  "Error when parsing the following metadata line: "
167  "COSTE_TOTAL_REQ : qwertz"));
168  log.StartCapturingLogs();
169 
170  CarpParser parser;
171  EXPECT_FALSE(
172  parser.LoadFile(file::JoinPath(absl::GetFlag(FLAGS_test_srcdir), ROOT_DIR
173  "ortools/routing/testdata/"
174  "carp_gdb19_incorrecto_coste.dat")));
175 }
176 
177 TEST(CarpParserTest, LoadInvalidFileIncorrectDepot) {
178  absl::ScopedMockLog log;
179  EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_,
180  "Could not parse node index: -1"));
181  EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_,
182  "Error when parsing the depot: -1"));
183  EXPECT_CALL(
184  log,
185  Log(absl::LogSeverity::kError, testing::_,
186  "Error when parsing the following metadata line: DEPOSITO : -1"));
187  log.StartCapturingLogs();
188 
189  CarpParser parser;
190  EXPECT_FALSE(
191  parser.LoadFile(file::JoinPath(absl::GetFlag(FLAGS_test_srcdir), ROOT_DIR
192  "ortools/routing/testdata/"
193  "carp_gdb19_incorrecto_deposito.dat")));
194 }
195 
196 TEST(CarpParserTest, LoadInvalidFileNoEdgeWithServicing) {
197  absl::ScopedMockLog log;
198  EXPECT_CALL(log,
199  Log(absl::LogSeverity::kError, testing::_,
200  "Error when parsing the number of edges with servicing: 0"));
201  EXPECT_CALL(
202  log,
203  Log(absl::LogSeverity::kError, testing::_,
204  "Error when parsing the following metadata line: ARISTAS_REQ : 0"));
205  log.StartCapturingLogs();
206 
207  CarpParser parser;
208  EXPECT_FALSE(
209  parser.LoadFile(file::JoinPath(absl::GetFlag(FLAGS_test_srcdir), ROOT_DIR
210  "ortools/routing/"
211  "testdata/carp_gdb19_no_arista_req.dat")));
212 }
213 
214 TEST(CarpParserTest, LoadInvalidFileServicingForArcsWithoutServicing) {
215  absl::ScopedMockLog log;
216  EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_,
217  "Extraneous elements in line, starting with: demanda"));
218  EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_,
219  "Could not parse line in LISTA_ARISTAS_NOREQ: ( 1, 4) "
220  "coste 3 demanda 3"));
221  log.StartCapturingLogs();
222 
223  CarpParser parser;
224  EXPECT_FALSE(
225  parser.LoadFile(file::JoinPath(absl::GetFlag(FLAGS_test_srcdir), ROOT_DIR
226  "ortools/routing/"
227  "testdata/carp_gdb19_mixed_arcs.dat")));
228 }
229 
230 TEST(CarpParserTest, LoadInvalidFileServicingForArcsInWrongOrder) {
231  absl::ScopedMockLog log;
232  EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_,
233  "Unexpected keyword: demanda"));
234  EXPECT_CALL(log, Log(absl::LogSeverity::kError, testing::_,
235  "Could not parse line in LISTA_ARISTAS_REQ: ( 1, 4) "
236  "demanda 3 coste 3"));
237  log.StartCapturingLogs();
238 
239  CarpParser parser;
240  EXPECT_FALSE(parser.LoadFile(
241  file::JoinPath(absl::GetFlag(FLAGS_test_srcdir),
242  ROOT_DIR "ortools/routing/testdata/"
243  "carp_gdb19_incorrecta_lista_aristas_req.dat")));
244 }
245 
246 TEST(CarpParserTest, LoadInstanceFile) {
247  std::string file_name =
248  file::JoinPath(absl::GetFlag(FLAGS_test_srcdir),
249  ROOT_DIR "ortools/routing/testdata/carp_gdb19.dat");
250  CarpParser parser;
251  EXPECT_TRUE(parser.LoadFile(file_name));
252  EXPECT_EQ(parser.name(), "gdb19");
253  EXPECT_EQ(parser.comment(), "10000 (cota superior)");
254  EXPECT_EQ(parser.NumberOfNodes(), 8);
255  EXPECT_EQ(parser.NumberOfEdgesWithServicing(), 11);
256  EXPECT_EQ(parser.NumberOfEdgesWithoutServicing(), 0);
257  EXPECT_EQ(parser.NumberOfEdges(), 11);
258  EXPECT_EQ(parser.NumberOfVehicles(), 3);
259  EXPECT_EQ(parser.capacity(), 27);
260  EXPECT_EQ(parser.TotalServicingCost(), 45);
261  EXPECT_EQ(parser.depot(), 0);
262 
263  EXPECT_EQ(parser.traversing_costs().size(), 11);
264  EXPECT_EQ(parser.GetTraversingCost(0, 1), 4);
265  EXPECT_EQ(parser.GetTraversingCost(1, 0), 4);
266  EXPECT_EQ(parser.servicing_demands().size(), 11);
267  EXPECT_EQ(parser.GetServicing(0, 1), 8);
268  EXPECT_EQ(parser.GetServicing(1, 0), 8);
269 }
270 
271 TEST(CarpParserTest, LoadInstanceFileWithDifferentDepot) {
272  std::string file_name =
273  file::JoinPath(absl::GetFlag(FLAGS_test_srcdir), ROOT_DIR
274  "ortools/routing/testdata/"
275  "carp_gdb19_diferente_deposito.dat");
276  CarpParser parser;
277  EXPECT_TRUE(parser.LoadFile(file_name));
278  EXPECT_EQ(parser.depot(), 4);
279 }
280 } // namespace
281 } // namespace operations_research
#define ROOT_DIR
ABSL_FLAG(std::string, test_srcdir, "", "REQUIRED: src dir")
std::string JoinPath(absl::string_view path1, absl::string_view path2)
Definition: path.cc:25
Collection of objects used to extend the Constraint Solver library.
TEST(LinearAssignmentTest, NullMatrix)