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.wrapper;
17  
18  import static org.assertj.core.api.Assertions.assertThat;
19  import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
20  import static org.junit.jupiter.api.Assertions.assertEquals;
21  import static org.junit.jupiter.api.Assertions.assertFalse;
22  import static org.junit.jupiter.api.Assertions.assertNull;
23  import static org.junit.jupiter.api.Assertions.assertTrue;
24  
25  import java.util.ArrayList;
26  import java.util.Arrays;
27  import java.util.HashMap;
28  import java.util.List;
29  import java.util.Map;
30  
31  import org.apache.ibatis.domain.misc.RichType;
32  import org.apache.ibatis.reflection.SystemMetaObject;
33  import org.apache.ibatis.reflection.property.PropertyTokenizer;
34  import org.junit.jupiter.api.BeforeEach;
35  import org.junit.jupiter.api.Test;
36  
37  /**
38   * @author <a href="1181963012mw@gmail.com">mawen12</a>
39   *
40   * @see BeanWrapper
41   */
42  class BeanWrapperUnitTest extends ObjectWrapperBase {
43  
44    private RichType richType;
45  
46    private ObjectWrapper wrapper;
47  
48    @BeforeEach
49    void setup() {
50      this.richType = new RichType();
51      this.wrapper = new BeanWrapper(SystemMetaObject.forObject(richType), richType);
52    }
53  
54    @Test
55    @Override
56    void shouldGet() {
57      richType.setRichProperty("mybatis");
58  
59      Object value = wrapper.get(new PropertyTokenizer("richProperty"));
60  
61      assertEquals("mybatis", value);
62    }
63  
64    @Test
65    void shouldGetWhichContainsDelim() {
66      RichType nested = new RichType();
67      nested.setRichProperty("mybatis");
68      richType.setRichType(nested);
69  
70      Object value = wrapper.get(new PropertyTokenizer("richType.richProperty"));
71  
72      assertEquals("mybatis", value);
73    }
74  
75    @Test
76    void shouldGetWhichContainsIndex() {
77      richType.setRichList(Arrays.asList(1L, "abc"));
78      richType.setRichMap(new HashMap<String, Object>() {
79        private static final long serialVersionUID = 1L;
80  
81        {
82          put("key1", "value1");
83          put("key2", "value2");
84        }
85      });
86  
87      assertEquals("abc", wrapper.get(new PropertyTokenizer("richList[1]")));
88      assertEquals("value2", wrapper.get(new PropertyTokenizer("richMap[key2]")));
89  
90    }
91  
92    @Test
93    @Override
94    void shouldSet() {
95      wrapper.set(new PropertyTokenizer("richProperty"), "mybatis");
96  
97      assertEquals("mybatis", richType.getRichProperty());
98    }
99  
100   @Test
101   void shouldSetWhichContainsDelim() {
102     wrapper.set(new PropertyTokenizer("richType.richProperty"), "mybatis");
103 
104     assertEquals("mybatis", richType.getRichType().getRichProperty());
105   }
106 
107   @Test
108   void shouldSetWhichContainsIndex() {
109     List<Object> list = Arrays.asList(1L, 2L);
110     richType.setRichList(list);
111 
112     wrapper.set(new PropertyTokenizer("richList[0]"), "mybatis");
113 
114     assertEquals("mybatis", list.get(0));
115   }
116 
117   @Test
118   @Override
119   void shouldFindProperty() {
120     String property = wrapper.findProperty("richProperty", false);
121 
122     assertEquals("richProperty", property);
123   }
124 
125   @Test
126   void shouldFindPropertyContainsDelim() {
127     String property = wrapper.findProperty("richType.richProperty", false);
128 
129     assertEquals("richType.richProperty", property);
130   }
131 
132   @Test
133   void shouldFindPropertyContainsIndex() {
134     String property = wrapper.findProperty("richList[0]", false);
135 
136     assertNull(property);
137   }
138 
139   @Test
140   @Override
141   void shouldGetGetterNames() {
142     String[] getterNames = wrapper.getGetterNames();
143 
144     assertThat(getterNames).containsExactlyInAnyOrder("richType", "richProperty", "richList", "richMap", "richField");
145   }
146 
147   @Test
148   @Override
149   void shouldGetSetterNames() {
150     String[] setterNames = wrapper.getSetterNames();
151 
152     assertThat(setterNames).containsExactlyInAnyOrder("richType", "richProperty", "richList", "richMap", "richField");
153   }
154 
155   @Test
156   @Override
157   void shouldGetGetterType() {
158     assertEquals(RichType.class, wrapper.getGetterType("richType"));
159     assertEquals(String.class, wrapper.getGetterType("richField"));
160     assertEquals(String.class, wrapper.getGetterType("richProperty"));
161     assertEquals(Map.class, wrapper.getGetterType("richMap"));
162     assertEquals(List.class, wrapper.getGetterType("richList"));
163   }
164 
165   @Test
166   @Override
167   void shouldGetSetterType() {
168     assertEquals(RichType.class, wrapper.getSetterType("richType"));
169     assertEquals(String.class, wrapper.getSetterType("richField"));
170     assertEquals(String.class, wrapper.getSetterType("richProperty"));
171     assertEquals(Map.class, wrapper.getSetterType("richMap"));
172     assertEquals(List.class, wrapper.getSetterType("richList"));
173   }
174 
175   @Test
176   @Override
177   void shouldHasGetter() {
178     assertTrue(wrapper.hasGetter("richType"));
179     assertTrue(wrapper.hasGetter("richField"));
180     assertTrue(wrapper.hasGetter("richProperty"));
181     assertTrue(wrapper.hasGetter("richMap"));
182     assertTrue(wrapper.hasGetter("richList"));
183   }
184 
185   @Test
186   @Override
187   void shouldHasSetter() {
188     assertTrue(wrapper.hasGetter("richType"));
189     assertTrue(wrapper.hasGetter("richField"));
190     assertTrue(wrapper.hasGetter("richProperty"));
191     assertTrue(wrapper.hasGetter("richMap"));
192     assertTrue(wrapper.hasGetter("richList"));
193   }
194 
195   @Test
196   @Override
197   void shouldIsCollection() {
198     assertFalse(wrapper.isCollection());
199   }
200 
201   @Test
202   @Override
203   void shouldInstantiatePropertyValue() {
204     // Nothing
205   }
206 
207   @Test
208   @Override
209   void shouldAddElement() {
210     assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> wrapper.add("1"));
211   }
212 
213   @Test
214   @Override
215   void shouldAddAll() {
216     assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> wrapper.addAll(new ArrayList<>()));
217   }
218 
219 }