FreeCAD

Форк
0
/
ExpressionParser.cpp 
105 строк · 4.1 Кб
1
#include "gtest/gtest.h"
2

3
#include "Base/Quantity.h"
4

5
#include "App/Application.h"
6
#include "App/Document.h"
7
#include "App/DocumentObject.h"
8
#include "App/Expression.h"
9
#include "App/ExpressionParser.h"
10

11
#include "src/App/InitApplication.h"
12

13
// clang-format off
14

15
class ExpressionParserTest: public ::testing::Test
16
{
17
protected:
18
    static void SetUpTestSuite()
19
    {
20
        tests::initApplication();
21
    }
22

23
    void SetUp() override
24
    {
25
        _doc_name = App::GetApplication().getUniqueDocumentName("test");
26
        _this_doc = App::GetApplication().newDocument(_doc_name.c_str(), "testUser");
27
        _this_obj = _this_doc -> addObject("Sketcher::SketchObject");
28
    }
29

30
    void TearDown() override
31
    {
32
        App::GetApplication().closeDocument(_doc_name.c_str());
33
    }
34

35
    std::string doc_name() { return _doc_name; }
36
    App::Document* this_doc() { return _this_doc; }
37
    App::DocumentObject* this_obj() { return _this_obj; }
38

39
    Base::Quantity parse_expression_text_as_quantity(const char* expression_text) {
40
        auto expression = App::ExpressionParser::parse(this_obj(), expression_text);
41
        auto expression_value = expression->getValueAsAny();
42
        auto quantity_result = App::any_cast<Base::Quantity>(expression_value);
43
        return quantity_result;
44
    }
45

46
    Base::Quantity parse_quantity_text_as_quantity(const char* quantity_text) {
47
        auto quantity_qstr = QString::fromStdString(std::string(quantity_text));
48
        auto quantity_result = Base::Quantity::parse(quantity_qstr);
49
        return quantity_result;
50
    }
51

52
private:
53
    std::string _doc_name;
54
    App::Document* _this_doc {};
55
    App::DocumentObject* _this_obj {};
56
};
57

58
// https://github.com/FreeCAD/FreeCAD/issues/11965
59
TEST_F(ExpressionParserTest, functionPARSEQUANT)
60
{
61

62
    EXPECT_ANY_THROW(App::ExpressionParser::parse(this_obj(), "parsequant()")) << "should not parse empty";
63

64
    EXPECT_NO_THROW(App::ExpressionParser::parse(this_obj(), "parsequant(1 mm)")) << "should parse simple quantity";
65
    EXPECT_NO_THROW(App::ExpressionParser::parse(this_obj(), "parsequant(<<(1 + 2) m>>)")) << "should parse literal quantity";
66
    EXPECT_NO_THROW(App::ExpressionParser::parse(this_obj(), "parsequant(str(1 m + 2 mm))")) << "should parse str-function quantity";
67

68
    EXPECT_ANY_THROW(parse_quantity_text_as_quantity("parsequant(1 mm)")) << "should not treat parsequant-function as quantity";
69
    EXPECT_EQ(parse_quantity_text_as_quantity("1 mm"), parse_quantity_text_as_quantity("1 mm")) << "equality sanity check";
70
    EXPECT_NE(parse_quantity_text_as_quantity("1 mm"), parse_quantity_text_as_quantity("2 mm")) << "inequality sanity check";
71

72
    std::array<std::pair<const char*,const char*>, 12> expression_vs_quantity_list = {{
73
        // length
74
        { "1 mm", "1 mm" },
75
        { "parsequant(1 mm)", "1 mm" },
76
        { "parsequant(<<(1 + 2) m>>)", "3000 mm" },
77
        { "parsequant(str(1 m + 2 mm))", "1002 mm"},
78
        // angle
79
        { "10 deg", "10 deg" },
80
        { "parsequant(10 deg)", "10 deg" },
81
        { "parsequant(<<(10 + 20) deg>>)", "30 deg" },
82
        { "parsequant(str(10 deg + 20 deg))", "30 deg" },
83
        // mass
84
        { "10 g", "10 g" },
85
        { "parsequant(10 g)", "10 g" },
86
        { "parsequant(<<(10 + 20) kg>>)", "30000 g" },
87
        { "parsequant(str(10 kg + 20010 g))", "30.01 kg" },
88
    }};
89

90
    for ( const auto& expression_vs_quantity_pair : expression_vs_quantity_list ) {
91
        auto expression_text = expression_vs_quantity_pair.first;
92
        auto quantity_text = expression_vs_quantity_pair.second;
93
        auto expression_result = parse_expression_text_as_quantity(expression_text);
94
        auto quantity_result = parse_quantity_text_as_quantity(quantity_text);
95
        EXPECT_EQ(expression_result, quantity_result) << "mismatch:"
96
            " expression_text='" + std::string(expression_text) + "'"
97
            " quantity_text='" + std::string(quantity_text) + "'"
98
            " expression_representation='" + expression_result.getUserString().toStdString() + "'"
99
            " quantity_representation='" + quantity_result.getUserString().toStdString() + "'"
100
        ;
101
    }
102

103
}
104

105
// clang-format on
106

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.