1 /*
2 * LibrePCB - Professional EDA for everyone!
3 * Copyright (C) 2013 LibrePCB Developers, see AUTHORS.md for contributors.
4 * https://librepcb.org/
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 /*******************************************************************************
21 * Includes
22 ******************************************************************************/
23
24 #include <gtest/gtest.h>
25 #include <librepcb/common/fileio/csvfile.h>
26 #include <librepcb/common/pnp/pickplacecsvwriter.h>
27 #include <librepcb/common/pnp/pickplacedata.h>
28
29 #include <QtCore>
30
31 /*******************************************************************************
32 * Namespace
33 ******************************************************************************/
34 namespace librepcb {
35 namespace tests {
36
37 /*******************************************************************************
38 * Test Class
39 ******************************************************************************/
40
41 class PickPlaceCsvWriterTest : public ::testing::Test {
42 protected:
createData() const43 std::shared_ptr<PickPlaceData> createData() const noexcept {
44 std::shared_ptr<PickPlaceData> data =
45 std::make_shared<PickPlaceData>("project", "version", "board");
46 data->addItem(PickPlaceDataItem("R10", "", "device", "pack,\"age\"",
47 Point(-1000000, -2000000), -Angle::deg45(),
48 PickPlaceDataItem::BoardSide::TOP));
49 data->addItem(PickPlaceDataItem("U5", "1kΩ\r\n\r\n", "device", "package",
50 Point(1000000, 2000000), Angle::deg45(),
51 PickPlaceDataItem::BoardSide::BOTTOM));
52 data->addItem(PickPlaceDataItem("R1", " 1kΩ\n1W\n100V ", "device \"foo\"",
53 "pack,age", Point(1000000, 2000000),
54 Angle::deg45(),
55 PickPlaceDataItem::BoardSide::TOP));
56 return data;
57 }
58 };
59
60 /*******************************************************************************
61 * Test Methods
62 ******************************************************************************/
63
TEST_F(PickPlaceCsvWriterTest,testEmptyData)64 TEST_F(PickPlaceCsvWriterTest, testEmptyData) {
65 PickPlaceData data("project", "version", "board");
66 PickPlaceCsvWriter writer(data);
67 writer.setIncludeMetadataComment(false);
68 std::shared_ptr<CsvFile> file = writer.generateCsv();
69 EXPECT_EQ(
70 "Designator,Value,Device,Package,Position X,Position Y,Rotation,Side\n",
71 file->toString().toStdString());
72 }
73
TEST_F(PickPlaceCsvWriterTest,testBothSides)74 TEST_F(PickPlaceCsvWriterTest, testBothSides) {
75 std::shared_ptr<PickPlaceData> data = createData();
76 PickPlaceCsvWriter writer(*data);
77 std::shared_ptr<CsvFile> file = writer.generateCsv();
78 QStringList lines = file->toString().split("\n");
79 EXPECT_EQ("# Pick&Place Position Data File", lines[0].toStdString());
80 EXPECT_EQ("#", lines[1].toStdString());
81 EXPECT_EQ("# Project Name: project", lines[2].toStdString());
82 EXPECT_EQ("# Project Version: version", lines[3].toStdString());
83 EXPECT_EQ("# Board Name: board", lines[4].toStdString());
84 EXPECT_EQ("# Unit: mm", lines[7].toStdString());
85 EXPECT_EQ("# Rotation: Degrees CCW", lines[8].toStdString());
86 EXPECT_EQ("# Board Side: Top + Bottom", lines[9].toStdString());
87 EXPECT_EQ("", lines[10].toStdString());
88 EXPECT_EQ(
89 "Designator,Value,Device,Package,Position X,Position Y,Rotation,Side",
90 lines[11].toStdString());
91 EXPECT_EQ(
92 "R1, 1kΩ 1W 100V ,\"device \"\"foo\"\"\",\"pack,age\",1.0,2.0,45.0,Top",
93 lines[12].toStdString());
94 EXPECT_EQ("R10,,device,\"pack,\"\"age\"\"\",-1.0,-2.0,315.0,Top",
95 lines[13].toStdString());
96 EXPECT_EQ("U5,1kΩ ,device,package,1.0,2.0,45.0,Bottom",
97 lines[14].toStdString());
98 EXPECT_EQ("", lines[15].toStdString());
99 EXPECT_EQ(16, lines.count());
100 }
101
TEST_F(PickPlaceCsvWriterTest,testTopSide)102 TEST_F(PickPlaceCsvWriterTest, testTopSide) {
103 std::shared_ptr<PickPlaceData> data = createData();
104 PickPlaceCsvWriter writer(*data);
105 writer.setIncludeMetadataComment(false);
106 writer.setBoardSide(PickPlaceCsvWriter::BoardSide::TOP);
107 std::shared_ptr<CsvFile> file = writer.generateCsv();
108 QStringList lines = file->toString().split("\n");
109 EXPECT_EQ(
110 "Designator,Value,Device,Package,Position X,Position Y,Rotation,Side",
111 lines[0].toStdString());
112 EXPECT_EQ(
113 "R1, 1kΩ 1W 100V ,\"device \"\"foo\"\"\",\"pack,age\",1.0,2.0,45.0,Top",
114 lines[1].toStdString());
115 EXPECT_EQ("R10,,device,\"pack,\"\"age\"\"\",-1.0,-2.0,315.0,Top",
116 lines[2].toStdString());
117 EXPECT_EQ("", lines[3].toStdString());
118 EXPECT_EQ(4, lines.count());
119 }
120
TEST_F(PickPlaceCsvWriterTest,testBottomSide)121 TEST_F(PickPlaceCsvWriterTest, testBottomSide) {
122 std::shared_ptr<PickPlaceData> data = createData();
123 PickPlaceCsvWriter writer(*data);
124 writer.setIncludeMetadataComment(false);
125 writer.setBoardSide(PickPlaceCsvWriter::BoardSide::BOTTOM);
126 std::shared_ptr<CsvFile> file = writer.generateCsv();
127 QStringList lines = file->toString().split("\n");
128 EXPECT_EQ(
129 "Designator,Value,Device,Package,Position X,Position Y,Rotation,Side",
130 lines[0].toStdString());
131 EXPECT_EQ("U5,1kΩ ,device,package,1.0,2.0,45.0,Bottom",
132 lines[1].toStdString());
133 EXPECT_EQ("", lines[2].toStdString());
134 EXPECT_EQ(3, lines.count());
135 }
136
137 /*******************************************************************************
138 * End of File
139 ******************************************************************************/
140
141 } // namespace tests
142 } // namespace librepcb
143