• 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

97.09
/jfactory/src/main/java/com/github/leeonky/jfactory/PropertySpec.java
1
package com.github.leeonky.jfactory;
2

3
import com.github.leeonky.util.BeanClass;
4
import com.github.leeonky.util.GenericBeanClass;
5
import com.github.leeonky.util.PropertyWriter;
6

7
import java.util.List;
8
import java.util.function.Consumer;
9
import java.util.function.Function;
10
import java.util.function.Supplier;
11

12
import static java.lang.String.format;
13

14
public class PropertySpec<T> {
15
    private final Spec<T> spec;
16
    private final PropertyChain property;
17

18
    PropertySpec(Spec<T> spec, PropertyChain property) {
1✔
19
        this.spec = spec;
1✔
20
        this.property = property;
1✔
21
    }
1✔
22

23
    public Spec<T> value(Object value) {
24
        return value(() -> value);
1✔
25
    }
26

27
    @SuppressWarnings("unchecked")
28
    public <V> Spec<T> value(Supplier<V> value) {
29
        if (value == null)
1✔
30
            return value(() -> null);
1✔
31
        return appendProducer((jFactory, producer, property) ->
1✔
32
                new UnFixedValueProducer<>(value, (BeanClass<V>) producer.getPropertyWriterType(property)));
1✔
33
    }
34

35
    @Deprecated
36
    /**
37
     * reference spec and trait via string
38
     */
39
    public <V> Spec<T> is(Class<? extends Spec<V>> specClass) {
40
        return appendProducer(jFactory -> createCreateProducer(jFactory.spec(specClass)));
1✔
41
    }
42

43
    public Spec<T> is(String... traitsAndSpec) {
44
        return appendProducer(jFactory -> createCreateProducer(jFactory.spec(traitsAndSpec)));
1✔
45
    }
46

47
    public <V> IsSpec2<V> from(String... traitsAndSpec) {
48
        return spec.newIsSpec(traitsAndSpec, this);
1✔
49
    }
50

51
    public Spec<T> optional(String... traitsAndSpec) {
52
        if (property.isSingle()) {
1✔
53
            return spec.append((jFactory, objectProducer) -> objectProducer.changeChild(property.toString(),
1✔
54
                    new OptionalSpecDefaultValueProducer<>(objectProducer.getPropertyWriterType(property.toString()), traitsAndSpec)));
1✔
55
        } else if (property.isDefaultPropertyCollection()) {
1✔
56
            return spec.append((jFactory, objectProducer) -> {
1✔
57
                PropertyWriter<T> propertyWriter = objectProducer.getType().getPropertyWriter((String) property.head());
1✔
58
                if (!propertyWriter.getType().isCollection() && propertyWriter.getType().is(Object.class)) {
1✔
59
                    Factory<Object> factory = jFactory.specFactory(traitsAndSpec[traitsAndSpec.length - 1]);
1✔
60
                    propertyWriter = propertyWriter.decorateType(GenericBeanClass.create(List.class, factory.getType().getGenericType()));
1✔
61
                } else if (propertyWriter.getType().isCollection() && propertyWriter.getType().getElementType().is(Object.class)) {
1✔
62
                    Factory<Object> factory = jFactory.specFactory(traitsAndSpec[traitsAndSpec.length - 1]);
1✔
63
                    propertyWriter = propertyWriter.decorateType(GenericBeanClass.create(propertyWriter.getType().getType(), factory.getType().getGenericType()));
1✔
64
                }
65
                CollectionProducer<?, ?> collectionProducer = BeanClass.cast(objectProducer.forceChildOrDefaultCollection(propertyWriter),
1✔
66
                        CollectionProducer.class).orElseThrow(() ->
1✔
UNCOV
67
                        new IllegalArgumentException(format("%s.%s is not list", spec.getType().getName(), property.head())));
×
68
                OptionalSpecDefaultValueProducer<?> optionalSpecDefaultValueProducer =
1✔
69
                        new OptionalSpecDefaultValueProducer<>(propertyWriter.getType(), traitsAndSpec);
1✔
70
                collectionProducer.changeElementPopulationFactory(index -> optionalSpecDefaultValueProducer);
1✔
71
            });
1✔
72
        }
UNCOV
73
        throw new IllegalArgumentException(format("Not support property chain '%s' in current operation", property));
×
74
    }
75

76
    @Deprecated
77
    /**
78
     * reference spec and trait via string
79
     */
80
    public <V, S extends Spec<V>> IsSpec<V, S> from(Class<S> specClass) {
81
        return spec.newIsSpec(specClass, this);
1✔
82
    }
83

84
    public Spec<T> defaultValue(Object value) {
85
        return defaultValue(() -> value);
1✔
86
    }
87

88
    @SuppressWarnings("unchecked")
89
    public <V> Spec<T> defaultValue(Supplier<V> supplier) {
90
        if (supplier == null)
1✔
UNCOV
91
            return defaultValue((Object) null);
×
92
        return appendProducer((jFactory, producer, property) ->
1✔
93
                new DefaultValueProducer<>((BeanClass<V>) producer.getPropertyWriterType(property), supplier));
1✔
94
    }
95

96
    public Spec<T> byFactory() {
97
        return appendProducer((jFactory, producer, property) ->
1✔
98
                producer.newDefaultValueProducer(producer.getType().getPropertyWriter(property)).orElseGet(() ->
1✔
99
                        createCreateProducer(jFactory.type(producer.getPropertyWriterType(property).getType()))));
1✔
100
    }
101

102
    public Spec<T> byFactory(Function<Builder<?>, Builder<?>> builder) {
103
        return appendProducer((jFactory, producer, property) ->
1✔
104
                producer.newDefaultValueProducer(producer.getType().getPropertyWriter(property))
1✔
105
                        .orElseGet(() -> createQueryOrCreateProducer(builder.apply(jFactory.type(
1✔
106
                                producer.getPropertyWriterType(property).getType())))));
1✔
107
    }
108

109
    public Spec<T> dependsOn(String dependency) {
110
        spec.consistent(Object.class)
1✔
111
                .property(property.toString()).write(Function.identity())
1✔
112
                .property(dependency).read(Function.identity());
1✔
113
        return spec;
1✔
114
    }
115

116
    public Spec<T> dependsOn(String dependency, Function<Object, Object> rule) {
117
        spec.consistent(Object.class)
1✔
118
                .property(property.toString()).write(Function.identity())
1✔
119
                .property(dependency).read(rule);
1✔
120
        return spec;
1✔
121
    }
122

123
    public Spec<T> dependsOn(List<String> dependencies, Function<Object[], Object> rule) {
124
        spec.consistent(Object.class)
1✔
125
                .property(property.toString()).write(Function.identity())
1✔
126
                .properties(dependencies.toArray(new String[0])).read(rule);
1✔
127
        return spec;
1✔
128
    }
129

130
    private Spec<T> appendProducer(Fuc<JFactory, Producer<?>, String, Producer<?>> producerFactory) {
131
        if (property.isSingle() || property.isTopLevelPropertyCollection())
1✔
132
            return spec.append((jFactory, objectProducer) -> {
1✔
133
                objectProducer.changeDescendant(property, ((nextToLast, property) -> producerFactory.apply(jFactory, nextToLast, property)));
1✔
134
            });
1✔
135
        if (property.isDefaultPropertyCollection()) {
1✔
136
            return spec.append((jFactory, objectProducer) -> {
1✔
137
                PropertyWriter<T> propertyWriter = objectProducer.getType().getPropertyWriter((String) property.head());
1✔
138
                if (!propertyWriter.getType().isCollection() && propertyWriter.getType().is(Object.class)) {
1✔
139
                    Producer<?> element = producerFactory.apply(jFactory, objectProducer, "0");
1✔
140
                    propertyWriter = propertyWriter.decorateType(GenericBeanClass.create(List.class, element.getType().getGenericType()));
1✔
141
                }
142
                CollectionProducer<?, ?> collectionProducer = BeanClass.cast(objectProducer.forceChildOrDefaultCollection(propertyWriter),
1✔
143
                        CollectionProducer.class).orElseThrow(() ->
1✔
144
                        new IllegalArgumentException(format("%s.%s is not list", spec.getType().getName(), property.head())));
1✔
145
                collectionProducer.changeElementPopulationFactory(index ->
1✔
146
                        producerFactory.apply(jFactory, collectionProducer, index.getName()));
1✔
147
            });
1✔
148
        }
149
        if (property.isTopLevelDefaultPropertyCollection()) {
1✔
150
            return spec.append((jFactory, objectProducer) -> {
1✔
151
                objectProducer.changeElementDefaultValueProducerFactory(propertyWriter ->
1✔
152
                        producerFactory.apply(jFactory, objectProducer, propertyWriter.getName()));
1✔
153
            });
1✔
154
        }
155
        throw new IllegalArgumentException(format("Not support property chain '%s' in current operation", property));
1✔
156
    }
157

158
    private Spec<T> appendProducer(Function<JFactory, Producer<?>> producerFactory) {
159
        return appendProducer((jFactory, producer, s) -> producerFactory.apply(jFactory));
1✔
160
    }
161

162
    @SuppressWarnings("unchecked")
163
    private <V> Producer<V> createQueryOrCreateProducer(Builder<V> builder) {
164
        Builder<V> builderWithArgs = builder.args(spec.params(property.toString()));
1✔
165
        return builderWithArgs.queryAll().stream().findFirst().<Producer<V>>map(object ->
1✔
166
                        new BuilderValueProducer<>((BeanClass<V>) BeanClass.create(object.getClass()), builderWithArgs))
1✔
167
                .orElseGet(builderWithArgs::createProducer);
1✔
168
    }
169

170
    private <V> Producer<V> createCreateProducer(Builder<V> builder) {
171
        return builder.args(spec.params(property.toString())).createProducer();
1✔
172
    }
173

174
    public Spec<T> reverseAssociation(String association) {
175
        return spec.append((jFactory, producer) -> producer.appendReverseAssociation(property, association));
1✔
176
    }
177

178
    public Spec<T> ignore() {
179
        return spec.append((jFactory, objectProducer) -> objectProducer.ignoreProperty(property.toString()));
1✔
180
    }
181

182
    @FunctionalInterface
183
    interface Fuc<P1, P2, P3, R> {
184
        R apply(P1 p1, P2 p2, P3 p3);
185
    }
186

187
    public class IsSpec<V, S extends Spec<V>> {
188
        private final Class<S> specClass;
189
        private final String position;
190

191
        public IsSpec(Class<S> spec) {
1✔
192
            position = Thread.currentThread().getStackTrace()[4].toString();
1✔
193
            specClass = spec;
1✔
194
        }
1✔
195

196
        public Spec<T> which(Consumer<S> trait) {
197
            spec.consume(this);
1✔
198
            return appendProducer(jFactory -> createCreateProducer(jFactory.spec(specClass, trait)));
1✔
199
        }
200

201
        public Spec<T> and(Function<Builder<V>, Builder<V>> builder) {
202
            spec.consume(this);
1✔
203
            return appendProducer(jFactory -> createQueryOrCreateProducer(builder.apply(jFactory.spec(specClass))));
1✔
204
        }
205

206
        public String getPosition() {
207
            return position;
1✔
208
        }
209
    }
210

211
    public class IsSpec2<V> {
212
        private final String[] spec;
213
        private final String position;
214

215
        public IsSpec2(String[] spec) {
1✔
216
            position = Thread.currentThread().getStackTrace()[4].toString();
1✔
217
            this.spec = spec;
1✔
218
        }
1✔
219

220
        public Spec<T> and(Function<Builder<V>, Builder<V>> builder) {
221
            PropertySpec.this.spec.consume(this);
1✔
222
            return appendProducer(jFactory -> createQueryOrCreateProducer(builder.apply(jFactory.spec(spec))));
1✔
223
        }
224

225
        public String getPosition() {
226
            return position;
1✔
227
        }
228
    }
229
}
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