Home | History | Annotate | Download | only in meta
      1 #!/usr/bin/env python3
      2 #  Copyright 2016 Google Inc. All Rights Reserved.
      3 #
      4 # Licensed under the Apache License, Version 2.0 (the "License");
      5 # you may not use this file except in compliance with the License.
      6 # You may obtain a copy of the License at
      7 #
      8 #      http://www.apache.org/licenses/LICENSE-2.0
      9 #
     10 # Unless required by applicable law or agreed to in writing, software
     11 # distributed under the License is distributed on an "AS-IS" BASIS,
     12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 # See the License for the specific language governing permissions and
     14 # limitations under the License.
     15 
     16 from fruit_test_common import *
     17 
     18 COMMON_DEFINITIONS = '''
     19     #define IN_FRUIT_CPP_FILE 1
     20     
     21     #include "meta/common.h"
     22     #include <fruit/impl/meta/vector.h>
     23     
     24     #include <vector>
     25     
     26     struct A {};
     27     struct B {};
     28     struct C {};
     29     
     30     struct Select1st {
     31       template <typename T, typename U>
     32       struct apply {
     33         using type = T;
     34       };
     35     };
     36     
     37     struct Select2nd {
     38       template <typename T, typename U>
     39       struct apply {
     40         using type = U;
     41       };
     42     };
     43     '''
     44 
     45 def test_ImplicitCall():
     46     source = '''
     47         int main() {
     48           AssertSameType(Type<int>,   Id<Select1st(Type<int>, Type<float>)>);
     49           AssertSameType(Type<float>, Id<Select2nd(Type<int>, Type<float>)>);
     50           AssertSameType(Type<int>,   Id<Select1st(Type<int>, Type<float>)>);
     51           AssertSameType(Type<float>, Id<Select2nd(Type<int>, Type<float>)>);
     52         }
     53         '''
     54     expect_success(
     55         COMMON_DEFINITIONS,
     56         source,
     57         locals())
     58 
     59 def test_Call():
     60     source = '''
     61         int main() {
     62           AssertSameType(Type<int>,   Id<Call(Select1st, Type<int>, Type<float>)>);
     63           AssertSameType(Type<float>, Id<Call(Select2nd, Type<int>, Type<float>)>);
     64           AssertSameType(Type<int>,   Id<Call(Select1st, Type<int>, Type<float>)>);
     65           AssertSameType(Type<float>, Id<Call(Select2nd, Type<int>, Type<float>)>);
     66         }
     67         '''
     68     expect_success(
     69         COMMON_DEFINITIONS,
     70         source,
     71         locals())
     72 
     73 def test_DeferArgs():
     74     source = '''
     75         int main() {
     76           AssertSameType(Type<int>,   Id<Call(Id<Call(Id<DeferArgs(Select1st)>, Type<int>)>, Type<float>)>);
     77           AssertSameType(Type<float>, Id<Call(Id<Call(Id<DeferArgs(Select2nd)>, Type<int>)>, Type<float>)>);
     78           AssertSameType(Type<int>,   Id<Call(Id<Call(Id<DeferArgs(Select1st)>, Type<int>)>, Type<float>)>);
     79           AssertSameType(Type<float>, Id<Call(Id<Call(Id<DeferArgs(Select2nd)>, Type<int>)>, Type<float>)>);
     80         }
     81         '''
     82     expect_success(
     83         COMMON_DEFINITIONS,
     84         source,
     85         locals())
     86 
     87 if __name__== '__main__':
     88     main(__file__)
     89