1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.core.testsupport.builder;
7   
8   import static org.mockito.Mockito.doReturn;
9   
10  import dev.metaschema.core.datatype.IDataTypeAdapter;
11  import dev.metaschema.core.datatype.adapter.MetaschemaDataTypeProvider;
12  import dev.metaschema.core.model.IFlagDefinition;
13  import dev.metaschema.core.model.IFlagInstance;
14  import dev.metaschema.core.model.IModelDefinition;
15  import dev.metaschema.core.model.IModule;
16  import dev.metaschema.core.model.INamedModelElement;
17  import dev.metaschema.core.model.ModelType;
18  import dev.metaschema.core.model.constraint.ValueConstraintSet;
19  import dev.metaschema.core.util.ObjectUtils;
20  import edu.umd.cs.findbugs.annotations.NonNull;
21  import edu.umd.cs.findbugs.annotations.Nullable;
22  
23  /**
24   * A builder that generates mock flag definitions and instances.
25   */
26  final class FlagBuilder
27      extends AbstractMetaschemaBuilder<IFlagBuilder>
28      implements IFlagBuilder {
29  
30    private IDataTypeAdapter<?> dataTypeAdapter;
31    private Object defaultValue = null;
32    private boolean required;
33  
34    FlagBuilder() {
35      // prevent direct instantiation
36    }
37  
38    @Override
39    public FlagBuilder reset() {
40      this.dataTypeAdapter = MetaschemaDataTypeProvider.DEFAULT_DATA_TYPE;
41      this.defaultValue = null;
42      this.required = IFlagInstance.DEFAULT_FLAG_REQUIRED;
43      return this;
44    }
45  
46    @Override
47    public FlagBuilder required(boolean required) {
48      this.required = required;
49      return this;
50    }
51  
52    @Override
53    public FlagBuilder dataTypeAdapter(@NonNull IDataTypeAdapter<?> dataTypeAdapter) {
54      this.dataTypeAdapter = dataTypeAdapter;
55      return this;
56    }
57  
58    @Override
59    public FlagBuilder defaultValue(@NonNull Object defaultValue) {
60      this.defaultValue = defaultValue;
61      return this;
62    }
63  
64    @Override
65    @NonNull
66    public IFlagInstance toInstance(
67        @NonNull IModelDefinition parent,
68        @NonNull IFlagDefinition definition) {
69      validate();
70  
71      IFlagInstance retval = mock(IFlagInstance.class);
72  
73      applyNamedInstance(retval, definition, parent);
74  
75      doReturn(required).when(retval).isRequired();
76      return retval;
77    }
78  
79    /**
80     * Build a mocked flag definition.
81     *
82     * @return the new mocked definition
83     */
84    @Override
85    @NonNull
86    public IFlagDefinition toDefinition() {
87      return toDefinition(null);
88    }
89  
90    @Override
91    @NonNull
92    public IFlagDefinition toDefinition(@Nullable IModule module) {
93      validate();
94  
95      IFlagDefinition retval = mock(IFlagDefinition.class);
96      applyDefinition(retval, module);
97  
98      doReturn(new ValueConstraintSet(ObjectUtils.notNull(getSource()))).when(retval).getConstraintSupport();
99      doReturn(dataTypeAdapter).when(retval).getJavaTypeAdapter();
100     doReturn(defaultValue).when(retval).getDefaultValue();
101 
102     return retval;
103   }
104 
105   @Override
106   protected void applyNamed(INamedModelElement element) {
107     super.applyNamed(element);
108     doReturn(ModelType.FLAG).when(element).getModelType();
109   }
110 }