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

leeonky / test-charm-java / 314

27 Sep 2025 03:28PM UTC coverage: 71.169% (-3.2%) from 74.329%
314

push

circleci

leeonky
Update version

7013 of 9854 relevant lines covered (71.17%)

0.71 hits per line

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

84.09
/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

5
import java.util.*;
6
import java.util.function.Predicate;
7

8
import static com.github.leeonky.jfactory.ConsistencyItem.guessCustomerPositionStackTrace;
9
import static com.github.leeonky.util.Sneaky.cast;
10
import static java.util.Collections.singletonList;
11
import static java.util.stream.Collectors.toCollection;
12
import static java.util.stream.Collectors.toList;
13

14
class DefaultConsistency<T> extends AbstractConsistency<T> {
15
    private final List<ConsistencyItem<T>> items = new ArrayList<>();
1✔
16
    private final BeanClass<T> type;
17
    private final List<StackTraceElement> locations = new ArrayList<>();
1✔
18

19
    DefaultConsistency(Class<T> type) {
20
        this(BeanClass.create(type));
1✔
21
    }
1✔
22

23
    DefaultConsistency(BeanClass<T> type) {
24
        this(type, singletonList(guessCustomerPositionStackTrace()));
1✔
25
    }
1✔
26

27
    DefaultConsistency(BeanClass<T> type, List<StackTraceElement> locations) {
1✔
28
        this.type = type;
1✔
29
        this.locations.addAll(locations);
1✔
30
    }
1✔
31

32
    @Override
33
    BeanClass<T> type() {
34
        return type;
1✔
35
    }
36

37
    @Override
38
    Consistency<T> link(ConsistencyItem<T> item) {
39
        items.add(item);
1✔
40
        return this;
1✔
41
    }
42

43
    public boolean merge(DefaultConsistency<?> another) {
44
        if (items.stream().anyMatch(item -> another.items.stream().anyMatch(item::same))) {
1✔
45
            another.items.forEach(item -> items.add(cast(item)));
1✔
46
            return true;
1✔
47
        }
48
        return false;
1✔
49
    }
50

51
    public String info() {
52
        StringBuilder builder = new StringBuilder();
×
53
        builder.append("  ").append(type().getName()).append(":");
×
54
        for (StackTraceElement location : locations) {
×
55
            builder.append("\n    ").append(location.getClassName()).append(".").append(location.getMethodName())
×
56
                    .append("(").append(location.getFileName()).append(":").append(location.getLineNumber()).append(")");
×
57
        }
×
58
        return builder.toString();
×
59
    }
60

61
    public DefaultConsistency<T> absoluteProperty(PropertyChain base) {
62
        DefaultConsistency<T> absolute = new DefaultConsistency<>(type(), locations);
1✔
63
        items.forEach(item -> absolute.items.add(item.absoluteProperty(base)));
1✔
64
        return absolute;
1✔
65
    }
66

67
    public Resolver resolver(ObjectProducer<?> root) {
68
        return new Resolver(root);
1✔
69
    }
70

71
    class Resolver {
72
        private final Set<ConsistencyItem<T>.Resolver> providers;
73
        private final Set<ConsistencyItem<T>.Resolver> consumers;
74

75
        Resolver(ObjectProducer<?> root) {
1✔
76
            List<ConsistencyItem<T>.Resolver> itemResolvers = items.stream().map(i -> i.resolver(root, this)).collect(toList());
1✔
77
            providers = itemResolvers.stream().filter(ConsistencyItem.Resolver::hasComposer).collect(toCollection(LinkedHashSet::new));
1✔
78
            consumers = itemResolvers.stream().filter(ConsistencyItem.Resolver::hasDecomposer).collect(toCollection(LinkedHashSet::new));
1✔
79
        }
1✔
80

81
        Set<PropertyChain> resolve(ConsistencyItem<T>.Resolver provider) {
82
            Set<PropertyChain> resolved = new HashSet<>();
1✔
83
            for (ConsistencyItem<T>.Resolver consumer : consumers)
1✔
84
                if (consumer != provider)
1✔
85
                    resolved.addAll(consumer.resolve(provider));
1✔
86
            return resolved;
1✔
87
        }
88

89
        Optional<ConsistencyItem<T>.Resolver> searchProvider(Predicate<ConsistencyItem<?>.Resolver> condition) {
90
            return providers.stream().filter(condition).min(this::onlyComposerFirstOrder);
1✔
91
        }
92

93
        ConsistencyItem<T>.Resolver defaultProvider() {
94
            return providers.stream().min(this::onlyComposerFirstOrder).get();
1✔
95
        }
96

97
        private int onlyComposerFirstOrder(ConsistencyItem<T>.Resolver r1, ConsistencyItem<T>.Resolver r2) {
98
            if (!r1.hasDecomposer())
1✔
99
                return -1;
1✔
100
            return !r2.hasDecomposer() ? 1 : 0;
1✔
101
        }
102

103
        Optional<ConsistencyItem<T>.Resolver> propertyRelated(PropertyChain property) {
104
            return providers.stream().filter(p -> p.containsProperty(property)).findFirst();
1✔
105
        }
106
    }
107
}
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