xref: /llvm-project/clang/unittests/Format/IntegerLiteralSeparatorTest.cpp (revision a72b064acf9546ee41c67c77ed8662d5d3b2fadc)
189aad1e6SOwen Pan //===- unittest/Format/IntegerLiteralSeparatorTest.cpp --------------------===//
289aad1e6SOwen Pan //
389aad1e6SOwen Pan // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
489aad1e6SOwen Pan // See https://llvm.org/LICENSE.txt for license information.
589aad1e6SOwen Pan // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
689aad1e6SOwen Pan //
789aad1e6SOwen Pan //===----------------------------------------------------------------------===//
889aad1e6SOwen Pan 
9f8d10d5aSManuel Klimek #include "FormatTestBase.h"
1089aad1e6SOwen Pan 
1189aad1e6SOwen Pan #define DEBUG_TYPE "integer-literal-separator-test"
1289aad1e6SOwen Pan 
1389aad1e6SOwen Pan namespace clang {
1489aad1e6SOwen Pan namespace format {
15f8d10d5aSManuel Klimek namespace test {
1689aad1e6SOwen Pan namespace {
1789aad1e6SOwen Pan 
18f8d10d5aSManuel Klimek class IntegerLiteralSeparatorTest : public FormatTestBase {};
1989aad1e6SOwen Pan 
TEST_F(IntegerLiteralSeparatorTest,SingleQuoteAsSeparator)2089aad1e6SOwen Pan TEST_F(IntegerLiteralSeparatorTest, SingleQuoteAsSeparator) {
2189aad1e6SOwen Pan   FormatStyle Style = getLLVMStyle();
2289aad1e6SOwen Pan   EXPECT_EQ(Style.Language, FormatStyle::LK_Cpp);
2389aad1e6SOwen Pan   EXPECT_EQ(Style.IntegerLiteralSeparator.Binary, 0);
2489aad1e6SOwen Pan   EXPECT_EQ(Style.IntegerLiteralSeparator.Decimal, 0);
2589aad1e6SOwen Pan   EXPECT_EQ(Style.IntegerLiteralSeparator.Hex, 0);
2689aad1e6SOwen Pan 
2789aad1e6SOwen Pan   const StringRef Binary("b = 0b10011'11'0110'1u;");
2889aad1e6SOwen Pan   verifyFormat(Binary, Style);
2989aad1e6SOwen Pan   Style.IntegerLiteralSeparator.Binary = -1;
3089aad1e6SOwen Pan   verifyFormat("b = 0b100111101101u;", Binary, Style);
3189aad1e6SOwen Pan   Style.IntegerLiteralSeparator.Binary = 1;
3289aad1e6SOwen Pan   verifyFormat("b = 0b1'0'0'1'1'1'1'0'1'1'0'1u;", Binary, Style);
3389aad1e6SOwen Pan   Style.IntegerLiteralSeparator.Binary = 4;
3489aad1e6SOwen Pan   verifyFormat("b = 0b1001'1110'1101u;", Binary, Style);
3589aad1e6SOwen Pan 
3689aad1e6SOwen Pan   const StringRef Decimal("d = 184467'440737'0'95505'92Ull;");
3789aad1e6SOwen Pan   verifyFormat(Decimal, Style);
3889aad1e6SOwen Pan   Style.IntegerLiteralSeparator.Decimal = -1;
3989aad1e6SOwen Pan   verifyFormat("d = 18446744073709550592Ull;", Decimal, Style);
4089aad1e6SOwen Pan   Style.IntegerLiteralSeparator.Decimal = 3;
4189aad1e6SOwen Pan   verifyFormat("d = 18'446'744'073'709'550'592Ull;", Decimal, Style);
4289aad1e6SOwen Pan 
4389aad1e6SOwen Pan   const StringRef Hex("h = 0xDEAD'BEEF'DE'AD'BEE'Fuz;");
4489aad1e6SOwen Pan   verifyFormat(Hex, Style);
4589aad1e6SOwen Pan   Style.IntegerLiteralSeparator.Hex = -1;
4689aad1e6SOwen Pan   verifyFormat("h = 0xDEADBEEFDEADBEEFuz;", Hex, Style);
4789aad1e6SOwen Pan   Style.IntegerLiteralSeparator.Hex = 2;
4889aad1e6SOwen Pan   verifyFormat("h = 0xDE'AD'BE'EF'DE'AD'BE'EFuz;", Hex, Style);
4989aad1e6SOwen Pan 
5089aad1e6SOwen Pan   verifyFormat("o0 = 0;\n"
5189aad1e6SOwen Pan                "o1 = 07;\n"
524d21868bSOwen Pan                "o5 = 012345;",
534d21868bSOwen Pan                Style);
544d21868bSOwen Pan 
554d21868bSOwen Pan   verifyFormat("bi = 0b1'0000i;\n"
564d21868bSOwen Pan                "dif = 1'234if;\n"
574d21868bSOwen Pan                "hil = 0xA'BCil;",
584d21868bSOwen Pan                "bi = 0b10000i;\n"
594d21868bSOwen Pan                "dif = 1234if;\n"
604d21868bSOwen Pan                "hil = 0xABCil;",
614d21868bSOwen Pan                Style);
624d21868bSOwen Pan 
63*a72b064aSOwen Pan   verifyFormat("bd = 0b1'0000d;\n"
64*a72b064aSOwen Pan                "dh = 1'234h;\n"
65*a72b064aSOwen Pan                "dmin = 1'234min;\n"
66*a72b064aSOwen Pan                "dns = 1'234ns;\n"
67*a72b064aSOwen Pan                "ds = 1'234s;\n"
68*a72b064aSOwen Pan                "dus = 1'234us;\n"
69*a72b064aSOwen Pan                "hy = 0xA'BCy;",
70*a72b064aSOwen Pan                "bd = 0b10000d;\n"
71*a72b064aSOwen Pan                "dh = 1234h;\n"
72*a72b064aSOwen Pan                "dmin = 1234min;\n"
73*a72b064aSOwen Pan                "dns = 1234ns;\n"
74*a72b064aSOwen Pan                "ds = 1234s;\n"
75*a72b064aSOwen Pan                "dus = 1234us;\n"
76*a72b064aSOwen Pan                "hy = 0xABCy;",
77*a72b064aSOwen Pan                Style);
78*a72b064aSOwen Pan 
79*a72b064aSOwen Pan   verifyFormat("hd = 0xAB'Cd;", "hd = 0xABCd;", Style);
80*a72b064aSOwen Pan 
814d21868bSOwen Pan   verifyFormat("d = 5'678_km;\n"
824d21868bSOwen Pan                "h = 0xD'EF_u16;",
834d21868bSOwen Pan                "d = 5678_km;\n"
844d21868bSOwen Pan                "h = 0xDEF_u16;",
8589aad1e6SOwen Pan                Style);
8689aad1e6SOwen Pan }
8789aad1e6SOwen Pan 
TEST_F(IntegerLiteralSeparatorTest,UnderscoreAsSeparator)8889aad1e6SOwen Pan TEST_F(IntegerLiteralSeparatorTest, UnderscoreAsSeparator) {
8989aad1e6SOwen Pan   FormatStyle Style = getLLVMStyle();
9089aad1e6SOwen Pan   const StringRef Binary("B = 0B10011_11_0110_1;");
9189aad1e6SOwen Pan   const StringRef Decimal("d = 184467_440737_0_95505_92;");
9289aad1e6SOwen Pan   const StringRef Hex("H = 0XDEAD_BEEF_DE_AD_BEE_F;");
9389aad1e6SOwen Pan 
9489aad1e6SOwen Pan   auto TestUnderscore = [&](auto Language) {
9589aad1e6SOwen Pan     Style.Language = Language;
9689aad1e6SOwen Pan 
9789aad1e6SOwen Pan     Style.IntegerLiteralSeparator.Binary = 0;
9889aad1e6SOwen Pan     verifyFormat(Binary, Style);
9989aad1e6SOwen Pan     Style.IntegerLiteralSeparator.Binary = -1;
10089aad1e6SOwen Pan     verifyFormat("B = 0B100111101101;", Binary, Style);
10189aad1e6SOwen Pan     Style.IntegerLiteralSeparator.Binary = 4;
10289aad1e6SOwen Pan     verifyFormat("B = 0B1001_1110_1101;", Binary, Style);
10389aad1e6SOwen Pan 
10489aad1e6SOwen Pan     Style.IntegerLiteralSeparator.Decimal = 0;
10589aad1e6SOwen Pan     verifyFormat(Decimal, Style);
10689aad1e6SOwen Pan     Style.IntegerLiteralSeparator.Decimal = -1;
10789aad1e6SOwen Pan     verifyFormat("d = 18446744073709550592;", Decimal, Style);
10889aad1e6SOwen Pan     Style.IntegerLiteralSeparator.Decimal = 3;
10989aad1e6SOwen Pan     verifyFormat("d = 18_446_744_073_709_550_592;", Decimal, Style);
11089aad1e6SOwen Pan 
11189aad1e6SOwen Pan     Style.IntegerLiteralSeparator.Hex = 0;
11289aad1e6SOwen Pan     verifyFormat(Hex, Style);
11389aad1e6SOwen Pan     Style.IntegerLiteralSeparator.Hex = -1;
11489aad1e6SOwen Pan     verifyFormat("H = 0XDEADBEEFDEADBEEF;", Hex, Style);
11589aad1e6SOwen Pan     Style.IntegerLiteralSeparator.Hex = 2;
11689aad1e6SOwen Pan     verifyFormat("H = 0XDE_AD_BE_EF_DE_AD_BE_EF;", Hex, Style);
11789aad1e6SOwen Pan   };
11889aad1e6SOwen Pan 
11989aad1e6SOwen Pan   TestUnderscore(FormatStyle::LK_CSharp);
12089aad1e6SOwen Pan   TestUnderscore(FormatStyle::LK_Java);
12189aad1e6SOwen Pan   TestUnderscore(FormatStyle::LK_JavaScript);
12289aad1e6SOwen Pan 
12389aad1e6SOwen Pan   verifyFormat("d = 9_007_199_254_740_995n;", Style);
12489aad1e6SOwen Pan   verifyFormat("d = 9_007_199_254_740_995n;", "d = 9007199254740995n;", Style);
12589aad1e6SOwen Pan 
12689aad1e6SOwen Pan   Style.IntegerLiteralSeparator.Binary = 8;
12789aad1e6SOwen Pan   verifyFormat(
12889aad1e6SOwen Pan       "b = 0b100000_00000000_00000000_00000000_00000000_00000000_00000011n;",
12989aad1e6SOwen Pan       "b = 0b100000000000000000000000000000000000000000000000000011n;", Style);
13089aad1e6SOwen Pan 
13189aad1e6SOwen Pan   verifyFormat("h = 0x20_00_00_00_00_00_03n;", Style);
13289aad1e6SOwen Pan   verifyFormat("h = 0x20_00_00_00_00_00_03n;", "h = 0x20000000000003n;", Style);
13389aad1e6SOwen Pan 
13489aad1e6SOwen Pan   verifyFormat("o = 0o400000000000000003n;", Style);
13589aad1e6SOwen Pan }
13689aad1e6SOwen Pan 
TEST_F(IntegerLiteralSeparatorTest,MinDigits)137253985d5SOwen Pan TEST_F(IntegerLiteralSeparatorTest, MinDigits) {
138253985d5SOwen Pan   FormatStyle Style = getLLVMStyle();
139253985d5SOwen Pan   Style.IntegerLiteralSeparator.Binary = 3;
140253985d5SOwen Pan   Style.IntegerLiteralSeparator.Decimal = 3;
141253985d5SOwen Pan   Style.IntegerLiteralSeparator.Hex = 2;
142253985d5SOwen Pan 
143253985d5SOwen Pan   Style.IntegerLiteralSeparator.BinaryMinDigits = 7;
144253985d5SOwen Pan   verifyFormat("b1 = 0b101101;\n"
145253985d5SOwen Pan                "b2 = 0b1'101'101;",
146253985d5SOwen Pan                "b1 = 0b101'101;\n"
147253985d5SOwen Pan                "b2 = 0b1101101;",
148253985d5SOwen Pan                Style);
149253985d5SOwen Pan 
150253985d5SOwen Pan   Style.IntegerLiteralSeparator.DecimalMinDigits = 5;
151253985d5SOwen Pan   verifyFormat("d1 = 2023;\n"
152253985d5SOwen Pan                "d2 = 10'000;",
153253985d5SOwen Pan                "d1 = 2'023;\n"
154253985d5SOwen Pan                "d2 = 100'00;",
155253985d5SOwen Pan                Style);
156253985d5SOwen Pan 
157253985d5SOwen Pan   Style.IntegerLiteralSeparator.DecimalMinDigits = 3;
158253985d5SOwen Pan   verifyFormat("d1 = 123;\n"
159253985d5SOwen Pan                "d2 = 1'234;",
160253985d5SOwen Pan                "d1 = 12'3;\n"
161253985d5SOwen Pan                "d2 = 12'34;",
162253985d5SOwen Pan                Style);
163253985d5SOwen Pan 
164253985d5SOwen Pan   Style.IntegerLiteralSeparator.HexMinDigits = 6;
165253985d5SOwen Pan   verifyFormat("h1 = 0xABCDE;\n"
166253985d5SOwen Pan                "h2 = 0xAB'CD'EF;",
167253985d5SOwen Pan                "h1 = 0xA'BC'DE;\n"
168253985d5SOwen Pan                "h2 = 0xABC'DEF;",
169253985d5SOwen Pan                Style);
170253985d5SOwen Pan }
171253985d5SOwen Pan 
TEST_F(IntegerLiteralSeparatorTest,FixRanges)17289aad1e6SOwen Pan TEST_F(IntegerLiteralSeparatorTest, FixRanges) {
17389aad1e6SOwen Pan   FormatStyle Style = getLLVMStyle();
17489aad1e6SOwen Pan   Style.IntegerLiteralSeparator.Decimal = 3;
17589aad1e6SOwen Pan 
17689aad1e6SOwen Pan   const StringRef Code("i = -12'34;\n"
17789aad1e6SOwen Pan                        "// clang-format off\n"
17889aad1e6SOwen Pan                        "j = 123'4;\n"
17989aad1e6SOwen Pan                        "// clang-format on\n"
18089aad1e6SOwen Pan                        "k = +1'23'4;");
18189aad1e6SOwen Pan   const StringRef Expected("i = -1'234;\n"
18289aad1e6SOwen Pan                            "// clang-format off\n"
18389aad1e6SOwen Pan                            "j = 123'4;\n"
18489aad1e6SOwen Pan                            "// clang-format on\n"
18589aad1e6SOwen Pan                            "k = +1'234;");
18689aad1e6SOwen Pan 
18789aad1e6SOwen Pan   verifyFormat(Expected, Code, Style);
18889aad1e6SOwen Pan 
18989aad1e6SOwen Pan   verifyFormat("i = -1'234;\n"
19089aad1e6SOwen Pan                "// clang-format off\n"
19189aad1e6SOwen Pan                "j = 123'4;\n"
19289aad1e6SOwen Pan                "// clang-format on\n"
19389aad1e6SOwen Pan                "k = +1'23'4;",
19489aad1e6SOwen Pan                Code, Style, {tooling::Range(0, 11)}); // line 1
19589aad1e6SOwen Pan 
196f8d10d5aSManuel Klimek   verifyFormat(Code, Code, Style, {tooling::Range(32, 10)}); // line 3
19789aad1e6SOwen Pan 
19889aad1e6SOwen Pan   verifyFormat("i = -12'34;\n"
19989aad1e6SOwen Pan                "// clang-format off\n"
20089aad1e6SOwen Pan                "j = 123'4;\n"
20189aad1e6SOwen Pan                "// clang-format on\n"
20289aad1e6SOwen Pan                "k = +1'234;",
20389aad1e6SOwen Pan                Code, Style, {tooling::Range(61, 12)}); // line 5
20489aad1e6SOwen Pan 
20589aad1e6SOwen Pan   verifyFormat(Expected, Code, Style,
20689aad1e6SOwen Pan                {tooling::Range(0, 11), tooling::Range(61, 12)}); // lines 1, 5
20789aad1e6SOwen Pan }
20889aad1e6SOwen Pan 
TEST_F(IntegerLiteralSeparatorTest,FloatingPoint)20989aad1e6SOwen Pan TEST_F(IntegerLiteralSeparatorTest, FloatingPoint) {
21089aad1e6SOwen Pan   FormatStyle Style = getLLVMStyle();
21189aad1e6SOwen Pan   Style.IntegerLiteralSeparator.Decimal = 3;
21289aad1e6SOwen Pan   Style.IntegerLiteralSeparator.Hex = 2;
21389aad1e6SOwen Pan 
21489aad1e6SOwen Pan   verifyFormat("d0 = .0;\n"
21589aad1e6SOwen Pan                "d1 = 0.;\n"
21689aad1e6SOwen Pan                "y = 7890.;\n"
21789aad1e6SOwen Pan                "E = 3456E2;\n"
21889aad1e6SOwen Pan                "p = 0xABCp2;",
21989aad1e6SOwen Pan                Style);
22089aad1e6SOwen Pan 
22189aad1e6SOwen Pan   Style.Language = FormatStyle::LK_JavaScript;
22289aad1e6SOwen Pan   verifyFormat("y = 7890.;\n"
22389aad1e6SOwen Pan                "e = 3456e2;",
22489aad1e6SOwen Pan                Style);
22589aad1e6SOwen Pan 
22689aad1e6SOwen Pan   Style.Language = FormatStyle::LK_Java;
22789aad1e6SOwen Pan   verifyFormat("y = 7890.;\n"
22889aad1e6SOwen Pan                "E = 3456E2;\n"
22989aad1e6SOwen Pan                "P = 0xABCP2;\n"
23089aad1e6SOwen Pan                "f = 1234f;\n"
23189aad1e6SOwen Pan                "D = 5678D;",
23289aad1e6SOwen Pan                Style);
23389aad1e6SOwen Pan 
23489aad1e6SOwen Pan   Style.Language = FormatStyle::LK_CSharp;
23589aad1e6SOwen Pan   verifyFormat("y = 7890.;\n"
23689aad1e6SOwen Pan                "e = 3456e2;\n"
23789aad1e6SOwen Pan                "F = 1234F;\n"
23889aad1e6SOwen Pan                "d = 5678d;\n"
23989aad1e6SOwen Pan                "M = 9012M",
24089aad1e6SOwen Pan                Style);
24189aad1e6SOwen Pan }
24289aad1e6SOwen Pan 
24389aad1e6SOwen Pan } // namespace
244f8d10d5aSManuel Klimek } // namespace test
24589aad1e6SOwen Pan } // namespace format
24689aad1e6SOwen Pan } // namespace clang
247