ConfigTest.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. package me.lortseam.completeconfig;
  2. import com.google.common.collect.Iterables;
  3. import me.lortseam.completeconfig.api.ConfigContainer;
  4. import me.lortseam.completeconfig.data.Config;
  5. import me.lortseam.completeconfig.data.Entry;
  6. import me.lortseam.completeconfig.data.EntryBase;
  7. import me.lortseam.completeconfig.data.containers.*;
  8. import me.lortseam.completeconfig.data.groups.EmptyGroup;
  9. import me.lortseam.completeconfig.data.listeners.*;
  10. import me.lortseam.completeconfig.io.ConfigSource;
  11. import nl.altindag.log.LogCaptor;
  12. import org.apache.logging.log4j.core.util.ReflectionUtil;
  13. import org.junit.jupiter.api.AfterEach;
  14. import org.junit.jupiter.api.BeforeEach;
  15. import org.junit.jupiter.api.Nested;
  16. import org.junit.jupiter.api.Test;
  17. import java.util.Map;
  18. import java.util.Set;
  19. import static org.assertj.core.api.Assertions.assertThat;
  20. import static org.junit.jupiter.api.Assertions.*;
  21. public class ConfigTest {
  22. @Test
  23. public void builder_throwExceptionIfModIDNull() {
  24. NullPointerException exception = assertThrows(NullPointerException.class, () -> Config.builder(null));
  25. assertEquals("modID is marked non-null but is null", exception.getMessage());
  26. }
  27. @Nested
  28. public class Builder {
  29. private static final String MOD_ID = "test";
  30. private Config.Builder builder;
  31. @BeforeEach
  32. public void createBuilder() {
  33. builder = Config.builder(MOD_ID);
  34. }
  35. @AfterEach
  36. public void cleanUp() throws NoSuchFieldException {
  37. builder = null;
  38. ((Set<Config>) ReflectionUtil.getStaticFieldValue(Config.class.getDeclaredField("configs"))).clear();
  39. ((Set<ConfigSource>) ReflectionUtil.getStaticFieldValue(ConfigSource.class.getDeclaredField("sources"))).clear();
  40. ((Map<?, EntryBase>) ReflectionUtil.getStaticFieldValue(Entry.class.getDeclaredField("entries"))).clear();
  41. }
  42. @Test
  43. public void setBranch_throwIfBranchNull() {
  44. NullPointerException exception = assertThrows(NullPointerException.class, () -> builder.setBranch(null));
  45. assertEquals("branch is marked non-null but is null", exception.getMessage());
  46. }
  47. @Test
  48. public void setBranch_throwIfBranchContainsNullElement() {
  49. assertThrows(NullPointerException.class, () -> builder.setBranch(new String[]{null}));
  50. }
  51. @Test
  52. public void add_throwIfContainersNull() {
  53. NullPointerException exception = assertThrows(NullPointerException.class, () -> builder.add((ConfigContainer[]) null));
  54. assertEquals("containers is marked non-null but is null", exception.getMessage());
  55. }
  56. @Test
  57. public void add_throwIfContainersContainNullElement() {
  58. assertThrows(NullPointerException.class, () -> builder.add((ConfigContainer) null));
  59. }
  60. @Test
  61. public void build_logWarningAndReturnNullIfChildrenEmpty() {
  62. LogCaptor logCaptor = LogCaptor.forRoot();
  63. assertNull(builder.build());
  64. assertThat(logCaptor.getWarnLogs()).contains("[CompleteConfig] Mod " + MOD_ID + " tried to create an empty config!");
  65. }
  66. @Nested
  67. public class Resolving {
  68. @Test
  69. public void logWarningIfEmpty() {
  70. LogCaptor logCaptor = LogCaptor.forRoot();
  71. builder.add(new EmptyContainer()).build();
  72. assertThat(logCaptor.getWarnLogs()).containsExactly("[CompleteConfig] Config of ConfigSource(modID=" + MOD_ID + ", branch=[]) is empty!");
  73. }
  74. @Nested
  75. public class Entry {
  76. @Test
  77. public void includeFieldInNonPOJOIfAnnotated() {
  78. Config config = builder.add(new ContainerWithEntry()).build();
  79. assertEquals(1, config.getEntries().size());
  80. }
  81. @Test
  82. public void excludeFieldInNonPOJOIfNotAnnotated() {
  83. Config config = builder.add(new ContainerWithField()).build();
  84. assertEquals(0, config.getEntries().size());
  85. }
  86. @Test
  87. public void includeFieldInPOJO() {
  88. Config config = builder.add(new POJOContainerWithEntry()).build();
  89. assertEquals(1, config.getEntries().size());
  90. }
  91. @Test
  92. public void excludeFieldInPOJOIfContainer() {
  93. Config config = builder.add(new POJOContainerWithEmptyContainer()).build();
  94. assertEquals(0, config.getEntries().size());
  95. }
  96. @Test
  97. public void excludeFieldInPOJOIfIgnoreAnnotated() {
  98. Config config = builder.add(new POJOContainerWithIgnoredField()).build();
  99. assertEquals(0, config.getEntries().size());
  100. }
  101. @Test
  102. public void includeSuperclassFieldIfNonStatic() {
  103. Config config = builder.add(new SubclassOfContainerWithEntry()).build();
  104. assertEquals(1, config.getEntries().size());
  105. }
  106. @Test
  107. public void excludeSuperclassFieldIfStatic() {
  108. Config config = builder.add(new SubclassOfContainerWithStaticEntry()).build();
  109. assertEquals(0, config.getEntries().size());
  110. }
  111. }
  112. @Nested
  113. public class Container {
  114. @Test
  115. public void includeFieldInNonPOJOIfAnnotated() {
  116. Config config = builder.add(new ContainerWithContainerWithEntry()).build();
  117. assertEquals(1, config.getEntries().size());
  118. }
  119. @Test
  120. public void excludeFieldInNonPOJOIfNotAnnotated() {
  121. Config config = builder.add(new ContainerWithNonAnnotatedContainerWithEntry()).build();
  122. assertEquals(0, config.getEntries().size());
  123. }
  124. @Test
  125. public void includeFieldInPOJO() {
  126. Config config = builder.add(new POJOContainerWithContainerWithEntry()).build();
  127. assertEquals(1, config.getEntries().size());
  128. }
  129. @Test
  130. public void includeSuperclassField() {
  131. Config config = builder.add(new SubclassOfContainerWithContainerWithEntry()).build();
  132. assertEquals(1, config.getEntries().size());
  133. }
  134. @Test
  135. public void includeOfMethod() {
  136. Config config = builder.add(new ContainerIncludingContainerWithEntry()).build();
  137. assertEquals(1, config.getEntries().size());
  138. }
  139. @Test
  140. public void excludeNestedInPOJOIfNonStatic() {
  141. Config config = builder.add(new POJOContainerNestingContainerWithEntry()).build();
  142. assertEquals(0, config.getEntries().size());
  143. }
  144. @Test
  145. public void includeNestedIfStaticAndPOJO() {
  146. Config config = builder.add(new POJOContainerNestingStaticContainerWithEntry()).build();
  147. assertEquals(1, config.getEntries().size());
  148. }
  149. @Test
  150. public void excludeStaticNestedIfNonPOJO() {
  151. Config config = builder.add(new ContainerNestingStaticContainerWithEntry()).build();
  152. assertEquals(0, config.getEntries().size());
  153. }
  154. }
  155. @Nested
  156. public class Group {
  157. @Test
  158. public void logWarningIfEmpty() {
  159. LogCaptor logCaptor = LogCaptor.forRoot();
  160. builder.add(new EmptyGroup()).build();
  161. assertThat(logCaptor.getWarnLogs()).contains("[CompleteConfig] Group emptyGroup is empty!");
  162. }
  163. @Test
  164. public void includeField() {
  165. Config config = builder.add(new ContainerWithGroupWithEntry()).build();
  166. assertEquals(1, config.getCollections().size());
  167. }
  168. @Test
  169. public void includeOfMethod() {
  170. Config config = builder.add(new ContainerIncludingGroupWithEntry()).build();
  171. assertEquals(1, config.getCollections().size());
  172. }
  173. }
  174. @Nested
  175. public class Listener {
  176. @Test
  177. public void listenSetter() {
  178. SetterListener listener = new SetterListener();
  179. Config config = builder.add(listener).build();
  180. boolean value = !listener.getValue();
  181. Iterables.getOnlyElement(config.getEntries()).setValue(value);
  182. assertEquals(value, listener.getValue());
  183. }
  184. @Test
  185. public void listenCustom() {
  186. CustomListener listener = new CustomListener();
  187. Config config = builder.add(listener).build();
  188. boolean value = !listener.getValue();
  189. Iterables.getOnlyElement(config.getEntries()).setValue(value);
  190. assertEquals(value, listener.getValue());
  191. }
  192. @Test
  193. public void doNotUpdateField() {
  194. EmptyListener listener = new EmptyListener();
  195. Config config = builder.add(listener).build();
  196. boolean oldValue = listener.getValue();
  197. Iterables.getOnlyElement(config.getEntries()).setValue(!oldValue);
  198. assertEquals(oldValue, listener.getValue());
  199. }
  200. @Test
  201. public void forceUpdate() {
  202. ForceUpdateListener listener = new ForceUpdateListener();
  203. Config config = builder.add(listener).build();
  204. boolean value = !listener.getValue();
  205. Iterables.getOnlyElement(config.getEntries()).setValue(value);
  206. assertEquals(value, listener.getValue());
  207. }
  208. @Test
  209. public void listenOutside() {
  210. OutsideListener listener = new OutsideListener();
  211. Config config = builder.add(listener).build();
  212. boolean value = !listener.getValue();
  213. Iterables.getOnlyElement(config.getEntries()).setValue(value);
  214. assertEquals(value, listener.getValue());
  215. }
  216. }
  217. }
  218. }
  219. }