23
#include <gtest/gtest.h>
25
#include <Mod/Material/App/PreCompiled.h>
33
#include <App/Application.h>
34
#include <Base/Quantity.h>
35
#include <Base/Interpreter.h>
36
#include <Gui/MetaTypes.h>
37
#include <src/App/InitApplication.h>
39
#include <Mod/Material/App/MaterialManager.h>
40
#include <Mod/Material/App/Model.h>
41
#include <Mod/Material/App/ModelManager.h>
42
#include <Mod/Material/App/ModelUuids.h>
45
#pragma warning(disable : 4834)
50
class TestMaterial : public ::testing::Test {
52
static void SetUpTestSuite() {
53
if (App::Application::GetARGC() == 0) {
54
tests::initApplication();
58
void SetUp() override {
59
Base::Interpreter().runString("import Part");
60
_modelManager = new Materials::ModelManager();
61
_materialManager = new Materials::MaterialManager();
65
Materials::ModelManager* _modelManager;
66
Materials::MaterialManager* _materialManager;
69
TEST_F(TestMaterial, TestInstallation)
71
ASSERT_NE(_modelManager, nullptr);
74
auto libraries = _materialManager->getMaterialLibraries();
75
ASSERT_GT(libraries->size(), 0);
78
auto materials = _materialManager->getMaterials();
79
ASSERT_GT(materials->size(), 0);
82
TEST_F(TestMaterial, TestMaterialsWithModel)
84
ASSERT_NE(_materialManager, nullptr);
86
auto materials = _materialManager->materialsWithModel(
87
QString::fromStdString("f6f9e48c-b116-4e82-ad7f-3659a9219c50"));
88
EXPECT_GT(materials->size(), 0);
90
auto materialsComplete = _materialManager->materialsWithModelComplete(
91
QString::fromStdString("f6f9e48c-b116-4e82-ad7f-3659a9219c50"));
92
EXPECT_LE(materialsComplete->size(), materials->size());
94
auto materialsLinearElastic = _materialManager->materialsWithModel(
95
QString::fromStdString("7b561d1d-fb9b-44f6-9da9-56a4f74d7536"));
98
EXPECT_LE(materialsLinearElastic->size(), materials->size());
99
for (auto itp : *materialsLinearElastic) {
100
auto mat = itp.first;
101
EXPECT_NO_THROW(materials->at(mat));
105
TEST_F(TestMaterial, TestMaterialByPath)
107
ASSERT_NE(_materialManager, nullptr);
109
auto steel = _materialManager->getMaterialByPath(
110
QString::fromStdString("Standard/Metal/Steel/CalculiX-Steel.FCMat"),
111
QString::fromStdString("System"));
112
EXPECT_NE(&steel, nullptr);
113
EXPECT_EQ(steel->getName(), QString::fromStdString("CalculiX-Steel"));
114
EXPECT_EQ(steel->getUUID(), QString::fromStdString("92589471-a6cb-4bbc-b748-d425a17dea7d"));
117
auto steel2 = _materialManager->getMaterialByPath(
118
QString::fromStdString("/Standard/Metal/Steel/CalculiX-Steel.FCMat"),
119
QString::fromStdString("System"));
120
EXPECT_NE(&steel2, nullptr);
121
EXPECT_EQ(steel2->getName(), QString::fromStdString("CalculiX-Steel"));
122
EXPECT_EQ(steel2->getUUID(), QString::fromStdString("92589471-a6cb-4bbc-b748-d425a17dea7d"));
125
auto steel3 = _materialManager->getMaterialByPath(
126
QString::fromStdString("/System/Standard/Metal/Steel/CalculiX-Steel.FCMat"),
127
QString::fromStdString("System"));
128
EXPECT_NE(&steel3, nullptr);
129
EXPECT_EQ(steel3->getName(), QString::fromStdString("CalculiX-Steel"));
130
EXPECT_EQ(steel3->getUUID(), QString::fromStdString("92589471-a6cb-4bbc-b748-d425a17dea7d"));
133
TEST_F(TestMaterial, TestAddPhysicalModel)
136
Materials::Material material;
137
auto models = material.getPhysicalModels();
138
EXPECT_NE(&models, nullptr);
139
EXPECT_EQ(models->size(), 0);
142
material.addPhysical(Materials::ModelUUIDs::ModelUUID_Electromagnetic_Default);
143
models = material.getPhysicalModels();
144
EXPECT_EQ(models->size(), 1);
147
material.addPhysical(Materials::ModelUUIDs::ModelUUID_Mechanical_LinearElastic);
148
models = material.getPhysicalModels();
149
EXPECT_EQ(models->size(), 2);
152
material.addPhysical(Materials::ModelUUIDs::ModelUUID_Mechanical_IsotropicLinearElastic);
153
models = material.getPhysicalModels();
154
EXPECT_EQ(models->size(), 2);
157
material.clearModels();
158
EXPECT_EQ(models->size(), 0);
160
material.addPhysical(Materials::ModelUUIDs::ModelUUID_Mechanical_IsotropicLinearElastic);
161
models = material.getPhysicalModels();
162
EXPECT_EQ(models->size(), 1);
163
material.addPhysical(Materials::ModelUUIDs::ModelUUID_Mechanical_LinearElastic);
164
models = material.getPhysicalModels();
165
EXPECT_EQ(models->size(), 1);
168
material.removePhysical(Materials::ModelUUIDs::ModelUUID_Mechanical_IsotropicLinearElastic);
169
models = material.getPhysicalModels();
170
EXPECT_EQ(models->size(), 1);
173
material.removePhysical(Materials::ModelUUIDs::ModelUUID_Mechanical_LinearElastic);
174
models = material.getPhysicalModels();
175
EXPECT_EQ(models->size(), 0);
178
TEST_F(TestMaterial, TestAddAppearanceModel)
181
Materials::Material material;
182
auto models = material.getAppearanceModels();
183
EXPECT_NE(models, nullptr);
184
EXPECT_EQ(models->size(), 0);
187
material.addAppearance(Materials::ModelUUIDs::ModelUUID_Rendering_Vector);
188
models = material.getAppearanceModels();
189
EXPECT_EQ(models->size(), 1);
192
material.addAppearance(Materials::ModelUUIDs::ModelUUID_Rendering_Advanced);
193
models = material.getAppearanceModels();
194
EXPECT_EQ(models->size(), 2);
197
material.addAppearance(Materials::ModelUUIDs::ModelUUID_Rendering_Basic);
198
models = material.getAppearanceModels();
199
EXPECT_EQ(models->size(), 2);
202
material.clearModels();
203
EXPECT_EQ(models->size(), 0);
205
material.addAppearance(Materials::ModelUUIDs::ModelUUID_Rendering_Basic);
206
models = material.getAppearanceModels();
207
EXPECT_EQ(models->size(), 1);
208
material.addAppearance(Materials::ModelUUIDs::ModelUUID_Rendering_Advanced);
209
models = material.getAppearanceModels();
210
EXPECT_EQ(models->size(), 1);
213
material.removeAppearance(Materials::ModelUUIDs::ModelUUID_Rendering_Basic);
214
models = material.getAppearanceModels();
215
EXPECT_EQ(models->size(), 1);
218
material.removeAppearance(Materials::ModelUUIDs::ModelUUID_Rendering_Advanced);
219
models = material.getAppearanceModels();
220
EXPECT_EQ(models->size(), 0);
223
QString parseQuantity(const char *string)
225
QString value = QString::fromStdString(string);
226
return Base::Quantity::parse(value).getUserString();
229
TEST_F(TestMaterial, TestCalculiXSteel)
231
ASSERT_NE(_materialManager, nullptr);
233
auto steel = _materialManager->getMaterial(QString::fromStdString("92589471-a6cb-4bbc-b748-d425a17dea7d"));
234
EXPECT_EQ(steel->getName(), QString::fromStdString("CalculiX-Steel"));
235
EXPECT_EQ(steel->getUUID(), QString::fromStdString("92589471-a6cb-4bbc-b748-d425a17dea7d"));
237
EXPECT_TRUE(steel->hasPhysicalModel(Materials::ModelUUIDs::ModelUUID_Mechanical_Density));
238
EXPECT_TRUE(steel->hasPhysicalModel(Materials::ModelUUIDs::ModelUUID_Mechanical_IsotropicLinearElastic));
239
EXPECT_TRUE(steel->hasPhysicalModel(Materials::ModelUUIDs::ModelUUID_Thermal_Default));
240
EXPECT_FALSE(steel->hasPhysicalModel(Materials::ModelUUIDs::ModelUUID_Mechanical_LinearElastic));
241
EXPECT_TRUE(steel->hasAppearanceModel(Materials::ModelUUIDs::ModelUUID_Rendering_Basic));
243
EXPECT_TRUE(steel->isPhysicalModelComplete(Materials::ModelUUIDs::ModelUUID_Mechanical_Density));
244
EXPECT_FALSE(steel->isPhysicalModelComplete(Materials::ModelUUIDs::ModelUUID_Mechanical_IsotropicLinearElastic));
245
EXPECT_FALSE(steel->isPhysicalModelComplete(Materials::ModelUUIDs::ModelUUID_Thermal_Default));
246
EXPECT_FALSE(steel->isPhysicalModelComplete(Materials::ModelUUIDs::ModelUUID_Mechanical_LinearElastic));
247
EXPECT_TRUE(steel->isAppearanceModelComplete(Materials::ModelUUIDs::ModelUUID_Rendering_Basic));
249
EXPECT_TRUE(steel->hasPhysicalProperty(QString::fromStdString("Density")));
250
EXPECT_TRUE(steel->hasPhysicalProperty(QString::fromStdString("BulkModulus")));
251
EXPECT_TRUE(steel->hasPhysicalProperty(QString::fromStdString("PoissonRatio")));
252
EXPECT_TRUE(steel->hasPhysicalProperty(QString::fromStdString("YoungsModulus")));
253
EXPECT_TRUE(steel->hasPhysicalProperty(QString::fromStdString("ShearModulus")));
254
EXPECT_TRUE(steel->hasPhysicalProperty(QString::fromStdString("SpecificHeat")));
255
EXPECT_TRUE(steel->hasPhysicalProperty(QString::fromStdString("ThermalConductivity")));
256
EXPECT_TRUE(steel->hasPhysicalProperty(QString::fromStdString("ThermalExpansionCoefficient")));
257
EXPECT_TRUE(steel->hasAppearanceProperty(QString::fromStdString("AmbientColor")));
258
EXPECT_TRUE(steel->hasAppearanceProperty(QString::fromStdString("DiffuseColor")));
259
EXPECT_TRUE(steel->hasAppearanceProperty(QString::fromStdString("EmissiveColor")));
260
EXPECT_TRUE(steel->hasAppearanceProperty(QString::fromStdString("Shininess")));
261
EXPECT_TRUE(steel->hasAppearanceProperty(QString::fromStdString("SpecularColor")));
262
EXPECT_TRUE(steel->hasAppearanceProperty(QString::fromStdString("Transparency")));
264
auto& properties = steel->getPhysicalProperties();
265
EXPECT_NO_THROW(properties.at(QString::fromStdString("Density")));
266
EXPECT_NO_THROW(properties.at(QString::fromStdString("BulkModulus")));
267
EXPECT_NO_THROW(properties.at(QString::fromStdString("PoissonRatio")));
268
EXPECT_NO_THROW(properties.at(QString::fromStdString("YoungsModulus")));
269
EXPECT_NO_THROW(properties.at(QString::fromStdString("ShearModulus")));
270
EXPECT_NO_THROW(properties.at(QString::fromStdString("SpecificHeat")));
271
EXPECT_NO_THROW(properties.at(QString::fromStdString("ThermalConductivity")));
272
EXPECT_NO_THROW(properties.at(QString::fromStdString("ThermalExpansionCoefficient")));
273
EXPECT_THROW(properties.at(QString::fromStdString("AmbientColor")), std::out_of_range);
274
EXPECT_THROW(properties.at(QString::fromStdString("DiffuseColor")), std::out_of_range);
275
EXPECT_THROW(properties.at(QString::fromStdString("EmissiveColor")), std::out_of_range);
276
EXPECT_THROW(properties.at(QString::fromStdString("Shininess")), std::out_of_range);
277
EXPECT_THROW(properties.at(QString::fromStdString("SpecularColor")), std::out_of_range);
278
EXPECT_THROW(properties.at(QString::fromStdString("Transparency")), std::out_of_range);
280
auto& properties1 = steel->getAppearanceProperties();
281
EXPECT_THROW(properties1.at(QString::fromStdString("Density")), std::out_of_range);
282
EXPECT_THROW(properties1.at(QString::fromStdString("BulkModulus")), std::out_of_range);
283
EXPECT_THROW(properties1.at(QString::fromStdString("PoissonRatio")), std::out_of_range);
284
EXPECT_THROW(properties1.at(QString::fromStdString("YoungsModulus")), std::out_of_range);
285
EXPECT_THROW(properties1.at(QString::fromStdString("ShearModulus")), std::out_of_range);
286
EXPECT_THROW(properties1.at(QString::fromStdString("SpecificHeat")), std::out_of_range);
287
EXPECT_THROW(properties1.at(QString::fromStdString("ThermalConductivity")), std::out_of_range);
288
EXPECT_THROW(properties1.at(QString::fromStdString("ThermalExpansionCoefficient")), std::out_of_range);
289
EXPECT_NO_THROW(properties1.at(QString::fromStdString("AmbientColor")));
290
EXPECT_NO_THROW(properties1.at(QString::fromStdString("DiffuseColor")));
291
EXPECT_NO_THROW(properties1.at(QString::fromStdString("EmissiveColor")));
292
EXPECT_NO_THROW(properties1.at(QString::fromStdString("Shininess")));
293
EXPECT_NO_THROW(properties1.at(QString::fromStdString("SpecularColor")));
294
EXPECT_NO_THROW(properties1.at(QString::fromStdString("Transparency")));
296
EXPECT_FALSE(properties[QString::fromStdString("Density")]->isNull());
297
EXPECT_TRUE(properties[QString::fromStdString("BulkModulus")]->isNull());
298
EXPECT_FALSE(properties[QString::fromStdString("PoissonRatio")]->isNull());
299
EXPECT_FALSE(properties[QString::fromStdString("YoungsModulus")]->isNull());
300
EXPECT_TRUE(properties[QString::fromStdString("ShearModulus")]->isNull());
301
EXPECT_FALSE(properties[QString::fromStdString("SpecificHeat")]->isNull());
302
EXPECT_FALSE(properties[QString::fromStdString("ThermalConductivity")]->isNull());
303
EXPECT_FALSE(properties[QString::fromStdString("ThermalExpansionCoefficient")]->isNull());
304
EXPECT_FALSE(properties1[QString::fromStdString("AmbientColor")]->isNull());
305
EXPECT_FALSE(properties1[QString::fromStdString("DiffuseColor")]->isNull());
306
EXPECT_FALSE(properties1[QString::fromStdString("EmissiveColor")]->isNull());
307
EXPECT_FALSE(properties1[QString::fromStdString("Shininess")]->isNull());
308
EXPECT_FALSE(properties1[QString::fromStdString("SpecularColor")]->isNull());
309
EXPECT_FALSE(properties1[QString::fromStdString("Transparency")]->isNull());
312
EXPECT_EQ(properties[QString::fromStdString("Density")]->getString(), parseQuantity("7900.00 kg/m^3"));
313
EXPECT_EQ(properties[QString::fromStdString("PoissonRatio")]->getString(), locale.toString(0.3));
314
EXPECT_EQ(properties[QString::fromStdString("YoungsModulus")]->getString(), parseQuantity("210.00 GPa"));
315
EXPECT_EQ(properties[QString::fromStdString("SpecificHeat")]->getString(), parseQuantity("590.00 J/kg/K"));
316
EXPECT_EQ(properties[QString::fromStdString("ThermalConductivity")]->getString(), parseQuantity("43.00 W/m/K"));
317
EXPECT_EQ(properties[QString::fromStdString("ThermalExpansionCoefficient")]->getString(), parseQuantity("12.00 µm/m/K"));
318
EXPECT_EQ(properties1[QString::fromStdString("AmbientColor")]->getString(), QString::fromStdString("(0.0020, 0.0020, 0.0020, 1.0)"));
319
EXPECT_EQ(properties1[QString::fromStdString("DiffuseColor")]->getString(), QString::fromStdString("(0.0000, 0.0000, 0.0000, 1.0)"));
320
EXPECT_EQ(properties1[QString::fromStdString("EmissiveColor")]->getString(), QString::fromStdString("(0.0000, 0.0000, 0.0000, 1.0)"));
321
EXPECT_EQ(properties1[QString::fromStdString("Shininess")]->getString(), locale.toString(0.06));
322
EXPECT_EQ(properties1[QString::fromStdString("SpecularColor")]->getString(), QString::fromStdString("(0.9800, 0.9800, 0.9800, 1.0)"));
323
EXPECT_EQ(properties1[QString::fromStdString("Transparency")]->getString(), QString::fromStdString("0"));
325
EXPECT_TRUE(properties[QString::fromStdString("BulkModulus")]->getString().isEmpty());
326
EXPECT_TRUE(properties[QString::fromStdString("ShearModulus")]->getString().isEmpty());
330
EXPECT_DOUBLE_EQ(steel->getPhysicalQuantity(QString::fromStdString("Density")).getValue(), 7.9e-06);
331
EXPECT_NEAR(steel->getPhysicalValue(QString::fromStdString("PoissonRatio")).toDouble(), 0.3, 1e-6);
332
EXPECT_DOUBLE_EQ(steel->getPhysicalQuantity(QString::fromStdString("YoungsModulus")).getValue(), 210000000.0);
333
EXPECT_DOUBLE_EQ(steel->getPhysicalQuantity(QString::fromStdString("SpecificHeat")).getValue(), 590000000.0);
334
EXPECT_DOUBLE_EQ(steel->getPhysicalQuantity(QString::fromStdString("ThermalConductivity")).getValue(), 43000.0);
335
EXPECT_DOUBLE_EQ(steel->getPhysicalQuantity(QString::fromStdString("ThermalExpansionCoefficient")).getValue(), 1.2e-05);
336
EXPECT_EQ(steel->getAppearanceValue(QString::fromStdString("AmbientColor")), QString::fromStdString("(0.0020, 0.0020, 0.0020, 1.0)"));
337
EXPECT_EQ(steel->getAppearanceValue(QString::fromStdString("DiffuseColor")), QString::fromStdString("(0.0000, 0.0000, 0.0000, 1.0)"));
338
EXPECT_EQ(steel->getAppearanceValue(QString::fromStdString("EmissiveColor")), QString::fromStdString("(0.0000, 0.0000, 0.0000, 1.0)"));
339
EXPECT_NEAR(steel->getAppearanceValue(QString::fromStdString("Shininess")).toDouble(), 0.06, 1e-6);
340
EXPECT_EQ(steel->getAppearanceValue(QString::fromStdString("SpecularColor")), QString::fromStdString("(0.9800, 0.9800, 0.9800, 1.0)"));
341
EXPECT_DOUBLE_EQ(steel->getAppearanceValue(QString::fromStdString("Transparency")).toDouble(), 0.0);
343
EXPECT_EQ(steel->getPhysicalQuantity(QString::fromStdString("Density")).getUserString(), parseQuantity("7900.00 kg/m^3"));
344
EXPECT_EQ(steel->getPhysicalQuantity(QString::fromStdString("YoungsModulus")).getUserString(), parseQuantity("210.00 GPa"));
345
EXPECT_EQ(steel->getPhysicalQuantity(QString::fromStdString("SpecificHeat")).getUserString(), parseQuantity("590.00 J/kg/K"));
346
EXPECT_EQ(steel->getPhysicalQuantity(QString::fromStdString("ThermalConductivity")).getUserString(), parseQuantity("43.00 W/m/K"));
347
EXPECT_EQ(steel->getPhysicalQuantity(QString::fromStdString("ThermalExpansionCoefficient")).getUserString(), parseQuantity("12.00 µm/m/K"));
351
TEST_F(TestMaterial, TestColumns)
354
Materials::Material testMaterial;
355
auto models = testMaterial.getPhysicalModels();
356
EXPECT_NE(&models, nullptr);
357
EXPECT_EQ(models->size(), 0);
360
testMaterial.addPhysical(Materials::ModelUUIDs::ModelUUID_Test_Model);
361
models = testMaterial.getPhysicalModels();
362
EXPECT_EQ(models->size(), 1);
364
EXPECT_TRUE(testMaterial.hasPhysicalProperty(QString::fromStdString("TestArray2D")));
365
auto array2d = testMaterial.getPhysicalProperty(QString::fromStdString("TestArray2D"))->getMaterialValue();
366
EXPECT_TRUE(array2d);
367
EXPECT_EQ(dynamic_cast<Materials::Material2DArray &>(*array2d).columns(), 2);
369
EXPECT_TRUE(testMaterial.hasPhysicalProperty(QString::fromStdString("TestArray2D3Column")));
370
auto array2d3Column = testMaterial.getPhysicalProperty(QString::fromStdString("TestArray2D3Column"))->getMaterialValue();
371
EXPECT_TRUE(array2d3Column);
372
EXPECT_EQ(dynamic_cast<Materials::Material2DArray &>(*array2d3Column).columns(), 3);
374
EXPECT_TRUE(testMaterial.hasPhysicalProperty(QString::fromStdString("TestArray3D")));
375
auto array3d = testMaterial.getPhysicalProperty(QString::fromStdString("TestArray3D"))->getMaterialValue();
376
EXPECT_TRUE(array3d);
377
EXPECT_EQ(dynamic_cast<Materials::Material3DArray &>(*array3d).columns(), 2);