View Javadoc
1   /*
2    *    Copyright 2009-2024 the original author or authors.
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    *       https://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  package org.apache.ibatis.reflection;
17  
18  import static org.junit.jupiter.api.Assertions.assertEquals;
19  import static org.junit.jupiter.api.Assertions.assertFalse;
20  import static org.junit.jupiter.api.Assertions.assertTrue;
21  import static org.junit.jupiter.api.Assertions.fail;
22  
23  import java.util.List;
24  import java.util.Map;
25  
26  import org.apache.ibatis.domain.misc.RichType;
27  import org.apache.ibatis.domain.misc.generics.GenericConcrete;
28  import org.junit.jupiter.api.Test;
29  
30  class MetaClassTest {
31  
32    @Test
33    void shouldTestDataTypeOfGenericMethod() {
34      ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
35      MetaClass meta = MetaClass.forClass(GenericConcrete.class, reflectorFactory);
36      assertEquals(Long.class, meta.getGetterType("id"));
37      assertEquals(Long.class, meta.getSetterType("id"));
38    }
39  
40    @Test
41    void shouldThrowReflectionExceptionGetGetterType() {
42      try {
43        ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
44        MetaClass meta = MetaClass.forClass(RichType.class, reflectorFactory);
45        meta.getGetterType("aString");
46        fail("should have thrown ReflectionException");
47      } catch (ReflectionException expected) {
48        assertEquals(
49            "There is no getter for property named \'aString\' in \'class org.apache.ibatis.domain.misc.RichType\'",
50            expected.getMessage());
51      }
52    }
53  
54    @Test
55    void shouldCheckGetterExistance() {
56      ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
57      MetaClass meta = MetaClass.forClass(RichType.class, reflectorFactory);
58      assertTrue(meta.hasGetter("richField"));
59      assertTrue(meta.hasGetter("richProperty"));
60      assertTrue(meta.hasGetter("richList"));
61      assertTrue(meta.hasGetter("richMap"));
62      assertTrue(meta.hasGetter("richList[0]"));
63  
64      assertTrue(meta.hasGetter("richType"));
65      assertTrue(meta.hasGetter("richType.richField"));
66      assertTrue(meta.hasGetter("richType.richProperty"));
67      assertTrue(meta.hasGetter("richType.richList"));
68      assertTrue(meta.hasGetter("richType.richMap"));
69      assertTrue(meta.hasGetter("richType.richList[0]"));
70  
71      assertEquals("richType.richProperty", meta.findProperty("richType.richProperty", false));
72  
73      assertFalse(meta.hasGetter("[0]"));
74    }
75  
76    @Test
77    void shouldCheckSetterExistance() {
78      ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
79      MetaClass meta = MetaClass.forClass(RichType.class, reflectorFactory);
80      assertTrue(meta.hasSetter("richField"));
81      assertTrue(meta.hasSetter("richProperty"));
82      assertTrue(meta.hasSetter("richList"));
83      assertTrue(meta.hasSetter("richMap"));
84      assertTrue(meta.hasSetter("richList[0]"));
85  
86      assertTrue(meta.hasSetter("richType"));
87      assertTrue(meta.hasSetter("richType.richField"));
88      assertTrue(meta.hasSetter("richType.richProperty"));
89      assertTrue(meta.hasSetter("richType.richList"));
90      assertTrue(meta.hasSetter("richType.richMap"));
91      assertTrue(meta.hasSetter("richType.richList[0]"));
92  
93      assertFalse(meta.hasSetter("[0]"));
94    }
95  
96    @Test
97    void shouldCheckTypeForEachGetter() {
98      ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
99      MetaClass meta = MetaClass.forClass(RichType.class, reflectorFactory);
100     assertEquals(String.class, meta.getGetterType("richField"));
101     assertEquals(String.class, meta.getGetterType("richProperty"));
102     assertEquals(List.class, meta.getGetterType("richList"));
103     assertEquals(Map.class, meta.getGetterType("richMap"));
104     assertEquals(List.class, meta.getGetterType("richList[0]"));
105 
106     assertEquals(RichType.class, meta.getGetterType("richType"));
107     assertEquals(String.class, meta.getGetterType("richType.richField"));
108     assertEquals(String.class, meta.getGetterType("richType.richProperty"));
109     assertEquals(List.class, meta.getGetterType("richType.richList"));
110     assertEquals(Map.class, meta.getGetterType("richType.richMap"));
111     assertEquals(List.class, meta.getGetterType("richType.richList[0]"));
112   }
113 
114   @Test
115   void shouldCheckTypeForEachSetter() {
116     ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
117     MetaClass meta = MetaClass.forClass(RichType.class, reflectorFactory);
118     assertEquals(String.class, meta.getSetterType("richField"));
119     assertEquals(String.class, meta.getSetterType("richProperty"));
120     assertEquals(List.class, meta.getSetterType("richList"));
121     assertEquals(Map.class, meta.getSetterType("richMap"));
122     assertEquals(List.class, meta.getSetterType("richList[0]"));
123 
124     assertEquals(RichType.class, meta.getSetterType("richType"));
125     assertEquals(String.class, meta.getSetterType("richType.richField"));
126     assertEquals(String.class, meta.getSetterType("richType.richProperty"));
127     assertEquals(List.class, meta.getSetterType("richType.richList"));
128     assertEquals(Map.class, meta.getSetterType("richType.richMap"));
129     assertEquals(List.class, meta.getSetterType("richType.richList[0]"));
130   }
131 
132   @Test
133   void shouldCheckGetterAndSetterNames() {
134     ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
135     MetaClass meta = MetaClass.forClass(RichType.class, reflectorFactory);
136     assertEquals(5, meta.getGetterNames().length);
137     assertEquals(5, meta.getSetterNames().length);
138   }
139 
140   @Test
141   void shouldFindPropertyName() {
142     ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
143     MetaClass meta = MetaClass.forClass(RichType.class, reflectorFactory);
144     assertEquals("richField", meta.findProperty("RICHfield"));
145   }
146 
147 }