@@ -5,54 +5,161 @@ import com.github.victorhsr.hermes.maven.util.TestName
55import io.mockk.every
66import io.mockk.mockk
77import org.assertj.core.api.Assertions.assertThat
8+ import org.junit.jupiter.api.Nested
89import org.junit.jupiter.api.Test
10+ import javax.lang.model.element.AnnotationMirror
911import javax.lang.model.element.Element
1012import javax.lang.model.element.ElementKind
1113import javax.lang.model.element.TypeElement
14+ import javax.lang.model.type.DeclaredType
1215
1316class FieldFinderTest {
1417
15- companion object {
16- private const val SET_NAME_METHOD_NAME = " setName"
17- private const val SET_AGE_METHOD_NAME = " setAge"
18- private const val DO_SOMETHING_METHOD_NAME = " doSomething"
19- private const val NAME_FIELD_NAME = " name"
20- private const val AGE_FIELD_NAME = " age"
21- private const val ADDRESS_FIELD_NAME = " address"
18+ @Nested
19+ inner class PlainJavaTests {
20+ @Test
21+ fun `getFieldsFromClazz should identify fields that have a setter method` () {
22+ // given
23+ val fieldWithSetterName = " fieldA" ;
24+ val fieldWithoutSetterName = " fieldB" ;
25+ val setterName = " setFieldA"
26+ val fieldWithSetter = mockElement(ElementKind .FIELD , fieldWithSetterName)
27+ val fieldWithoutSetter = mockElement(ElementKind .FIELD , fieldWithoutSetterName)
28+ val setterMethod = mockElement(ElementKind .METHOD , setterName)
29+ val clazz = mockClazz(fieldWithSetter, fieldWithoutSetter, setterMethod)
30+ val expected = listOf (fieldWithSetter)
31+
32+ // when
33+ val actual = FieldFinder .getFieldsFromClazz(clazz)
34+
35+ // then
36+ assertThat(actual).isEqualTo(expected)
37+ }
38+
39+ @Test
40+ fun `getFieldsFromClazz should filter classes annotated with DSLIgnore out` () {
41+ // given
42+ val fieldWithSetterName = " fieldA" ;
43+ val fieldWithoutSetterName = " fieldB" ;
44+ val setterName = " setFieldA"
45+ val fieldWithSetter = mockElement(ElementKind .FIELD , fieldWithSetterName, true )
46+ val fieldWithoutSetter = mockElement(ElementKind .FIELD , fieldWithoutSetterName)
47+ val setterMethod = mockElement(ElementKind .METHOD , setterName)
48+ val clazz = mockClazz(fieldWithSetter, fieldWithoutSetter, setterMethod)
49+ val expected = listOf<Element >()
50+
51+ // when
52+ val actual = FieldFinder .getFieldsFromClazz(clazz)
53+
54+ // then
55+ assertThat(actual).isEqualTo(expected)
56+ }
2257 }
2358
24- @Test
25- fun `should filter elements that are fields and have 'set' methods and ignore the ones annoted with DSLIgnore` () {
26- // given
27- val clazz: TypeElement = mockk<TypeElement >()
2859
29- val nameSetMethod = mockElement(ElementKind .METHOD , SET_NAME_METHOD_NAME )
30- val ageSetMethod = mockElement(ElementKind .METHOD , SET_AGE_METHOD_NAME )
31- val doSomethingMethod = mockElement(ElementKind .METHOD , DO_SOMETHING_METHOD_NAME )
32- val nameField = mockElement(ElementKind .FIELD , NAME_FIELD_NAME )
33- val ageField = mockElement(ElementKind .FIELD , AGE_FIELD_NAME , true )
34- val addressField = mockElement(ElementKind .FIELD , ADDRESS_FIELD_NAME )
60+ @Nested
61+ inner class LombokTests {
62+
63+ @Nested
64+ inner class ClazzLevelAnnotationTests {
3565
36- val enclosedElements = listOf (nameField, nameSetMethod, ageField, ageSetMethod, doSomethingMethod, addressField)
37- val expectedResult = listOf (nameField)
66+ @Test
67+ fun `getFieldsFromClazz should identify @Setter on class level` () {
68+ // given
69+ val fieldWithSetterName = " fieldA" ;
70+ val fieldWithSetter = mockElement(ElementKind .FIELD , fieldWithSetterName)
71+ val clazz = mockClazz(" lombok.Setter" , fieldWithSetter)
72+ val expected = listOf (fieldWithSetter)
3873
39- every { clazz.enclosedElements } returns enclosedElements
74+ // when
75+ val actual = FieldFinder .getFieldsFromClazz(clazz)
4076
41- // when
42- val actual: List <Element > = FieldFinder .getFieldsFromClazz(clazz)
77+ // then
78+ assertThat(actual).isEqualTo(expected)
79+ }
4380
44- // then
45- assertThat(actual).hasSameElementsAs(expectedResult)
81+ @Test
82+ fun `getFieldsFromClazz should identify @Data on class level` () {
83+ // given
84+ val fieldWithSetterName = " fieldA" ;
85+ val anotherFieldWithSetterName = " fieldB" ;
86+ val fieldWithSetter = mockElement(ElementKind .FIELD , fieldWithSetterName)
87+ val anotherFieldWithSetter = mockElement(ElementKind .FIELD , anotherFieldWithSetterName)
88+ val clazz = mockClazz(" lombok.Data" , fieldWithSetter, anotherFieldWithSetter)
89+ val expected = listOf (fieldWithSetter, anotherFieldWithSetter)
90+
91+ // when
92+ val actual = FieldFinder .getFieldsFromClazz(clazz)
93+
94+ // then
95+ assertThat(actual).isEqualTo(expected)
96+ }
97+ }
98+
99+ @Nested
100+ inner class FiledLevelAnnotationTests {
101+ @Test
102+ fun `getFieldsFromClazz should identify @Setter on class level` () {
103+ // given
104+ val fieldWithSetterName = " fieldA" ;
105+ val fieldWithoutSetterName = " fieldB" ;
106+ val fieldWithSetter = mockElement(" lombok.Setter" , ElementKind .FIELD , fieldWithSetterName)
107+ val fieldWithoutSetter = mockElement(ElementKind .FIELD , fieldWithoutSetterName)
108+ val clazz = mockClazz(fieldWithSetter, fieldWithoutSetter)
109+ val expected = listOf (fieldWithSetter)
110+
111+ // when
112+ val actual = FieldFinder .getFieldsFromClazz(clazz)
113+
114+ // then
115+ assertThat(actual).isEqualTo(expected)
116+ }
117+ }
46118 }
47119
48120 private fun mockElement (elementKind : ElementKind , name : String , shouldBeIgnored : Boolean = false): Element {
121+ return mockElement(null , elementKind, name, shouldBeIgnored)
122+ }
123+
124+ private fun mockElement (annotation : String? , elementKind : ElementKind , name : String , shouldBeIgnored : Boolean = false): Element {
49125 val element: Element = mockk<Element >()
50126
51127 every { element.kind } returns elementKind
52128 every { element.simpleName } returns TestName (name)
129+ every { element.annotationMirrors } returns
130+ if (annotation == null ) mutableListOf ()
131+ else mutableListOf (mockAnnotationMirror(annotation))
53132 every { element.getAnnotation(any<Class <DSLIgnore >>()) } returns if (shouldBeIgnored) mockk<DSLIgnore >() else null
54133
55134 return element
56135 }
57136
137+ private fun mockClazz (vararg field : Element ): TypeElement {
138+ return mockClazz(null , * field)
139+ }
140+
141+ private fun mockClazz (annotation : String? = null, vararg field : Element ): TypeElement {
142+ val typeElement = mockk<TypeElement >()
143+ every { typeElement.enclosedElements } returns field.toList()
144+ every { typeElement.annotationMirrors } returns
145+ if (annotation == null ) mutableListOf ()
146+ else mutableListOf (mockAnnotationMirror(annotation))
147+ every { typeElement.getAnnotation(any<Class <DSLIgnore >>()) } returns null
148+
149+ return typeElement
150+ }
151+
152+ private fun mockAnnotationMirror (annotation : String ): AnnotationMirror {
153+ val annotationMirror = mockk<AnnotationMirror >()
154+ every { annotationMirror.annotationType } returns mockAnnotationType(annotation)
155+
156+ return annotationMirror
157+ }
158+
159+ private fun mockAnnotationType (annotation : String ): DeclaredType {
160+ val declaredType = mockk<DeclaredType >()
161+ every { declaredType.toString() } returns annotation
162+
163+ return declaredType
164+ }
58165}
0 commit comments