1. Project Clover database Wed Nov 12 2025 05:07:35 UTC
  2. Package guru.mikelue.foxglove.annotation

File LayeredDataGenContext.java

 

Coverage histogram

../../../../img/srcFileCovDistChart10.png
0% of files have more coverage

Code metrics

6
18
8
1
152
104
12
0.67
2.25
8
1.5

Classes

Class Line # Actions
LayeredDataGenContext 27 18 0% 12 0
1.0100%
 

Contributing tests

No tests hitting this source file were found.

Source view

1    package guru.mikelue.foxglove.annotation;
2   
3    import java.lang.reflect.Modifier;
4    import java.util.ArrayList;
5    import java.util.List;
6    import java.util.Optional;
7   
8    import org.apache.commons.lang3.tuple.Pair;
9   
10    import guru.mikelue.foxglove.DataGenerator;
11    import guru.mikelue.foxglove.TableFacet;
12    import guru.mikelue.foxglove.functional.DataGeneratorProvider;
13    import guru.mikelue.foxglove.functional.TableFacetsProvider;
14   
15    /**
16    * Context class for layered data generations.
17    *
18    * <p>
19    * This class is intended to support layered testing structure like
20    * <a href="https://docs.junit.org/current/user-guide/#writing-tests-nested">Nested Tests</a> in JUnit.
21    *
22    * <p>
23    * The methods accepting the testing instance as parameter are ignored in this class.
24    *
25    * @param <T> The type of table facet
26    */
 
27    public class LayeredDataGenContext<T extends TableFacet> implements DataGenContext<T> {
28    private final List<Pair<Object, DataGenContextImpl<T>>> pairedContexts;
29   
30    /**
31    * Creates an instance with multiple {@link DataGenContext}s.
32    *
33    * <p>
34    * The first item in the list has the highest priority when searching for.
35    *
36    * @param testingInstances The list of testing instances for each context
37    * @param layeredContexts The list of layered data generation contexts
38    */
 
39  8 toggle public LayeredDataGenContext(
40    List<Object> testingInstances,
41    List<DataGenContext<T>> layeredContexts
42    ) {
43  8 pairedContexts = new ArrayList<>(testingInstances.size());
44   
45  25 for (int i = 0; i < testingInstances.size(); i++) {
46  17 pairedContexts.add(
47    Pair.of(
48    testingInstances.get(i),
49    (DataGenContextImpl<T>)layeredContexts.get(i)
50    )
51    );
52    }
53    }
54   
 
55  3 toggle @Override
56    public List<T> getTypedTableFacets(Class<? extends TableFacetsProvider<T>> clazz, Object testingInstance)
57    {
58  3 var pair = getDataGenContext(clazz, testingInstance);
59  3 return pair.getRight().getTypedTableFacets(clazz, pair.getLeft());
60    }
61   
62    /**
63    * {@inheritDoc}
64    */
 
65  3 toggle @Override
66    public List<T> getNamedTableFacets(String name, Object testingInstance)
67    {
68  3 return pairedContexts.stream()
69    .filter(pair -> pair.getRight().hasNamedTableFacets(name))
70    .map(pair -> pair.getRight().getNamedTableFacets(name, pair.getLeft()))
71    .findFirst()
72    .orElseThrow(() -> new IllegalArgumentException(
73    String.format(
74    "No @DataFacetsSource found for name: [%s]", name
75    )
76    ));
77    }
78   
 
79  2 toggle @Override
80    public DataGenerator<T> getTypedDataGenerator(Class<? extends DataGeneratorProvider<T>> clazz,
81    Object testingInstance)
82    {
83  2 var pair = getDataGenContext(clazz, testingInstance);
84  2 return pair.getRight().getTypedDataGenerator(clazz, pair.getLeft());
85    }
86   
87    /**
88    * {@inheritDoc}
89    */
 
90  2 toggle @Override
91    public DataGenerator<T> getNamedDataGenerator(String name, Object testingInstance)
92    {
93  2 return pairedContexts.stream()
94    .filter(pair -> pair.getRight().hasNamedDataGenerator(name))
95    .map(pair -> pair.getRight().getNamedDataGenerator(name, pair.getLeft()))
96    .findFirst()
97    .orElseThrow(() -> new IllegalArgumentException(
98    String.format(
99    "No @DataGeneratorSource found for name: [%s]", name
100    )
101    ));
102    }
103   
104    /**
105    * {@inheritDoc}
106    */
 
107  3 toggle @Override
108    public Optional<List<T>> getDefaultTableFacets(Object testingInstance)
109    {
110  3 return pairedContexts.stream()
111    .map(pair -> pair.getRight().getDefaultTableFacets(pair.getLeft()))
112    .filter(Optional::isPresent)
113    .map(Optional::get)
114    .findFirst();
115    }
116   
117    /**
118    * {@inheritDoc}
119    */
 
120  4 toggle @Override
121    public Optional<DataGenerator<T>> getDefaultDataGenerator(Object testingInstance)
122    {
123  4 return pairedContexts.stream()
124    .map(pair -> pair.getRight().getDefaultDataGenerator(pair.getLeft()))
125    .filter(Optional::isPresent)
126    .map(Optional::get)
127    .findFirst();
128    }
129   
 
130  5 toggle private Pair<Object, DataGenContextImpl<T>> getDataGenContext(Class<?> clazz, Object testingInstance)
131    {
132  5 if (Modifier.isStatic(clazz.getModifiers()) || !clazz.isMemberClass()) {
133  2 return pairedContexts.get(0);
134    }
135   
136  3 return pairedContexts.stream()
137    .filter(pair -> {
138  6 var typeOfInstance = pair.getLeft().getClass();
139  6 if (typeOfInstance.equals(clazz.getEnclosingClass())) {
140  3 return true;
141    }
142   
143  3 return false;
144    })
145    .findFirst()
146    .orElseThrow(() -> new IllegalArgumentException(
147    String.format(
148    "No enclosing class found for provider class: [%s]", clazz.getSimpleName()
149    )
150    ));
151    }
152    }