aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/format/sql_format_ut.cpp
blob: 8714ee2d7c9458bd6c8d0f419aae910e15fcca90 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <library/cpp/testing/unittest/registar.h>

#include "sql_format.h"
#include <yql/essentials/sql/v1/lexer/antlr3/lexer.h>
#include <yql/essentials/sql/v1/lexer/antlr3_ansi/lexer.h>
#include <yql/essentials/sql/v1/proto_parser/antlr3/proto_parser.h>
#include <yql/essentials/sql/v1/proto_parser/antlr3_ansi/proto_parser.h>

#include <google/protobuf/arena.h>
#include <util/string/subst.h>
#include <util/string/join.h>

namespace {

using TCases = TVector<std::pair<TString, TString>>;

struct TSetup {
    TSetup(bool ansiLexer = false) {
        NSQLTranslationV1::TLexers lexers;
        lexers.Antlr3 = NSQLTranslationV1::MakeAntlr3LexerFactory();
        lexers.Antlr3Ansi = NSQLTranslationV1::MakeAntlr3AnsiLexerFactory();
        NSQLTranslationV1::TParsers parsers;
        parsers.Antlr3 = NSQLTranslationV1::MakeAntlr3ParserFactory();
        parsers.Antlr3Ansi = NSQLTranslationV1::MakeAntlr3AnsiParserFactory();

        NSQLTranslation::TTranslationSettings settings;
        settings.Antlr4Parser = false;
        settings.Arena = &Arena;
        settings.AnsiLexer = ansiLexer;
        Formatter = NSQLFormat::MakeSqlFormatter(lexers, parsers, settings);
    }

    void Run(const TCases& cases, NSQLFormat::EFormatMode mode = NSQLFormat::EFormatMode::Pretty) {
        NSQLTranslationV1::TLexers lexers;
        lexers.Antlr3 = NSQLTranslationV1::MakeAntlr3LexerFactory();
        lexers.Antlr3Ansi = NSQLTranslationV1::MakeAntlr3AnsiLexerFactory();

        for (const auto& c : cases) {
            NYql::TIssues issues;
            TString formatted;
            auto res = Formatter->Format(c.first, formatted, issues, mode);
            UNIT_ASSERT_C(res, issues.ToString());
            auto expected = c.second;
            SubstGlobal(expected, "\t", TString(NSQLFormat::OneIndent, ' '));
            UNIT_ASSERT_NO_DIFF(formatted, expected);

            TString formatted2;
            auto res2 = Formatter->Format(formatted, formatted2, issues);
            UNIT_ASSERT_C(res2, issues.ToString());
            UNIT_ASSERT_NO_DIFF(formatted, formatted2);


            if (mode == NSQLFormat::EFormatMode::Pretty) {
                NSQLTranslation::TTranslationSettings settings;
                settings.Antlr4Parser = false;
                auto mutatedQuery = NSQLFormat::MutateQuery(lexers, c.first, settings);
                auto res3 = Formatter->Format(mutatedQuery, formatted, issues);
                UNIT_ASSERT_C(res3, issues.ToString());
            }
        }
    }

    google::protobuf::Arena Arena;
    NSQLFormat::ISqlFormatter::TPtr Formatter;
};

}

Y_UNIT_TEST_SUITE(CheckSqlFormatter) {
    #include "sql_format_ut.h"
}