1*9880d681SAndroid Build Coastguard Worker //===----------- VariadicFunctionTest.cpp - VariadicFunction unit tests ---===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/ArrayRef.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/VariadicFunction.h"
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker using namespace llvm;
15*9880d681SAndroid Build Coastguard Worker namespace {
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker // Defines a variadic function StringCat() to join strings.
18*9880d681SAndroid Build Coastguard Worker // StringCat()'s arguments and return value have class types.
StringCatImpl(ArrayRef<const std::string * > Args)19*9880d681SAndroid Build Coastguard Worker std::string StringCatImpl(ArrayRef<const std::string *> Args) {
20*9880d681SAndroid Build Coastguard Worker std::string S;
21*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Args.size(); i < e; ++i)
22*9880d681SAndroid Build Coastguard Worker S += *Args[i];
23*9880d681SAndroid Build Coastguard Worker return S;
24*9880d681SAndroid Build Coastguard Worker }
25*9880d681SAndroid Build Coastguard Worker const VariadicFunction<std::string, std::string, StringCatImpl> StringCat = {};
26*9880d681SAndroid Build Coastguard Worker
TEST(VariadicFunctionTest,WorksForClassTypes)27*9880d681SAndroid Build Coastguard Worker TEST(VariadicFunctionTest, WorksForClassTypes) {
28*9880d681SAndroid Build Coastguard Worker EXPECT_EQ("", StringCat());
29*9880d681SAndroid Build Coastguard Worker EXPECT_EQ("a", StringCat("a"));
30*9880d681SAndroid Build Coastguard Worker EXPECT_EQ("abc", StringCat("a", "bc"));
31*9880d681SAndroid Build Coastguard Worker EXPECT_EQ("0123456789abcdefghijklmnopqrstuv",
32*9880d681SAndroid Build Coastguard Worker StringCat("0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
33*9880d681SAndroid Build Coastguard Worker "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
34*9880d681SAndroid Build Coastguard Worker "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
35*9880d681SAndroid Build Coastguard Worker "u", "v"));
36*9880d681SAndroid Build Coastguard Worker }
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker // Defines a variadic function Sum(), whose arguments and return value
39*9880d681SAndroid Build Coastguard Worker // have primitive types.
40*9880d681SAndroid Build Coastguard Worker // The return type of SumImp() is deliberately different from its
41*9880d681SAndroid Build Coastguard Worker // argument type, as we want to test that this works.
SumImpl(ArrayRef<const int * > Args)42*9880d681SAndroid Build Coastguard Worker long SumImpl(ArrayRef<const int *> Args) {
43*9880d681SAndroid Build Coastguard Worker long Result = 0;
44*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Args.size(); i < e; ++i)
45*9880d681SAndroid Build Coastguard Worker Result += *Args[i];
46*9880d681SAndroid Build Coastguard Worker return Result;
47*9880d681SAndroid Build Coastguard Worker }
48*9880d681SAndroid Build Coastguard Worker const VariadicFunction<long, int, SumImpl> Sum = {};
49*9880d681SAndroid Build Coastguard Worker
TEST(VariadicFunctionTest,WorksForPrimitiveTypes)50*9880d681SAndroid Build Coastguard Worker TEST(VariadicFunctionTest, WorksForPrimitiveTypes) {
51*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0, Sum());
52*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1, Sum(1));
53*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(12, Sum(10, 2));
54*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1234567, Sum(1000000, 200000, 30000, 4000, 500, 60, 7));
55*9880d681SAndroid Build Coastguard Worker }
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker // Appends an array of strings to dest and returns the number of
58*9880d681SAndroid Build Coastguard Worker // characters appended.
StringAppendImpl(std::string * Dest,ArrayRef<const std::string * > Args)59*9880d681SAndroid Build Coastguard Worker int StringAppendImpl(std::string *Dest, ArrayRef<const std::string *> Args) {
60*9880d681SAndroid Build Coastguard Worker int Chars = 0;
61*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Args.size(); i < e; ++i) {
62*9880d681SAndroid Build Coastguard Worker Chars += Args[i]->size();
63*9880d681SAndroid Build Coastguard Worker *Dest += *Args[i];
64*9880d681SAndroid Build Coastguard Worker }
65*9880d681SAndroid Build Coastguard Worker return Chars;
66*9880d681SAndroid Build Coastguard Worker }
67*9880d681SAndroid Build Coastguard Worker const VariadicFunction1<int, std::string *, std::string,
68*9880d681SAndroid Build Coastguard Worker StringAppendImpl> StringAppend = {};
69*9880d681SAndroid Build Coastguard Worker
TEST(VariadicFunction1Test,Works)70*9880d681SAndroid Build Coastguard Worker TEST(VariadicFunction1Test, Works) {
71*9880d681SAndroid Build Coastguard Worker std::string S0("hi");
72*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0, StringAppend(&S0));
73*9880d681SAndroid Build Coastguard Worker EXPECT_EQ("hi", S0);
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker std::string S1("bin");
76*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2, StringAppend(&S1, "go"));
77*9880d681SAndroid Build Coastguard Worker EXPECT_EQ("bingo", S1);
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker std::string S4("Fab4");
80*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(4 + 4 + 6 + 5,
81*9880d681SAndroid Build Coastguard Worker StringAppend(&S4, "John", "Paul", "George", "Ringo"));
82*9880d681SAndroid Build Coastguard Worker EXPECT_EQ("Fab4JohnPaulGeorgeRingo", S4);
83*9880d681SAndroid Build Coastguard Worker }
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker // Counts how many optional arguments fall in the given range.
86*9880d681SAndroid Build Coastguard Worker // Returns the result in *num_in_range. We make the return type void
87*9880d681SAndroid Build Coastguard Worker // as we want to test that VariadicFunction* can handle it.
CountInRangeImpl(int * NumInRange,int Low,int High,ArrayRef<const int * > Args)88*9880d681SAndroid Build Coastguard Worker void CountInRangeImpl(int *NumInRange, int Low, int High,
89*9880d681SAndroid Build Coastguard Worker ArrayRef<const int *> Args) {
90*9880d681SAndroid Build Coastguard Worker *NumInRange = 0;
91*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Args.size(); i < e; ++i)
92*9880d681SAndroid Build Coastguard Worker if (Low <= *Args[i] && *Args[i] <= High)
93*9880d681SAndroid Build Coastguard Worker ++(*NumInRange);
94*9880d681SAndroid Build Coastguard Worker }
95*9880d681SAndroid Build Coastguard Worker const VariadicFunction3<void, int *, int, int, int,
96*9880d681SAndroid Build Coastguard Worker CountInRangeImpl> CountInRange = {};
97*9880d681SAndroid Build Coastguard Worker
TEST(VariadicFunction3Test,Works)98*9880d681SAndroid Build Coastguard Worker TEST(VariadicFunction3Test, Works) {
99*9880d681SAndroid Build Coastguard Worker int N = -1;
100*9880d681SAndroid Build Coastguard Worker CountInRange(&N, -100, 100);
101*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0, N);
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker CountInRange(&N, -100, 100, 42);
104*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(1, N);
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker CountInRange(&N, -100, 100, 1, 999, -200, 42);
107*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(2, N);
108*9880d681SAndroid Build Coastguard Worker }
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker } // namespace
111