1 // Licensed to the Apache Software Foundation (ASF) under one
2 // or more contributor license agreements.  See the NOTICE file
3 // distributed with this work for additional information
4 // regarding copyright ownership.  The ASF licenses this file
5 // to you under the Apache License, Version 2.0 (the
6 // "License"); you may not use this file except in compliance
7 // with the License.  You may obtain a copy of the License at
8 //
9 //   http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing,
12 // software distributed under the License is distributed on an
13 // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 // KIND, either express or implied.  See the License for the
15 // specific language governing permissions and limitations
16 // under the License.
17 
18 #include "gandiva/function_signature.h"
19 
20 #include <memory>
21 
22 #include <gtest/gtest.h>
23 
24 namespace gandiva {
25 
26 class TestFunctionSignature : public ::testing::Test {
27  protected:
SetUp()28   virtual void SetUp() {
29     // Use make_shared so these are distinct from the static instances returned
30     // by e.g. arrow::int32()
31     local_i32_type_ = std::make_shared<arrow::Int32Type>();
32     local_i64_type_ = std::make_shared<arrow::Int64Type>();
33     local_date32_type_ = std::make_shared<arrow::Date32Type>();
34   }
35 
TearDown()36   virtual void TearDown() {
37     local_i32_type_.reset();
38     local_i64_type_.reset();
39     local_date32_type_.reset();
40   }
41 
42   // virtual void TearDown() {}
43   DataTypePtr local_i32_type_;
44   DataTypePtr local_i64_type_;
45   DataTypePtr local_date32_type_;
46 };
47 
TEST_F(TestFunctionSignature,TestToString)48 TEST_F(TestFunctionSignature, TestToString) {
49   EXPECT_EQ(
50       FunctionSignature("myfunc", {arrow::int32(), arrow::float32()}, arrow::float64())
51           .ToString(),
52       "double myfunc(int32, float)");
53 }
54 
TEST_F(TestFunctionSignature,TestEqualsName)55 TEST_F(TestFunctionSignature, TestEqualsName) {
56   EXPECT_EQ(FunctionSignature("add", {arrow::int32()}, arrow::int32()),
57             FunctionSignature("add", {arrow::int32()}, arrow::int32()));
58 
59   EXPECT_EQ(FunctionSignature("add", {arrow::int32()}, arrow::int64()),
60             FunctionSignature("add", {local_i32_type_}, local_i64_type_));
61 
62   EXPECT_FALSE(FunctionSignature("add", {arrow::int32()}, arrow::int32()) ==
63                FunctionSignature("sub", {arrow::int32()}, arrow::int32()));
64 
65   EXPECT_EQ(FunctionSignature("extractDay", {arrow::int64()}, arrow::int64()),
66             FunctionSignature("extractday", {arrow::int64()}, arrow::int64()));
67 
68   EXPECT_EQ(
69       FunctionSignature("castVARCHAR", {arrow::utf8(), arrow::int64()}, arrow::utf8()),
70       FunctionSignature("castvarchar", {arrow::utf8(), arrow::int64()}, arrow::utf8()));
71 }
72 
TEST_F(TestFunctionSignature,TestEqualsParamCount)73 TEST_F(TestFunctionSignature, TestEqualsParamCount) {
74   EXPECT_FALSE(
75       FunctionSignature("add", {arrow::int32(), arrow::int32()}, arrow::int32()) ==
76       FunctionSignature("add", {arrow::int32()}, arrow::int32()));
77 }
78 
TEST_F(TestFunctionSignature,TestEqualsParamValue)79 TEST_F(TestFunctionSignature, TestEqualsParamValue) {
80   EXPECT_FALSE(FunctionSignature("add", {arrow::int32()}, arrow::int32()) ==
81                FunctionSignature("add", {arrow::int64()}, arrow::int32()));
82 
83   EXPECT_FALSE(
84       FunctionSignature("add", {arrow::int32()}, arrow::int32()) ==
85       FunctionSignature("add", {arrow::float32(), arrow::float32()}, arrow::int32()));
86 
87   EXPECT_FALSE(
88       FunctionSignature("add", {arrow::int32(), arrow::int64()}, arrow::int32()) ==
89       FunctionSignature("add", {arrow::int64(), arrow::int32()}, arrow::int32()));
90 
91   EXPECT_EQ(FunctionSignature("extract_month", {arrow::date32()}, arrow::int64()),
92             FunctionSignature("extract_month", {local_date32_type_}, local_i64_type_));
93 
94   EXPECT_FALSE(FunctionSignature("extract_month", {arrow::date32()}, arrow::int64()) ==
95                FunctionSignature("extract_month", {arrow::date64()}, arrow::date32()));
96 }
97 
TEST_F(TestFunctionSignature,TestEqualsReturn)98 TEST_F(TestFunctionSignature, TestEqualsReturn) {
99   EXPECT_FALSE(FunctionSignature("add", {arrow::int32()}, arrow::int64()) ==
100                FunctionSignature("add", {arrow::int32()}, arrow::int32()));
101 }
102 
TEST_F(TestFunctionSignature,TestHash)103 TEST_F(TestFunctionSignature, TestHash) {
104   FunctionSignature f1("add", {arrow::int32(), arrow::int32()}, arrow::int64());
105   FunctionSignature f2("add", {local_i32_type_, local_i32_type_}, local_i64_type_);
106   EXPECT_EQ(f1.Hash(), f2.Hash());
107 
108   FunctionSignature f3("extractDay", {arrow::int64()}, arrow::int64());
109   FunctionSignature f4("extractday", {arrow::int64()}, arrow::int64());
110   EXPECT_EQ(f3.Hash(), f4.Hash());
111 }
112 
113 }  // namespace gandiva
114