• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

leeonky / test-charm-java / 329

01 Oct 2025 04:21PM UTC coverage: 74.68% (+0.03%) from 74.648%
329

push

circleci

leeonky
depends on primitive default value sub property

6 of 9 new or added lines in 3 files covered. (66.67%)

13 existing lines in 4 files now uncovered.

8565 of 11469 relevant lines covered (74.68%)

0.75 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

89.58
/jfactory/src/main/java/com/github/leeonky/jfactory/DefaultConsistency.java
1
package com.github.leeonky.jfactory;
2

3
import com.github.leeonky.util.BeanClass;
4
import com.github.leeonky.util.Sneaky;
5

6
import java.util.*;
7
import java.util.function.Function;
8
import java.util.function.Predicate;
9

10
import static com.github.leeonky.jfactory.ConsistencyItem.guessCustomerPositionStackTrace;
11
import static com.github.leeonky.jfactory.PropertyChain.propertyChain;
12
import static java.util.Arrays.asList;
13
import static java.util.Collections.singletonList;
14
import static java.util.stream.Collectors.toCollection;
15
import static java.util.stream.Collectors.toList;
16

17
class DefaultConsistency<T> implements Consistency<T> {
18
    private final List<ConsistencyItem<T>> items = new ArrayList<>();
1✔
19
    private final List<DefaultListConsistency<T>> list = new ArrayList<>();
1✔
20
    private final BeanClass<T> type;
21
    private final List<StackTraceElement> locations = new ArrayList<>();
1✔
22

23
    static final Function<Object, Object> LINK_COMPOSER = s -> s;
1✔
24
    static final Function<Object, Object> LINK_DECOMPOSER = s -> s;
1✔
25

26
    DefaultConsistency(Class<T> type) {
27
        this(BeanClass.create(type));
1✔
28
    }
1✔
29

30
    DefaultConsistency(BeanClass<T> type) {
31
        this(type, singletonList(guessCustomerPositionStackTrace()));
1✔
32
    }
1✔
33

34
    DefaultConsistency(BeanClass<T> type, List<StackTraceElement> locations) {
1✔
35
        this.type = type;
1✔
36
        this.locations.addAll(locations);
1✔
37
    }
1✔
38

39
    @Override
40
    public BeanClass<T> type() {
41
        return type;
1✔
42
    }
43

44
    @Override
45
    @SuppressWarnings("unchecked")
46
    public Consistency<T> direct(String property) {
47
        return property(property).read((Function<Object, T>) LINK_COMPOSER).write((Function<T, Object>) LINK_DECOMPOSER);
1✔
48
    }
49

50
    @Override
51
    public <P> C1<T, P> property(String property) {
52
        ConsistencyItem<T> item = new ConsistencyItem<>(singletonList(propertyChain(property)), this);
1✔
53
        items.add(item);
1✔
54
        return new C1<>(this, item);
1✔
55
    }
56

57
    @Override
58
    public <P1, P2> C2<T, P1, P2> properties(String property1, String property2) {
59
        ConsistencyItem<T> item = new ConsistencyItem<>(asList(propertyChain(property1), propertyChain(property2)), this);
1✔
60
        items.add(item);
1✔
61
        return new C2<>(this, item);
1✔
62
    }
63

64
    @Override
65
    public <P1, P2, P3> C3<T, P1, P2, P3> properties(String property1, String property2, String property3) {
66
        ConsistencyItem<T> item = new ConsistencyItem<>(asList(propertyChain(property1), propertyChain(property2), propertyChain(property3)), this);
1✔
67
        items.add(item);
1✔
68
        return new C3<>(this, item);
1✔
69
    }
70

71
    @Override
72
    public CN<T> properties(String... properties) {
73
        ConsistencyItem<T> item = new ConsistencyItem<>(Arrays.stream(properties).map(PropertyChain::propertyChain).collect(toList()), this);
1✔
74
        items.add(item);
1✔
75
        return new CN<>(this, item);
1✔
76
    }
77

78
    boolean merge(DefaultConsistency<?> another) {
79
        if (items.stream().anyMatch(item -> another.items.stream().anyMatch(item::same))) {
1✔
80
            another.items.forEach(item -> items.add(Sneaky.cast(item)));
1✔
81
            return true;
1✔
82
        }
83
        return false;
1✔
84
    }
85

86
    String info() {
87
        StringBuilder builder = new StringBuilder();
×
88
        builder.append("  ").append(type().getName()).append(":");
×
89
        for (StackTraceElement location : locations) {
×
90
            builder.append("\n    ").append(location.getClassName()).append(".").append(location.getMethodName())
×
91
                    .append("(").append(location.getFileName()).append(":").append(location.getLineNumber()).append(")");
×
92
        }
×
93
        return builder.toString();
×
94
    }
95

96
    DefaultConsistency<T> absoluteProperty(PropertyChain base) {
97
        DefaultConsistency<T> absolute = new DefaultConsistency<>(type(), locations);
1✔
98
        items.forEach(item -> absolute.items.add(item.absoluteProperty(base)));
1✔
99
        return absolute;
1✔
100
    }
101

102
    Resolver resolver(ObjectProducer<?> root) {
103
        return new Resolver(root);
1✔
104
    }
105

106
    @Override
107
    public ListConsistencyBuilder<T> list(String property) {
108
        DefaultListConsistency<T> listConsistency = new DefaultListConsistency<>(property, this);
1✔
109
        list.add(listConsistency);
1✔
110
        return new ListConsistencyBuilder<>(this, listConsistency);
1✔
111
    }
112

113
    DefaultConsistency<T> processListConsistency(ObjectProducer<?> producer) {
114
        list.forEach(listConsistency -> listConsistency.populateConsistencies(producer, propertyChain("")));
1✔
115
        return this;
1✔
116
    }
117

118
    interface Identity {
119
        default Object identity() {
UNCOV
120
            return this;
×
121
        }
122

123
        default boolean same(Identity another) {
124
            return another != null && identity() == another.identity();
1✔
125
        }
126

127
        StackTraceElement getLocation();
128
    }
129

130
    interface Composer<T> extends Function<Object[], T>, Identity {
131
    }
132

133
    interface Decomposer<T> extends Function<T, Object[]>, Identity {
134
    }
135

136
    class Resolver {
137
        private final Set<ConsistencyItem<T>.Resolver> providers;
138
        private final Set<ConsistencyItem<T>.Resolver> consumers;
139

140
        Resolver(ObjectProducer<?> root) {
1✔
141
            List<ConsistencyItem<T>.Resolver> itemResolvers = items.stream().map(i -> i.resolver(root, this)).collect(toList());
1✔
142
            providers = itemResolvers.stream().filter(ConsistencyItem.Resolver::hasComposer).collect(toCollection(LinkedHashSet::new));
1✔
143
            consumers = itemResolvers.stream().filter(ConsistencyItem.Resolver::hasDecomposer).collect(toCollection(LinkedHashSet::new));
1✔
144
        }
1✔
145

146
        Set<PropertyChain> resolve(ConsistencyItem<T>.Resolver provider) {
147
            Set<PropertyChain> resolved = new HashSet<>();
1✔
148
            for (ConsistencyItem<T>.Resolver consumer : consumers)
1✔
149
                if (consumer != provider)
1✔
150
                    resolved.addAll(consumer.resolve(provider));
1✔
151
            return resolved;
1✔
152
        }
153

154
        Optional<ConsistencyItem<T>.Resolver> searchProvider(Predicate<ConsistencyItem<?>.Resolver> condition) {
155
            return providers.stream().filter(condition).min(this::onlyComposerFirstOrder);
1✔
156
        }
157

158
        ConsistencyItem<T>.Resolver defaultProvider() {
159
            return providers.stream().min(this::onlyComposerFirstOrder).get();
1✔
160
        }
161

162
        private int onlyComposerFirstOrder(ConsistencyItem<T>.Resolver r1, ConsistencyItem<T>.Resolver r2) {
163
            if (!r1.hasDecomposer())
1✔
164
                return -1;
1✔
165
            return !r2.hasDecomposer() ? 1 : 0;
1✔
166
        }
167

168
        Optional<ConsistencyItem<T>.Resolver> propertyRelated(PropertyChain property) {
169
            return providers.stream().filter(p -> p.containsProperty(property)).findFirst();
1✔
170
        }
171
    }
172
}
173

174
class DecorateConsistency<T> implements Consistency<T> {
175
    private final Consistency<T> delegate;
176

177
    DecorateConsistency(Consistency<T> delegate) {
1✔
178
        this.delegate = delegate;
1✔
179
    }
1✔
180

181
    @Override
182
    public BeanClass<T> type() {
UNCOV
183
        return delegate.type();
×
184
    }
185

186
    @Override
187
    public Consistency<T> direct(String property) {
188
        return delegate.direct(property);
1✔
189
    }
190

191
    @Override
192
    public <P> C1<T, P> property(String property) {
193
        return delegate.property(property);
1✔
194
    }
195

196
    @Override
197
    public <P1, P2> C2<T, P1, P2> properties(String property1, String property2) {
198
        return delegate.properties(property1, property2);
1✔
199
    }
200

201
    @Override
202
    public <P1, P2, P3> C3<T, P1, P2, P3> properties(String property1, String property2, String property3) {
203
        return delegate.properties(property1, property2, property3);
1✔
204
    }
205

206
    @Override
207
    public CN<T> properties(String... properties) {
208
        return delegate.properties(properties);
1✔
209
    }
210

211
    @Override
212
    public ListConsistencyBuilder<T> list(String property) {
UNCOV
213
        return delegate.list(property);
×
214
    }
215
}
216

217
class IdentityAction implements DefaultConsistency.Identity {
218
    protected final Object identity;
219
    private final StackTraceElement location;
220

221
    public IdentityAction(Object identity) {
1✔
222
        this.identity = Objects.requireNonNull(identity);
1✔
223
        location = guessCustomerPositionStackTrace();
1✔
224
    }
1✔
225

226
    @Override
227
    public Object identity() {
228
        return identity;
1✔
229
    }
230

231
    @Override
232
    public StackTraceElement getLocation() {
233
        return location;
1✔
234
    }
235
}
236

237
class ComposerWrapper<T> extends IdentityAction implements DefaultConsistency.Composer<T> {
238
    private final Function<Object[], T> action;
239

240
    ComposerWrapper(Function<Object[], T> action, Object identity) {
241
        super(identity);
1✔
242
        this.action = Objects.requireNonNull(action);
1✔
243
    }
1✔
244

245
    @Override
246
    public T apply(Object[] objects) {
247
        return action.apply(objects);
1✔
248
    }
249
}
250

251
class DecomposerWrapper<T> extends IdentityAction implements DefaultConsistency.Decomposer<T> {
252
    private final Function<T, Object[]> action;
253

254
    DecomposerWrapper(Function<T, Object[]> action, Object identity) {
255
        super(identity);
1✔
256
        this.action = Objects.requireNonNull(action);
1✔
257
    }
1✔
258

259
    @Override
260
    public Object[] apply(T t) {
261
        return action.apply(t);
1✔
262
    }
263
}
264

265
class MultiPropertyConsistency<T, C extends MultiPropertyConsistency<T, C>> extends DecorateConsistency<T> {
266
    final ConsistencyItem<T> lastItem;
267

268
    MultiPropertyConsistency(Consistency<T> origin, ConsistencyItem<T> lastItem) {
269
        super(origin);
1✔
270
        this.lastItem = lastItem;
1✔
271
    }
1✔
272

273
    @SuppressWarnings("unchecked")
274
    public C read(Function<Object[], T> composer) {
275
        lastItem.setComposer(new ComposerWrapper<>(composer, composer));
1✔
276
        return (C) this;
1✔
277
    }
278

279
    @SuppressWarnings("unchecked")
280
    public C write(Function<T, Object[]> decomposer) {
281
        lastItem.setDecomposer(new DecomposerWrapper<>(decomposer, decomposer));
1✔
282
        return (C) this;
1✔
283
    }
284
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc