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