1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.metaschema.core.testing;
28
29 import gov.nist.secauto.metaschema.core.datatype.IDataTypeAdapter;
30 import gov.nist.secauto.metaschema.core.datatype.adapter.MetaschemaDataTypeProvider;
31 import gov.nist.secauto.metaschema.core.model.IAssemblyDefinition;
32 import gov.nist.secauto.metaschema.core.model.IFieldDefinition;
33 import gov.nist.secauto.metaschema.core.model.IFieldInstance;
34 import gov.nist.secauto.metaschema.core.model.IFlagInstance;
35 import gov.nist.secauto.metaschema.core.util.CollectionUtil;
36
37 import org.jmock.Expectations;
38 import org.jmock.Mockery;
39
40 import java.util.List;
41 import java.util.Map;
42 import java.util.function.Function;
43 import java.util.stream.Collectors;
44
45 import edu.umd.cs.findbugs.annotations.NonNull;
46 import edu.umd.cs.findbugs.annotations.Nullable;
47
48 public class FieldBuilder
49 extends AbstractModelBuilder<FieldBuilder>
50 implements IModelInstanceBuilder {
51
52 private IDataTypeAdapter<?> dataTypeAdapter;
53 private Object defaultValue = null;
54 private List<FlagBuilder> flags;
55
56 private FieldBuilder(@NonNull Mockery ctx) {
57 super(ctx);
58 }
59
60 @NonNull
61 public static FieldBuilder builder(@NonNull Mockery ctx) {
62 return new FieldBuilder(ctx).reset();
63 }
64
65 @Override
66 public FieldBuilder reset() {
67 this.dataTypeAdapter = MetaschemaDataTypeProvider.DEFAULT_DATA_TYPE;
68 this.defaultValue = null;
69 this.flags = CollectionUtil.emptyList();
70 return this;
71 }
72
73 public FieldBuilder dataTypeAdapter(@NonNull IDataTypeAdapter<?> dataTypeAdapter) {
74 this.dataTypeAdapter = dataTypeAdapter;
75 return this;
76 }
77
78 public FieldBuilder defaultValue(@NonNull Object defaultValue) {
79 this.defaultValue = defaultValue;
80 return this;
81 }
82
83 public FieldBuilder flags(@Nullable List<FlagBuilder> flags) {
84 this.flags = flags == null ? CollectionUtil.emptyList() : flags;
85 return this;
86 }
87
88 @Override
89 @NonNull
90 public IFieldInstance toInstance(
91 @NonNull IAssemblyDefinition parent) {
92 IFieldDefinition def = toDefinition();
93 return toInstance(parent, def);
94 }
95
96 @NonNull
97 public IFieldInstance toInstance(
98 @NonNull IAssemblyDefinition parent,
99 @NonNull IFieldDefinition definition) {
100 validate();
101
102 IFieldInstance retval = mock(IFieldInstance.class);
103 applyNamedInstance(retval, definition, parent);
104 return retval;
105 }
106
107 @SuppressWarnings("null")
108 @NonNull
109 public IFieldDefinition toDefinition() {
110 validate();
111
112 IFieldDefinition retval = mock(IFieldDefinition.class);
113 applyDefinition(retval);
114
115 Map<String, IFlagInstance> flags = this.flags.stream()
116 .map(builder -> builder.toInstance(retval))
117 .collect(Collectors.toUnmodifiableMap(
118 IFlagInstance::getEffectiveName,
119 Function.identity()));
120
121 getContext().checking(new Expectations() {
122 {
123 allowing(retval).getJavaTypeAdapter();
124 will(returnValue(dataTypeAdapter));
125 allowing(retval).getDefaultValue();
126 will(returnValue(defaultValue));
127 allowing(retval).getFlagInstances();
128 will(returnValue(flags.values()));
129 flags.forEach((key, value) -> {
130 allowing(retval).getFlagInstanceByName(with(key));
131 will(returnValue(value));
132 });
133 }
134 });
135
136 return retval;
137 }
138 }