From df4083a3eca102363302d11b4d2facf955dc5fcc Mon Sep 17 00:00:00 2001 From: shawnhatch <30730734+shawnhatch@users.noreply.github.com> Date: Wed, 17 May 2023 19:43:26 -0400 Subject: [PATCH] Resources (#124) * Refactor of resources plugin data to reflect the full state of the resources data manager and support run continuity * Refactor of resources plugin data to reflect the full state of the resources data manager and support run continuity * Refactor of resources plugin data to reflect the full state of the resources data manager and support run continuity * Refactor of resources plugin data to reflect the full state of the resources data manager and support run continuity * Refactor of resources plugin data to reflect the full state of the resources data manager and support run continuity * Refactor of resources plugin data to reflect the full state of the resources data manager and support run continuity * Refactor of resources plugin data to reflect the full state of the resources data manager and support run continuity * update method name reorder methods * update resourcesplugindata translationspec * update proto definitions version --------- Co-authored-by: Shawn Co-authored-by: bischoffz --- .../src/main/java/lesson/PlanTestDriver.java | 2 +- .../MaterialsTestPluginFactory.java | 2 +- .../resources/ResourcesPluginData.java | 620 +++++++++++------- .../datamanagers/ResourcesDataManager.java | 476 ++++++-------- .../events/ResourceIdAdditionEvent.java | 12 +- .../resources/support/ResourceError.java | 5 + .../support/ResourceInitialization.java | 2 +- .../ResourcesTestPluginFactory.java | 2 +- .../resources/testsupport/TestResourceId.java | 17 +- .../datamanagers/AT_MaterialsDataManager.java | 3 +- .../AT_MaterialsProducerResourceReport.java | 5 +- .../AT_MaterialsTestPluginFactory.java | 5 +- .../resources/AT_ResourcesPluginData.java | 503 +++++++++----- .../datamanagers/AT_ResourcesDataManager.java | 612 +++++++---------- .../events/AT_ResourceIdAdditionEvent.java | 12 +- .../reports/AT_ResourcePropertyReport.java | 2 +- .../AT_ResourcesTestPluginFactory.java | 5 +- translation/gcm-protobuf-translation/pom.xml | 2 +- .../proto-definitions/pom.xml | 2 +- .../protobuf/resources/resources-plugin.proto | 75 ++- .../resources/ResourcesTranslator.java | 4 +- .../ResourcesPluginDataTranslationSpec.java | 165 +++-- .../src/main/java/lesson/Example_18.java | 2 +- .../src/main/java/lesson/Example_19.java | 2 +- 24 files changed, 1340 insertions(+), 1197 deletions(-) diff --git a/demos/gcm4_plan_testing/src/main/java/lesson/PlanTestDriver.java b/demos/gcm4_plan_testing/src/main/java/lesson/PlanTestDriver.java index d88b7af75..21f3fcc6a 100644 --- a/demos/gcm4_plan_testing/src/main/java/lesson/PlanTestDriver.java +++ b/demos/gcm4_plan_testing/src/main/java/lesson/PlanTestDriver.java @@ -417,7 +417,7 @@ private NIOReportItemHandler getNIOReportItemHandler(Path outputDirectory) { private Plugin getResourcesPlugin() { final ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); for (final ResourceId resourcId : Resource.values()) { - builder.addResource(resourcId); + builder.addResource(resourcId,0.0); } final ResourcesPluginData resourcesPluginData = builder.build(); return ResourcesPlugin.builder().setResourcesPluginData(resourcesPluginData).getResourcesPlugin(); diff --git a/gcm4/src/main/java/plugins/materials/testsupport/MaterialsTestPluginFactory.java b/gcm4/src/main/java/plugins/materials/testsupport/MaterialsTestPluginFactory.java index d9d0bb1cb..e1def9d08 100644 --- a/gcm4/src/main/java/plugins/materials/testsupport/MaterialsTestPluginFactory.java +++ b/gcm4/src/main/java/plugins/materials/testsupport/MaterialsTestPluginFactory.java @@ -524,7 +524,7 @@ public static ResourcesPluginData getStandardResourcesPluginData(long seed) { ResourcesPluginData.Builder resourcesBuilder = ResourcesPluginData.builder(); for (TestResourceId testResourceId : TestResourceId.values()) { - resourcesBuilder.addResource(testResourceId); + resourcesBuilder.addResource(testResourceId,0.0); resourcesBuilder.setResourceTimeTracking(testResourceId, testResourceId.getTimeTrackingPolicy()); } diff --git a/gcm4/src/main/java/plugins/resources/ResourcesPluginData.java b/gcm4/src/main/java/plugins/resources/ResourcesPluginData.java index c6b63414f..f77c159b6 100644 --- a/gcm4/src/main/java/plugins/resources/ResourcesPluginData.java +++ b/gcm4/src/main/java/plugins/resources/ResourcesPluginData.java @@ -24,7 +24,6 @@ import plugins.resources.support.ResourcePropertyId; import plugins.util.properties.PropertyDefinition; import plugins.util.properties.PropertyError; -import plugins.util.properties.TimeTrackingPolicy; import util.errors.ContractException; import util.wrappers.MultiKey; @@ -44,36 +43,29 @@ public final class ResourcesPluginData implements PluginData { private static class Data { + private final Map resourceIds; + private final Map resourceTimeTrackingPolicies; private final Map> resourcePropertyDefinitions; - private final Map> resourcePropertyValues; - - private final List> personResourceLevels; - - private final List emptyResourceInitializationList = Collections.unmodifiableList(new ArrayList<>()); - - private int personCount; - - private final Set resourceIds; - + private final Map> personResourceLevels; + private final Map> personResourceTimes; private final Map> regionResourceLevels; - private final Map resourceTimeTrackingPolicies; - private boolean locked; public Data() { + resourceIds = new LinkedHashMap<>(); + resourceTimeTrackingPolicies = new LinkedHashMap<>(); resourcePropertyDefinitions = new LinkedHashMap<>(); resourcePropertyValues = new LinkedHashMap<>(); - personResourceLevels = new ArrayList<>(); - resourceIds = new LinkedHashSet<>(); + personResourceLevels = new LinkedHashMap<>(); + personResourceTimes = new LinkedHashMap<>(); regionResourceLevels = new LinkedHashMap<>(); - resourceTimeTrackingPolicies = new LinkedHashMap<>(); } public Data(Data data) { - personCount = data.personCount; - + resourceIds = new LinkedHashMap<>(data.resourceIds); + resourceTimeTrackingPolicies = new LinkedHashMap<>(data.resourceTimeTrackingPolicies); resourcePropertyDefinitions = new LinkedHashMap<>(); for (ResourceId resourceId : data.resourcePropertyDefinitions.keySet()) { Map map = data.resourcePropertyDefinitions.get(resourceId); @@ -88,19 +80,19 @@ public Data(Data data) { resourcePropertyValues.put(resourceId, newMap); } - personResourceLevels = new ArrayList<>(); - int n = data.personResourceLevels.size(); - for (int i = 0; i < n; i++) { - - List list = data.personResourceLevels.get(i); - List newList = null; - if (list != null) { - newList = new ArrayList<>(list); - } - personResourceLevels.add(newList); + personResourceLevels = new LinkedHashMap<>(); + for (ResourceId resourceId : data.personResourceLevels.keySet()) { + List list = data.personResourceLevels.get(resourceId); + List newlist = new ArrayList<>(list); + personResourceLevels.put(resourceId, newlist); } - resourceIds = new LinkedHashSet<>(data.resourceIds); + personResourceTimes = new LinkedHashMap<>(); + for (ResourceId resourceId : data.personResourceTimes.keySet()) { + List list = data.personResourceTimes.get(resourceId); + List newlist = new ArrayList<>(list); + personResourceTimes.put(resourceId, newlist); + } regionResourceLevels = new LinkedHashMap<>(); for (RegionId regionId : data.regionResourceLevels.keySet()) { @@ -109,8 +101,6 @@ public Data(Data data) { regionResourceLevels.put(regionId, newList); } - resourceTimeTrackingPolicies = new LinkedHashMap<>(data.resourceTimeTrackingPolicies); - locked = data.locked; } @@ -127,7 +117,7 @@ public int hashCode() { result = prime * result + getResourcePropertyValuesHashCode(); result = prime * result + getRegionResourceLevelsHashCode(); result = prime * result + getPersonResourceLevelsHashCode(); - + result = prime * result + getPersonResourceTimesHashCode(); return result; } @@ -135,14 +125,15 @@ private int getResourcePropertyValuesHashCode() { final int prime = 31; int result = 0; for (ResourceId resourceId : resourcePropertyValues.keySet()) { - //the defMap might be null + // the defMap might be null Map defMap = resourcePropertyDefinitions.get(resourceId); Map map = resourcePropertyValues.get(resourceId); if (map != null) { for (ResourcePropertyId resourcePropertyId : map.keySet()) { boolean addValue = true; Object value = map.get(resourcePropertyId); - //the existence of the property id in a validated Data implies the defMap is not null + // the existence of the property id in a validated Data + // implies the defMap is not null PropertyDefinition propertyDefinition = defMap.get(resourcePropertyId); Optional optional = propertyDefinition.getDefaultValue(); if (optional.isPresent()) { @@ -186,24 +177,53 @@ private int getRegionResourceLevelsHashCode() { return result; } + private int getPersonResourceLevelsHashCode(ResourceId resourceId) { + final int prime = 31; + int result = 0; + Long zero = 0L; + + List values = personResourceLevels.get(resourceId); + for (Long value : values) { + if (value != null) { + if (!value.equals(zero)) { + result = result * prime + value.hashCode(); + } + } + } + + return result; + } + private int getPersonResourceLevelsHashCode() { + int result = 0; + for (ResourceId resourceId : resourceIds.keySet()) { + result += getPersonResourceLevelsHashCode(resourceId); + } + return result; + } + + private int getPersonResourceTimesHashCode(ResourceId resourceId) { final int prime = 31; int result = 0; - for (int personIndex = 0; personIndex < personResourceLevels.size(); personIndex++) { - List list = personResourceLevels.get(personIndex); - if (list != null) { - for (ResourceInitialization resourceInitialization : list) { - Long amount = resourceInitialization.getAmount(); - if (amount != 0L) { - ResourceId resourceId = resourceInitialization.getResourceId(); - int subResult = 1; - subResult = prime * subResult + resourceId.hashCode(); - subResult = prime * subResult + amount.hashCode(); - result += subResult; - } + Double defaultValue = resourceIds.get(resourceId); + + List values = personResourceTimes.get(resourceId); + for (Double value : values) { + if (value != null) { + if (!value.equals(defaultValue)) { + result = result * prime + value.hashCode(); } } } + + return result; + } + + private int getPersonResourceTimesHashCode() { + int result = 0; + for (ResourceId resourceId : resourceIds.keySet()) { + result += getPersonResourceTimesHashCode(resourceId); + } return result; } @@ -226,9 +246,6 @@ public boolean equals(Object obj) { * locked -- two Datas are only compared when they are both locked * -- there are no equality comparisons in this class. * - * personCount -- different person counts do not necessarily - * indicate different content - * * emptyResourceInitializationList -- are just empty lists */ @@ -260,7 +277,9 @@ public boolean equals(Object obj) { if (!comparePersonResourceLevels(this, other)) { return false; } - + if (!comparePersonResourceTimes(this, other)) { + return false; + } return true; } @@ -269,37 +288,73 @@ public boolean equals(Object obj) { * resource ids and resource property definitions */ private static boolean comparePersonResourceLevels(Data a, Data b) { - - int personCount = FastMath.max(a.personCount, b.personCount); - for (int i = 0; i < personCount; i++) { - Set aLevels = getPersonResourceLevels(a, i); - Set bLevels = getPersonResourceLevels(b, i); - if (!aLevels.equals(bLevels)) { - return false; + for (ResourceId resourceId : a.resourceIds.keySet()) { + List aValues = a.personResourceLevels.get(resourceId); + List bValues = b.personResourceLevels.get(resourceId); + Long zero = 0L; + Long value; + Long aValue; + Long bValue; + int n = FastMath.max(aValues.size(), bValues.size()); + for (int i = 0; i < n; i++) { + aValue = zero; + if (i < aValues.size()) { + value = aValues.get(i); + if (value != null) { + aValue = value; + } + } + bValue = zero; + if (i < bValues.size()) { + value = bValues.get(i); + if (value != null) { + bValue = value; + } + } + if (!aValue.equals(bValue)) { + return false; + } } } return true; } /* - * Assembles a set of multi-keys from the region resource levels - * contained in the data that are not zero. + * Both Data instances have been fully formed, validated and have equal + * resource ids and resource property definitions */ - private static Set getPersonResourceLevels(Data data, int personIndex) { - Set result = new LinkedHashSet<>(); - if (personIndex < data.personResourceLevels.size()) { - List list = data.personResourceLevels.get(personIndex); - if (list != null) { - for (ResourceInitialization resourceInitialization : list) { - Long amount = resourceInitialization.getAmount(); - if (amount != 0L) { - ResourceId resourceId = resourceInitialization.getResourceId(); - result.add(new MultiKey(resourceId, amount)); + private static boolean comparePersonResourceTimes(Data a, Data b) { + + for (ResourceId resourceId : a.resourceIds.keySet()) { + List aValues = a.personResourceTimes.get(resourceId); + List bValues = b.personResourceTimes.get(resourceId); + Double defaultValue = a.resourceIds.get(resourceId); + Double value; + Double aValue; + Double bValue; + int n = FastMath.max(aValues.size(), bValues.size()); + for (int i = 0; i < n; i++) { + aValue = defaultValue; + if (i < aValues.size()) { + value = aValues.get(i); + if (value != null) { + aValue = value; } } + bValue = defaultValue; + if (i < bValues.size()) { + value = bValues.get(i); + if (value != null) { + bValue = value; + } + } + if (!aValue.equals(bValue)) { + return false; + } } } - return result; + return true; + } /* @@ -399,24 +454,12 @@ private static void validateResourceIdNotNull(ResourceId resourceId) { } } - private static void validateTimeTrackingPolicyNotNull(TimeTrackingPolicy timeTrackingPolicy) { - if (timeTrackingPolicy == null) { - throw new ContractException(ResourceError.NULL_TIME_TRACKING_POLICY); - } - } - private static void validateRegionIdNotNull(RegionId regionId) { if (regionId == null) { throw new ContractException(RegionError.NULL_REGION_ID); } } - private static void validatePersonIdNotNull(PersonId personId) { - if (personId == null) { - throw new ContractException(PersonError.NULL_PERSON_ID); - } - } - private static void validatePersonId(PersonId personId) { if (personId == null) { throw new ContractException(PersonError.NULL_PERSON_ID); @@ -525,20 +568,39 @@ public ResourcesPluginData build() { } /** - * Adds the given resouce id. Duplicate inputs override previous inputs. + * Adds the given resouce id with default time value. Duplicate inputs + * override previous inputs. * * @throws ContractException *
  • {@linkplain ResourceError#NULL_RESOURCE_ID} if the * resource id is null
  • + *
  • {@linkplain ResourceError#NULL_TIME} if the time is + * null
  • * */ - public Builder addResource(final ResourceId resourceId) { + public Builder addResource(final ResourceId resourceId, Double time) { ensureDataMutability(); validateResourceIdNotNull(resourceId); - data.resourceIds.add(resourceId); - if (!data.resourceTimeTrackingPolicies.containsKey(resourceId)) { - data.resourceTimeTrackingPolicies.put(resourceId, TimeTrackingPolicy.DO_NOT_TRACK_TIME); - } + validateTime(time); + data.resourceIds.put(resourceId, time); + return this; + } + + /** + * Sets the time tracking policy for a resource. Duplicate inputs + * override previous inputs. + * + * @throws ContractException + *
  • {@linkplain ResourceError#NULL_RESOURCE_ID} if the + * resource id is null
  • + *
  • {@linkplain ResourceError#NULL_TIME_TRACKING_POLICY} + * if the tracking policy is null
  • + * + */ + public Builder setResourceTimeTracking(final ResourceId resourceId, final boolean trackValueAssignmentTimes) { + ensureDataMutability(); + validateResourceIdNotNull(resourceId); + data.resourceTimeTrackingPolicies.put(resourceId, trackValueAssignmentTimes); return this; } @@ -572,6 +634,34 @@ public Builder defineResourceProperty(final ResourceId resourceId, final Resourc return this; } + /** + * Sets a resource property value. Duplicate inputs override previous + * inputs. + * + * @throws ContractException + *
  • {@linkplain ResourceError#NULL_RESOURCE_ID} if the + * resource id is null
  • + *
  • {@linkplain PropertyError#NULL_PROPERTY_ID} if the + * resource property id is null
  • + *
  • {@linkplain PropertyError#NULL_PROPERTY_VALUE} if the + * resource property value is null
  • + * + */ + public Builder setResourcePropertyValue(final ResourceId resourceId, final ResourcePropertyId resourcePropertyId, final Object resourcePropertyValue) { + ensureDataMutability(); + validateResourceIdNotNull(resourceId); + validateResourcePropertyIdNotNull(resourcePropertyId); + validateResourcePropertyValueNotNull(resourcePropertyValue); + + Map propertyMap = data.resourcePropertyValues.get(resourceId); + if (propertyMap == null) { + propertyMap = new LinkedHashMap<>(); + data.resourcePropertyValues.put(resourceId, propertyMap); + } + propertyMap.put(resourcePropertyId, resourcePropertyValue); + return this; + } + /** * Sets a person's initial resource level. Duplicate inputs override * previous inputs. @@ -582,8 +672,7 @@ public Builder defineResourceProperty(final ResourceId resourceId, final Resourc *
  • {@linkplain ResourceError#NULL_RESOURCE_ID} if the * resource id is null
  • *
  • {@linkplain ResourceError#NEGATIVE_RESOURCE_AMOUNT} - * if the resource amount is negative
  • * - * + * if the resource amount is negative */ public Builder setPersonResourceLevel(final PersonId personId, final ResourceId resourceId, final long amount) { @@ -592,37 +681,54 @@ public Builder setPersonResourceLevel(final PersonId personId, final ResourceId validateResourceIdNotNull(resourceId); validateResourceAmount(amount); - int personIndex = personId.getValue(); - data.personCount = FastMath.max(data.personCount, personIndex + 1); + List list = data.personResourceLevels.get(resourceId); + if (list == null) { + list = new ArrayList<>(); + data.personResourceLevels.put(resourceId, list); + } - while (personIndex >= data.personResourceLevels.size()) { - data.personResourceLevels.add(null); + int personIndex = personId.getValue(); + while (list.size() <= personIndex) { + list.add(null); } + list.set(personIndex, amount); - List list = data.personResourceLevels.get(personIndex); - ResourceInitialization resourceInitialization = new ResourceInitialization(resourceId, amount); + return this; - if (list == null) { - list = new ArrayList<>(); - data.personResourceLevels.set(personIndex, list); - } + } - int index = -1; + /** + * Sets a person's initial resource time. Duplicate inputs override + * previous inputs. + * + * @throws ContractException + *
  • {@linkplain PersonError#NULL_PERSON_ID} if the person + * id is null
  • + *
  • {@linkplain ResourceError#NULL_RESOURCE_ID} if the + * resource id is null
  • + *
  • {@linkplain ResourceError#NULL_TIME} if the time is + * null
  • + */ + public Builder setPersonResourceTime(final PersonId personId, final ResourceId resourceId, final Double time) { + ensureDataMutability(); + validatePersonId(personId); + validateResourceIdNotNull(resourceId); + validateTime(time); - for (int i = 0; i < list.size(); i++) { - if (list.get(i).getResourceId().equals(resourceId)) { - index = i; - break; - } + List list = data.personResourceTimes.get(resourceId); + if (list == null) { + list = new ArrayList<>(); + data.personResourceTimes.put(resourceId, list); } - if (index == -1) { - list.add(resourceInitialization); - } else { - list.set(index, resourceInitialization); + int personIndex = personId.getValue(); + while (list.size() <= personIndex) { + list.add(null); } + list.set(personIndex, time); return this; + } /** @@ -669,139 +775,164 @@ public Builder setRegionResourceLevel(final RegionId regionId, final ResourceId return this; } - /** - * Sets a resource property value. Duplicate inputs override previous - * inputs. - * - * @throws ContractException - *
  • {@linkplain ResourceError#NULL_RESOURCE_ID} if the - * resource id is null
  • - *
  • {@linkplain PropertyError#NULL_PROPERTY_ID} if the - * resource property id is null
  • - *
  • {@linkplain PropertyError#NULL_PROPERTY_VALUE} if the - * resource property value is null
  • - * - */ - public Builder setResourcePropertyValue(final ResourceId resourceId, final ResourcePropertyId resourcePropertyId, final Object resourcePropertyValue) { - ensureDataMutability(); - validateResourceIdNotNull(resourceId); - validateResourcePropertyIdNotNull(resourcePropertyId); - validateResourcePropertyValueNotNull(resourcePropertyValue); - - Map propertyMap = data.resourcePropertyValues.get(resourceId); - if (propertyMap == null) { - propertyMap = new LinkedHashMap<>(); - data.resourcePropertyValues.put(resourceId, propertyMap); - } - propertyMap.put(resourcePropertyId, resourcePropertyValue); - return this; - } - - /** - * Sets the time tracking policy for a resource. Duplicate inputs - * override previous inputs. - * - * @throws ContractException - *
  • {@linkplain ResourceError#NULL_RESOURCE_ID} if the - * resource id is null
  • - *
  • {@linkplain ResourceError#NULL_TIME_TRACKING_POLICY} - * if the tracking policy is null
  • - * - */ - public Builder setResourceTimeTracking(final ResourceId resourceId, final TimeTrackingPolicy trackValueAssignmentTimes) { - ensureDataMutability(); - validateResourceIdNotNull(resourceId); - validateTimeTrackingPolicyNotNull(trackValueAssignmentTimes); - data.resourceTimeTrackingPolicies.put(resourceId, trackValueAssignmentTimes); - return this; - } + private void validateData() { + /* + * validate and fill in resourceTimeTrackingPolicies + */ for (ResourceId resourceId : data.resourceTimeTrackingPolicies.keySet()) { - if (!data.resourceIds.contains(resourceId)) { + if (!data.resourceIds.containsKey(resourceId)) { throw new ContractException(ResourceError.UNKNOWN_RESOURCE_ID, resourceId + " has a resource tracking policy but is not a known resource id"); } } + // filling in with false + for (ResourceId resourceId : data.resourceIds.keySet()) { + if (!data.resourceTimeTrackingPolicies.containsKey(resourceId)) { + data.resourceTimeTrackingPolicies.put(resourceId, false); + } + } + + /* + * validate and fill in resourcePropertyDefinitions + */ for (ResourceId resourceId : data.resourcePropertyDefinitions.keySet()) { - if (!data.resourceIds.contains(resourceId)) { + if (!data.resourceIds.containsKey(resourceId)) { throw new ContractException(ResourceError.UNKNOWN_RESOURCE_ID, resourceId + " has a property definitions but is not a known resource id"); } } - for (ResourceId resourceId : data.resourcePropertyValues.keySet()) { - if (!data.resourceIds.contains(resourceId)) { - throw new ContractException(ResourceError.UNKNOWN_RESOURCE_ID, resourceId + " has a property values but is not a known resource id"); + // filling in with empty maps + for (ResourceId resourceId : data.resourceIds.keySet()) { + if (!data.resourcePropertyDefinitions.containsKey(resourceId)) { + data.resourcePropertyDefinitions.put(resourceId, new LinkedHashMap<>()); } + } - Map propDefMap = data.resourcePropertyDefinitions.get(resourceId); - + /* + * validate and fill in resourcePropertyValues + * + * show that the resource ids are in data.resourceids + * + * show that the resource property ids are in the + * data.resourcePropertyDefinitions + * + * show that the values are compatible with the property definitions + */ + for (ResourceId resourceId : data.resourcePropertyValues.keySet()) { + if (!data.resourceIds.containsKey(resourceId)) { + throw new ContractException(ResourceError.UNKNOWN_RESOURCE_ID, resourceId + " for a collected resource property value"); + } + Map propMap = data.resourcePropertyDefinitions.get(resourceId); Map map = data.resourcePropertyValues.get(resourceId); for (ResourcePropertyId resourcePropertyId : map.keySet()) { - if (propDefMap == null || !propDefMap.containsKey(resourcePropertyId)) { - throw new ContractException(PropertyError.UNKNOWN_PROPERTY_ID, resourceId + ": " + resourcePropertyId); + if (!propMap.containsKey(resourcePropertyId)) { + throw new ContractException(PropertyError.UNKNOWN_PROPERTY_ID, + resourcePropertyId + " has a resource property value under resource " + resourceId + " but there is no corresponding property definition"); } Object propertyValue = map.get(resourcePropertyId); - PropertyDefinition propertyDefinition = propDefMap.get(resourcePropertyId); + PropertyDefinition propertyDefinition = propMap.get(resourcePropertyId); if (!propertyDefinition.getType().isAssignableFrom(propertyValue.getClass())) { - throw new ContractException(PropertyError.INCOMPATIBLE_VALUE, resourceId + ": " + resourcePropertyId + ": " + propertyValue); + throw new ContractException(PropertyError.INCOMPATIBLE_VALUE, resourcePropertyId + " has a resource property value of " + propertyValue + " under resource " + resourceId + + " that is incompatible with the corresponding property definition"); } } + } + // fill in with empty maps + for (ResourceId resourceId : data.resourceIds.keySet()) { + if (!data.resourcePropertyValues.containsKey(resourceId)) { + data.resourcePropertyValues.put(resourceId, new LinkedHashMap<>()); + } } - /* - * For every resource property definition that has a null default - * value, ensure that there all corresponding resource property - * values are not null. - */ - for (ResourceId resourceId : data.resourceIds) { + // show that property definitions without default values have + // complete value coverage + for (ResourceId resourceId : data.resourcePropertyDefinitions.keySet()) { Map propertyDefinitionMap = data.resourcePropertyDefinitions.get(resourceId); - if (propertyDefinitionMap != null) { - for (ResourcePropertyId resourcePropertyId : propertyDefinitionMap.keySet()) { - PropertyDefinition propertyDefinition = propertyDefinitionMap.get(resourcePropertyId); - if (!propertyDefinition.getDefaultValue().isPresent()) { - Object propertyValue = null; - Map propertyValueMap = data.resourcePropertyValues.get(resourceId); - if (propertyValueMap != null) { - propertyValue = propertyValueMap.get(resourcePropertyId); - } - if (propertyValue == null) { - throw new ContractException(PropertyError.INSUFFICIENT_PROPERTY_VALUE_ASSIGNMENT, resourceId + ": " + resourcePropertyId); - } + for (ResourcePropertyId resourcePropertyId : propertyDefinitionMap.keySet()) { + PropertyDefinition propertyDefinition = propertyDefinitionMap.get(resourcePropertyId); + if (!propertyDefinition.getDefaultValue().isPresent()) { + Object propertyValue = null; + Map propertyValueMap = data.resourcePropertyValues.get(resourceId); + propertyValue = propertyValueMap.get(resourcePropertyId); + if (propertyValue == null) { + throw new ContractException(PropertyError.INSUFFICIENT_PROPERTY_VALUE_ASSIGNMENT, resourceId + ": " + resourcePropertyId); } } } } - int n = data.personResourceLevels.size(); - for (int i = 0; i < n; i++) { - List list = data.personResourceLevels.get(i); - if (list != null) { - for (ResourceInitialization resourceInitialization : list) { - if (!data.resourceIds.contains(resourceInitialization.getResourceId())) { - throw new ContractException(ResourceError.UNKNOWN_RESOURCE_ID, new PersonId(i) + ": " + resourceInitialization.getResourceId()); - } + /* + * validate regionResourceLevels + */ + for (RegionId regionId : data.regionResourceLevels.keySet()) { + List list = data.regionResourceLevels.get(regionId); + for (ResourceInitialization resourceInitialization : list) { + ResourceId resourceId = resourceInitialization.getResourceId(); + if (!data.resourceIds.containsKey(resourceId)) { + throw new ContractException(ResourceError.UNKNOWN_RESOURCE_ID, resourceId + " for region " + regionId + " has a level, but is not a known resource"); } } } - for (RegionId regionId : data.regionResourceLevels.keySet()) { - List resourceInitializations = data.regionResourceLevels.get(regionId); - if (resourceInitializations != null) { - for (ResourceInitialization resourceInitialization : resourceInitializations) { - if (!data.resourceIds.contains(resourceInitialization.getResourceId())) { - throw new ContractException(ResourceError.UNKNOWN_RESOURCE_ID, regionId + ": " + resourceInitialization.getResourceId()); + /* + * validate and fill in personResourceLevels + */ + for (ResourceId resourceId : data.personResourceLevels.keySet()) { + if (!data.resourceIds.containsKey(resourceId)) { + throw new ContractException(ResourceError.UNKNOWN_RESOURCE_ID, resourceId + " has person resource levels, but is not a known resource id"); + } + } + + // filling in with empty lists + for (ResourceId resourceId : data.resourceIds.keySet()) { + if (!data.personResourceLevels.containsKey(resourceId)) { + data.personResourceLevels.put(resourceId, new ArrayList<>()); + } + } + + /* + * validate and fill in personResourceTimes + */ + + // private final Map> personResourceTimes; + for (ResourceId resourceId : data.personResourceTimes.keySet()) { + if (!data.resourceIds.containsKey(resourceId)) { + throw new ContractException(ResourceError.UNKNOWN_RESOURCE_ID, resourceId + " has person resource times, but is not a known resource id"); + } + } + + // filling in with empty lists + for (ResourceId resourceId : data.resourceIds.keySet()) { + if (!data.personResourceTimes.containsKey(resourceId)) { + data.personResourceTimes.put(resourceId, new ArrayList<>()); + } + } + + for (ResourceId resourceId : data.personResourceTimes.keySet()) { + Double creationTime = data.resourceIds.get(resourceId); + List times = data.personResourceTimes.get(resourceId); + for (Double time : times) { + if (time != null) { + if (time < creationTime) { + throw new ContractException(ResourceError.RESOURCE_ASSIGNMENT_TIME_PRECEEDS_RESOURCE_CREATION_TIME); } } } } - } } + private static void validateTime(Double time) { + if (time == null) { + throw new ContractException(ResourceError.NULL_TIME); + } + } + private static void validateResourcePropertyIsDefined(final Data data, final ResourceId resourceId, final ResourcePropertyId resourcePropertyId) { Map map = data.resourcePropertyDefinitions.get(resourceId); if (map == null) { @@ -829,7 +960,7 @@ private static void validateResourcePropertyIsDefined(final Data data, final Res * */ public PropertyDefinition getResourcePropertyDefinition(final ResourceId resourceId, final ResourcePropertyId resourcePropertyId) { - validateResourceExists(data, resourceId); + validateResourceExists(resourceId); validateResourcePropertyIdNotNull(resourcePropertyId); validateResourcePropertyIsDefined(data, resourceId, resourcePropertyId); final Map defMap = data.resourcePropertyDefinitions.get(resourceId); @@ -848,7 +979,7 @@ public PropertyDefinition getResourcePropertyDefinition(final ResourceId resourc */ @SuppressWarnings("unchecked") public Set getResourcePropertyIds(final ResourceId resourceId) { - validateResourceExists(data, resourceId); + validateResourceExists(resourceId); Set result = new LinkedHashSet<>(); Map defMap = data.resourcePropertyDefinitions.get(resourceId); if (defMap != null) { @@ -859,11 +990,11 @@ public Set getResourcePropertyIds(final Resour return result; } - private static void validateResourceExists(final Data data, final ResourceId resourceId) { + private void validateResourceExists(final ResourceId resourceId) { if (resourceId == null) { throw new ContractException(ResourceError.NULL_RESOURCE_ID); } - if (!data.resourceIds.contains(resourceId)) { + if (!data.resourceIds.containsKey(resourceId)) { throw new ContractException(ResourceError.UNKNOWN_RESOURCE_ID, resourceId); } } @@ -885,7 +1016,7 @@ private static void validateResourceExists(final Data data, final ResourceId res */ @SuppressWarnings("unchecked") public T getResourcePropertyValue(final ResourceId resourceId, final ResourcePropertyId resourcePropertyId) { - validateResourceExists(data, resourceId); + validateResourceExists(resourceId); validateResourcePropertyIdNotNull(resourcePropertyId); validateResourcePropertyIsDefined(data, resourceId, resourcePropertyId); @@ -906,29 +1037,38 @@ public T getResourcePropertyValue(final ResourceId resourceId, final Resourc } /** - * Returns the person's initial resource levels. + * Returns an unmodifiable list of the initial resource levels for the given + * resource id. May contain null, may be empty. * * @throws ContractException - *
  • {@linkplain PersonError#NULL_PERSON_ID} if the person id - * is null
  • + * *
  • {@linkplain ResourceError#NULL_RESOURCE_ID} if the * resource id is null
  • *
  • {@linkplain ResourceError#UNKNOWN_RESOURCE_ID} if the * resource id is unknown
  • + * */ - public List getPersonResourceLevels(final PersonId personId) { - - validatePersonIdNotNull(personId); - int personIndex = personId.getValue(); - if (personIndex >= data.personResourceLevels.size()) { - return data.emptyResourceInitializationList; - } - - List list = data.personResourceLevels.get(personIndex); - if (list == null) { - return data.emptyResourceInitializationList; - } + public List getPersonResourceLevels(final ResourceId resourcId) { + validateResourceExists(resourcId); + List list = data.personResourceLevels.get(resourcId); + return Collections.unmodifiableList(list); + } + /** + * Returns an unmodifiable list of the initial resource levels for the given + * resource id. May contain null, may be empty. + * + * @throws ContractException + * + *
  • {@linkplain ResourceError#NULL_RESOURCE_ID} if the + * resource id is null
  • + *
  • {@linkplain ResourceError#UNKNOWN_RESOURCE_ID} if the + * resource id is unknown
  • + * + */ + public List getPersonResourceTimes(final ResourceId resourcId) { + validateResourceExists(resourcId); + List list = data.personResourceTimes.get(resourcId); return Collections.unmodifiableList(list); } @@ -938,12 +1078,27 @@ public List getPersonResourceLevels(final PersonId perso @SuppressWarnings("unchecked") public Set getResourceIds() { Set result = new LinkedHashSet<>(data.resourceIds.size()); - for (ResourceId resourceId : data.resourceIds) { + for (ResourceId resourceId : data.resourceIds.keySet()) { result.add((T) resourceId); } return result; } + /** + * Returns the resource ids + * + * @throws ContractException + *
  • {@linkplain ResourceError.NULL_RESOURCE_ID} if the + * resource id is null
  • + *
  • {@linkplain ResourceError.UNKNOWN_RESOURCE_ID} if the + * resource id is unknown
  • + * + */ + public Double getResourceDefaultTime(ResourceId resourceId) { + validateResourceExists(resourceId); + return data.resourceIds.get(resourceId); + } + /** * Returns the region's initial resource level. Returns 0 if no value was * assigned during the build process. @@ -956,7 +1111,7 @@ public List getRegionResourceLevels(final RegionId regio validateRegionIdNotNull(regionId); List list = data.regionResourceLevels.get(regionId); if (list == null) { - return data.emptyResourceInitializationList; + list = new ArrayList<>(); } return Collections.unmodifiableList(list); } @@ -971,13 +1126,9 @@ public List getRegionResourceLevels(final RegionId regio *
  • {@linkplain ResourceError#UNKNOWN_RESOURCE_ID} if the * resource id is unknown
  • */ - public TimeTrackingPolicy getPersonResourceTimeTrackingPolicy(final ResourceId resourceId) { - validateResourceExists(data, resourceId); - TimeTrackingPolicy result = data.resourceTimeTrackingPolicies.get(resourceId); - if (result == null) { - result = TimeTrackingPolicy.DO_NOT_TRACK_TIME; - } - return result; + public boolean getResourceTimeTrackingPolicy(final ResourceId resourceId) { + validateResourceExists(resourceId); + return data.resourceTimeTrackingPolicies.get(resourceId); } /** @@ -992,14 +1143,6 @@ public PluginDataBuilder getCloneBuilder() { return new Builder(data); } - /** - * Returns the int value that exceeds by one the highest person id value - * encountered while associating people with resources. - */ - public int getPersonCount() { - return data.personCount; - } - @Override public int hashCode() { final int prime = 31; @@ -1022,5 +1165,4 @@ public boolean equals(Object obj) { } return true; } - -} +} \ No newline at end of file diff --git a/gcm4/src/main/java/plugins/resources/datamanagers/ResourcesDataManager.java b/gcm4/src/main/java/plugins/resources/datamanagers/ResourcesDataManager.java index 31e03ac3d..461b9ff2f 100644 --- a/gcm4/src/main/java/plugins/resources/datamanagers/ResourcesDataManager.java +++ b/gcm4/src/main/java/plugins/resources/datamanagers/ResourcesDataManager.java @@ -8,13 +8,14 @@ import java.util.Optional; import java.util.Set; +import org.apache.commons.math3.util.FastMath; + import nucleus.DataManager; import nucleus.DataManagerContext; import nucleus.Event; import nucleus.EventFilter; import nucleus.IdentifiableFunctionMap; import nucleus.NucleusError; -import nucleus.SimulationContext; import plugins.people.datamanagers.PeopleDataManager; import plugins.people.events.PersonImminentAdditionEvent; import plugins.people.events.PersonRemovalEvent; @@ -39,10 +40,10 @@ import plugins.util.properties.PropertyDefinition; import plugins.util.properties.PropertyError; import plugins.util.properties.PropertyValueRecord; -import plugins.util.properties.TimeTrackingPolicy; import plugins.util.properties.arraycontainers.DoubleValueContainer; import plugins.util.properties.arraycontainers.IntValueContainer; import util.errors.ContractException; +import util.wrappers.MutableLong; /** * Data manager for resources. Resource property values are generally mutable @@ -52,53 +53,6 @@ */ public final class ResourcesDataManager extends DataManager { - /* - * Static utility class for tracking region resources. - */ - private static class RegionResourceRecord { - - private final SimulationContext simulationContext; - - private long amount; - - private double assignmentTime; - - public RegionResourceRecord(final SimulationContext simulationContext) { - this.simulationContext = simulationContext; - assignmentTime = simulationContext.getTime(); - } - - public void decrementAmount(final long amount) { - if (amount < 0) { - throw new ContractException(ResourceError.NEGATIVE_RESOURCE_AMOUNT); - } - - if (this.amount < amount) { - throw new ContractException(ResourceError.INSUFFICIENT_RESOURCES_AVAILABLE); - } - - this.amount = Math.subtractExact(this.amount, amount); - assignmentTime = simulationContext.getTime(); - } - - public long getAmount() { - return amount; - } - - public double getAssignmentTime() { - return assignmentTime; - } - - public void incrementAmount(final long amount) { - if (amount < 0) { - throw new ContractException(ResourceError.NEGATIVE_RESOURCE_AMOUNT); - } - this.amount = Math.addExact(this.amount, amount); - assignmentTime = simulationContext.getTime(); - } - - } - private PeopleDataManager peopleDataManager; private RegionsDataManager regionsDataManager; @@ -116,11 +70,12 @@ public void incrementAmount(final long amount) { * Stores resource assignment times per person keyed by the resourceId. Key * existence subject to time recording policies specified by the scenario. */ - private final Map personResourceTimes = new LinkedHashMap<>(); - private final Map resourceTimeTrackingPolicies = new LinkedHashMap<>(); + private Map resourceDefinitionTimes = new LinkedHashMap<>(); + + private final Map personResourceTimes = new LinkedHashMap<>(); - private final Map> regionResources = new LinkedHashMap<>(); + private final Map> regionResources = new LinkedHashMap<>(); private final ResourcesPluginData resourcesPluginData; @@ -181,8 +136,7 @@ private void decrementPersonResourceLevel(final ResourceId resourceId, final Per */ private void decrementRegionResourceLevel(final RegionId regionId, final ResourceId resourceId, final long amount) { - final RegionResourceRecord regionResourceRecord = regionResources.get(regionId).get(resourceId); - regionResourceRecord.decrementAmount(amount); + regionResources.get(regionId).get(resourceId).decrement(amount); } /** @@ -202,9 +156,8 @@ public void expandCapacity(final int count) { for (final ResourceId resourceId : personResourceValues.keySet()) { final IntValueContainer intValueContainer = personResourceValues.get(resourceId); intValueContainer.setCapacity(intValueContainer.getCapacity() + count); - final TimeTrackingPolicy resourceTimeTrackingPolicy = resourceTimeTrackingPolicies.get(resourceId); - if (resourceTimeTrackingPolicy == TimeTrackingPolicy.TRACK_TIME) { - final DoubleValueContainer doubleValueContainer = personResourceTimes.get(resourceId); + final DoubleValueContainer doubleValueContainer = personResourceTimes.get(resourceId); + if (doubleValueContainer != null) { doubleValueContainer.setCapacity(doubleValueContainer.getCapacity() + count); } } @@ -358,9 +311,10 @@ public double getPersonResourceTime(final ResourceId resourceId, final PersonId *
  • {@linkplain ResourceError#UNKNOWN_RESOURCE_ID} if the * resource id is unknown
  • */ - public TimeTrackingPolicy getPersonResourceTimeTrackingPolicy(final ResourceId resourceId) { + public boolean getPersonResourceTimeTrackingPolicy(final ResourceId resourceId) { validateResourceId(resourceId); - return resourceTimeTrackingPolicies.get(resourceId); + DoubleValueContainer doubleValueContainer = personResourceTimes.get(resourceId); + return doubleValueContainer != null; } /** @@ -380,30 +334,7 @@ public TimeTrackingPolicy getPersonResourceTimeTrackingPolicy(final ResourceId r public long getRegionResourceLevel(final RegionId regionId, final ResourceId resourceId) { validateRegionId(regionId); validateResourceId(resourceId); - final RegionResourceRecord regionResourceRecord = regionResources.get(regionId).get(resourceId); - return regionResourceRecord.getAmount(); - } - - /** - * Returns the last assignment time for the region resource level - * - * @throws ContractException - *
  • {@linkplain RegionError#NULL_REGION_ID} if the region id - * is null
  • - *
  • {@linkplain RegionError#UNKNOWN_REGION_ID} if the region - * id is unknown
  • - *
  • {@linkplain ResourceError#NULL_RESOURCE_ID} if the - * resource id is null
  • - *
  • {@linkplain ResourceError#UNKNOWN_RESOURCE_ID} if the - * resource id is unknown
  • - */ - public double getRegionResourceTime(final RegionId regionId, final ResourceId resourceId) { - validateRegionId(regionId); - validateResourceId(resourceId); - - final RegionResourceRecord regionResourceRecord = regionResources.get(regionId).get(resourceId); - return regionResourceRecord.getAssignmentTime(); - + return regionResources.get(regionId).get(resourceId).getValue(); } /** @@ -427,12 +358,6 @@ private void validateResourceTypeIsUnknown(final ResourceId resourceId) { } } - private void validateTimeTrackingPolicy(TimeTrackingPolicy timeTrackingPolicy) { - if (timeTrackingPolicy == null) { - throw new ContractException(PropertyError.NULL_TIME_TRACKING_POLICY); - } - } - /* * Precondition : the resource id must exist */ @@ -505,7 +430,7 @@ private void handleResourcePropertyDefinitionMutationEvent(DataManagerContext da } - private record ResourceIdAdditionMutationEvent(ResourceId resourceId, TimeTrackingPolicy timeTrackingPolicy) implements Event { + private record ResourceIdAdditionMutationEvent(ResourceId resourceId, boolean timeTrackingPolicy) implements Event { } /** @@ -516,29 +441,23 @@ private record ResourceIdAdditionMutationEvent(ResourceId resourceId, TimeTracki * resource id is null *
  • {@linkplain ResourceError#DUPLICATE_RESOURCE_ID} if the * resource type is already present
  • - *
  • {@linkplain PropertyError#NULL_TIME_TRACKING_POLICY} if - * the time tracking policy is null
  • */ - public void addResourceId(ResourceId resourceId, TimeTrackingPolicy timeTrackingPolicy) { + public void addResourceId(ResourceId resourceId, boolean timeTrackingPolicy) { dataManagerContext.releaseMutationEvent(new ResourceIdAdditionMutationEvent(resourceId, timeTrackingPolicy)); } private void handleResourceIdAdditionMutationEvent(DataManagerContext dataManagerContext, ResourceIdAdditionMutationEvent resourceIdAdditionMutationEvent) { ResourceId resourceId = resourceIdAdditionMutationEvent.resourceId(); - TimeTrackingPolicy timeTrackingPolicy = resourceIdAdditionMutationEvent.timeTrackingPolicy(); - validateResourceTypeIsUnknown(resourceId); - - validateTimeTrackingPolicy(timeTrackingPolicy); - - // record the tracking policy - resourceTimeTrackingPolicies.put(resourceId, timeTrackingPolicy); + boolean trackTimes = resourceIdAdditionMutationEvent.timeTrackingPolicy(); + double resourceDefinitionTime = dataManagerContext.getTime(); + resourceDefinitionTimes.put(resourceId, resourceDefinitionTime); // if times for this resource will be tracked, then initialize tracking // times to the current time - if (timeTrackingPolicy == TimeTrackingPolicy.TRACK_TIME) { - final DoubleValueContainer doubleValueContainer = new DoubleValueContainer(dataManagerContext.getTime()); + if (trackTimes) { + final DoubleValueContainer doubleValueContainer = new DoubleValueContainer(resourceDefinitionTime); personResourceTimes.put(resourceId, doubleValueContainer); } @@ -550,13 +469,13 @@ private void handleResourceIdAdditionMutationEvent(DataManagerContext dataManage // add a record to record each region's resource level, initializing to // 0. for (final RegionId regionId : regionResources.keySet()) { - final Map map = regionResources.get(regionId); - map.put(resourceId, new RegionResourceRecord(dataManagerContext)); + final Map map = regionResources.get(regionId); + map.put(resourceId, new MutableLong()); } // release notice that a new resource id has been added if (dataManagerContext.subscribersExist(ResourceIdAdditionEvent.class)) { - dataManagerContext.releaseObservationEvent(new ResourceIdAdditionEvent(resourceId, timeTrackingPolicy)); + dataManagerContext.releaseObservationEvent(new ResourceIdAdditionEvent(resourceId, trackTimes)); } } @@ -686,8 +605,144 @@ private void incrementPersonResourceLevel(final ResourceId resourceId, final Per * the amount is negative */ private void incrementRegionResourceLevel(final RegionId regionId, final ResourceId resourceId, final long amount) { - final RegionResourceRecord regionResourceRecord = regionResources.get(regionId).get(resourceId); - regionResourceRecord.incrementAmount(amount); + regionResources.get(regionId).get(resourceId).increment(amount); + } + + private void loadResourcePropertyDefinitions() { + for (ResourceId resourceId : resourcesPluginData.getResourceIds()) { + Map defMap = new LinkedHashMap<>(); + resourcePropertyDefinitions.put(resourceId, defMap); + for (ResourcePropertyId resourcePropertyId : resourcesPluginData.getResourcePropertyIds(resourceId)) { + PropertyDefinition propertyDefinition = resourcesPluginData.getResourcePropertyDefinition(resourceId, resourcePropertyId); + defMap.put(resourcePropertyId, propertyDefinition); + } + } + } + + private void loadResourcePropertyValues() { + for (ResourceId resourceId : resourcesPluginData.getResourceIds()) { + Map map = new LinkedHashMap<>(); + resourcePropertyMap.put(resourceId, map); + for (ResourcePropertyId resourcePropertyId : resourcesPluginData.getResourcePropertyIds(resourceId)) { + Object resourcePropertyValue = resourcesPluginData.getResourcePropertyValue(resourceId, resourcePropertyId); + final PropertyValueRecord propertyValueRecord = new PropertyValueRecord(dataManagerContext); + propertyValueRecord.setPropertyValue(resourcePropertyValue); + map.put(resourcePropertyId, propertyValueRecord); + } + } + } + + private void loadResourceDefinitionTimes() { + for (ResourceId resourceId : resourcesPluginData.getResourceIds()) { + Double resourceDefinitionTime = resourcesPluginData.getResourceDefaultTime(resourceId); + if (resourceDefinitionTime > dataManagerContext.getTime()) { + throw new ContractException(ResourceError.RESOURCE_CREATION_TIME_EXCEEDS_SIM_TIME); + } + resourceDefinitionTimes.put(resourceId, resourceDefinitionTime); + } + } + + private void loadPersonResourceLevels() { + for (ResourceId resourceId : resourcesPluginData.getResourceIds()) { + // private final Map + // personResourceValues = new LinkedHashMap<>(); + final IntValueContainer intValueContainer = new IntValueContainer(0L); + personResourceValues.put(resourceId, intValueContainer); + List personResourceLevels = resourcesPluginData.getPersonResourceLevels(resourceId); + // load the person levels here + int n = FastMath.max(personResourceLevels.size(), peopleDataManager.getPersonIdLimit()); + for (int i = 0; i < n; i++) { + + Long value = null; + if (i < personResourceLevels.size()) { + value = personResourceLevels.get(i); + } + + if (peopleDataManager.personIndexExists(i)) { + if (value != null) { + if (value != 0) { + intValueContainer.setLongValue(i, value); + } + } + } else { + if (value != null) { + throw new ContractException(PersonError.UNKNOWN_PERSON_ID, + "A non-null resource level for person " + i + " for resource " + resourceId + " was found, but that person does not exist"); + } + + } + } + } + } + + private void loadPersonResourceTimes() { + for (ResourceId resourceId : resourcesPluginData.getResourceIds()) { + boolean trackTimes = resourcesPluginData.getResourceTimeTrackingPolicy(resourceId); + if (trackTimes) { + double resourceDefinitionTime = resourceDefinitionTimes.get(resourceId); + final DoubleValueContainer doubleValueContainer = new DoubleValueContainer(resourceDefinitionTime); + personResourceTimes.put(resourceId, doubleValueContainer); + + List personResourceTimes = resourcesPluginData.getPersonResourceTimes(resourceId); + int n = FastMath.max(personResourceTimes.size(), peopleDataManager.getPersonIdLimit()); + for (int i = 0; i < n; i++) { + + Double value = null; + if (i < personResourceTimes.size()) { + value = personResourceTimes.get(i); + } + + if (value != null && resourceDefinitionTime > value) { + throw new ContractException(ResourceError.RESOURCE_CREATION_TIME_EXCEEDS_SIM_TIME); + } + + if (peopleDataManager.personIndexExists(i)) { + if (value != null) { + if (value != 0) { + doubleValueContainer.setValue(i, value); + } + } + } else { + if (value != null) { + throw new ContractException(PersonError.UNKNOWN_PERSON_ID, + "A non-null resource assignment time for person " + i + " for resource " + resourceId + " was found, but that person does not exist"); + } + + } + } + } + } + } + + private void loadRegionResourceLevels() { + Set regionIds = regionsDataManager.getRegionIds(); + + for (RegionId regionId : regionIds) { + final Map map = new LinkedHashMap<>(); + regionResources.put(regionId, map); + } + + for (ResourceId resourceId : resourcesPluginData.getResourceIds()) { + for (final RegionId regionId : regionResources.keySet()) { + final Map map = regionResources.get(regionId); + map.put(resourceId, new MutableLong()); + } + } + + for (final RegionId regionId : resourcesPluginData.getRegionIds()) { + + if (!regionIds.contains(regionId)) { + throw new ContractException(RegionError.UNKNOWN_REGION_ID, regionId + " is an unknown region with initial resources"); + } + Map map = regionResources.get(regionId); + + for (ResourceInitialization resourceInitialization : resourcesPluginData.getRegionResourceLevels(regionId)) { + ResourceId resourceId = resourceInitialization.getResourceId(); + Long amount = resourceInitialization.getAmount(); + map.get(resourceId).increment(amount); + } + + } } /** @@ -756,98 +811,12 @@ public void init(final DataManagerContext dataManagerContext) { peopleDataManager = dataManagerContext.getDataManager(PeopleDataManager.class); regionsDataManager = dataManagerContext.getDataManager(RegionsDataManager.class); - // load resource property definitions, property values and time tracking - // policies - for (ResourceId resourceId : resourcesPluginData.getResourceIds()) { - - TimeTrackingPolicy timeTrackingPolicy = resourcesPluginData.getPersonResourceTimeTrackingPolicy(resourceId); - resourceTimeTrackingPolicies.put(resourceId, timeTrackingPolicy); - - if (timeTrackingPolicy == TimeTrackingPolicy.TRACK_TIME) { - final DoubleValueContainer doubleValueContainer = new DoubleValueContainer(0D); - personResourceTimes.put(resourceId, doubleValueContainer); - } - - final IntValueContainer intValueContainer = new IntValueContainer(0L); - personResourceValues.put(resourceId, intValueContainer); - - Set resourcePropertyIds = resourcesPluginData.getResourcePropertyIds(resourceId); - for (ResourcePropertyId resourcePropertyId : resourcePropertyIds) { - PropertyDefinition propertyDefinition = resourcesPluginData.getResourcePropertyDefinition(resourceId, resourcePropertyId); - Object resourcePropertyValue = resourcesPluginData.getResourcePropertyValue(resourceId, resourcePropertyId); - - Map defMap = resourcePropertyDefinitions.get(resourceId); - if (defMap != null) { - if (defMap.containsKey(resourcePropertyId)) { - throw new ContractException(PropertyError.DUPLICATE_PROPERTY_DEFINITION, resourcePropertyId); - } - } - - if (defMap == null) { - defMap = new LinkedHashMap<>(); - resourcePropertyDefinitions.put(resourceId, defMap); - } - - defMap.put(resourcePropertyId, propertyDefinition); - - Map map = resourcePropertyMap.get(resourceId); - if (map == null) { - map = new LinkedHashMap<>(); - resourcePropertyMap.put(resourceId, map); - } - - final PropertyValueRecord propertyValueRecord = new PropertyValueRecord(dataManagerContext); - propertyValueRecord.setPropertyValue(resourcePropertyValue); - map.put(resourcePropertyId, propertyValueRecord); - - } - - } - - // load the region resources - Set regionIds = regionsDataManager.getRegionIds(); - - for (RegionId regionId : regionIds) { - final Map map = new LinkedHashMap<>(); - regionResources.put(regionId, map); - } - - for (ResourceId resourceId : resourcesPluginData.getResourceIds()) { - for (final RegionId regionId : regionResources.keySet()) { - final Map map = regionResources.get(regionId); - map.put(resourceId, new RegionResourceRecord(dataManagerContext)); - } - } - - for (final RegionId regionId : resourcesPluginData.getRegionIds()) { - if (!regionIds.contains(regionId)) { - throw new ContractException(RegionError.UNKNOWN_REGION_ID, regionId + " is an unknown region with initial resources"); - } - - for (ResourceInitialization resourceInitialization : resourcesPluginData.getRegionResourceLevels(regionId)) { - ResourceId resourceId = resourceInitialization.getResourceId(); - Long amount = resourceInitialization.getAmount(); - final RegionResourceRecord regionResourceRecord = regionResources.get(regionId).get(resourceId); - regionResourceRecord.incrementAmount(amount); - } - - } - - for (PersonId personId : peopleDataManager.getPeople()) { - - List personResourceLevels = resourcesPluginData.getPersonResourceLevels(personId); - for (ResourceInitialization resourceInitialization : personResourceLevels) { - final Long resourceAmount = resourceInitialization.getAmount(); - if (resourceAmount > 0) { - ResourceId resourceId = resourceInitialization.getResourceId(); - personResourceValues.get(resourceId).incrementLongValue(personId.getValue(), resourceAmount); - final DoubleValueContainer doubleValueContainer = personResourceTimes.get(resourceId); - if (doubleValueContainer != null) { - doubleValueContainer.setValue(personId.getValue(), dataManagerContext.getTime()); - } - } - } - } + loadResourcePropertyDefinitions(); + loadResourcePropertyValues(); + loadResourceDefinitionTimes(); + loadPersonResourceLevels(); + loadPersonResourceTimes(); + loadRegionResourceLevels(); dataManagerContext.subscribe(RegionAdditionEvent.class, this::handleRegionAdditionEvent); dataManagerContext.subscribe(PersonImminentAdditionEvent.class, this::handlePersonAdditionEvent); @@ -873,7 +842,9 @@ private void recordSimulationState(DataManagerContext dataManagerContext) { List people = peopleDataManager.getPeople(); for (ResourceId resourceId : getResourceIds()) { - builder.addResource(resourceId); + + Double defaultResourceTime = resourceDefinitionTimes.get(resourceId); + builder.addResource(resourceId, defaultResourceTime); for (ResourcePropertyId resourcePropertyId : getResourcePropertyIds(resourceId)) { PropertyDefinition propertyDefinition = getResourcePropertyDefinition(resourceId, resourcePropertyId); builder.defineResourceProperty(resourceId, resourcePropertyId, propertyDefinition); @@ -886,65 +857,32 @@ private void recordSimulationState(DataManagerContext dataManagerContext) { } for (PersonId personId : people) { long personResourceLevel = getPersonResourceLevel(resourceId, personId); - builder.setPersonResourceLevel(personId, resourceId, personResourceLevel); + if (personResourceLevel != 0) { + builder.setPersonResourceLevel(personId, resourceId, personResourceLevel); + } } - TimeTrackingPolicy timeTrackingPolicy = getPersonResourceTimeTrackingPolicy(resourceId); - builder.setResourceTimeTracking(resourceId, timeTrackingPolicy); + boolean trackTimes = getPersonResourceTimeTrackingPolicy(resourceId); + if (trackTimes) { + for (PersonId personId : people) { + double personResourceTime = getPersonResourceTime(resourceId, personId); + if (personResourceTime != defaultResourceTime) { + builder.setPersonResourceTime(personId, resourceId, personResourceTime); + } + } + } + builder.setResourceTimeTracking(resourceId, trackTimes); } - - dataManagerContext.releaseOutput(builder.build()); - // for (final ResourceId resourceId : personResourceValues.keySet()) { - // builder.addResource(resourceId); - // builder.setResourceTimeTracking(resourceId, - // resourceTimeTrackingPolicies.get(resourceId)); - // Map map = - // resourcePropertyDefinitions.get(resourceId); - // for (ResourcePropertyId resourcePropertyId : map.keySet()) { - // PropertyDefinition propertyDefinition = map.get(resourcePropertyId); - // builder.defineResourceProperty(resourceId, resourcePropertyId, - // propertyDefinition); - // } - // } - // - // for (RegionId regionId : regionsDataManager.getRegionIds()) { - // Map map = - // regionResources.get(regionId); - // for (ResourceId resourceId : map.keySet()) { - // RegionResourceRecord regionResourceRecord = map.get(resourceId); - // builder.setRegionResourceLevel(regionId, resourceId, - // regionResourceRecord.getAmount()); - // } - // } - // - // for (PersonId personId : peopleDataManager.getPeople()) { - // for (final ResourceId resourceId : personResourceValues.keySet()) { - // long resourceLevel = - // personResourceValues.get(resourceId).getValueAsLong(personId.getValue()); - // builder.setPersonResourceLevel(personId, resourceId, resourceLevel); - // } - // } - // - // for (ResourceId resourceId : resourcePropertyMap.keySet()) { - // Map map = - // resourcePropertyMap.get(resourceId); - // for (ResourcePropertyId resourcePropertyId : map.keySet()) { - // PropertyValueRecord propertyValueRecord = - // map.get(resourcePropertyId); - // Object value = propertyValueRecord.getValue(); - // builder.setResourcePropertyValue(resourceId, resourcePropertyId, - // value); - // } - // } + dataManagerContext.releaseOutput(builder.build()); } private void handleRegionAdditionEvent(DataManagerContext dataManagerContext, RegionAdditionEvent regionAdditionEvent) { RegionId regionId = regionAdditionEvent.getRegionId(); if (!regionResources.keySet().contains(regionId)) { - Map resourceMap = new LinkedHashMap<>(); + Map resourceMap = new LinkedHashMap<>(); for (ResourceId resourceId : personResourceValues.keySet()) { - resourceMap.put(resourceId, new RegionResourceRecord(dataManagerContext)); + resourceMap.put(resourceId, new MutableLong()); } List resourceInitializations = regionAdditionEvent.getValues(ResourceInitialization.class); for (ResourceInitialization resourceInitialization : resourceInitializations) { @@ -952,8 +890,7 @@ private void handleRegionAdditionEvent(DataManagerContext dataManagerContext, Re validateResourceId(resourceId); Long amount = resourceInitialization.getAmount(); validateNonnegativeResourceAmount(amount); - RegionResourceRecord regionResourceRecord = resourceMap.get(resourceId); - regionResourceRecord.amount = amount; + resourceMap.get(resourceId).setValue(amount); } regionResources.put(regionId, resourceMap); } @@ -1002,7 +939,7 @@ private void validatePersonExists(final PersonId personId) { * Preconditions: the resource id must exist */ private void validatePersonResourceTimesTracked(final ResourceId resourceId) { - if (resourceTimeTrackingPolicies.get(resourceId) != TimeTrackingPolicy.TRACK_TIME) { + if (!personResourceTimes.containsKey(resourceId)) { throw new ContractException(ResourceError.RESOURCE_ASSIGNMENT_TIME_NOT_TRACKED); } } @@ -1091,22 +1028,22 @@ private void handleInterRegionalResourceTransferMutationEvent(DataManagerContext validateDifferentRegionsForResourceTransfer(sourceRegionId, destinationRegionId); validateRegionHasSufficientResources(resourceId, sourceRegionId, amount); - RegionResourceRecord sourceRecord = regionResources.get(sourceRegionId).get(resourceId); - RegionResourceRecord destinationRecord = regionResources.get(destinationRegionId).get(resourceId); + MutableLong sourceRecord = regionResources.get(sourceRegionId).get(resourceId); + MutableLong destinationRecord = regionResources.get(destinationRegionId).get(resourceId); - final long regionResourceLevel = regionResources.get(destinationRegionId).get(resourceId).getAmount(); + final long regionResourceLevel = regionResources.get(destinationRegionId).get(resourceId).getValue(); validateResourceAdditionValue(regionResourceLevel, amount); if (dataManagerContext.subscribersExist(RegionResourceUpdateEvent.class)) { - final long previousSourceRegionResourceLevel = sourceRecord.getAmount(); - final long previousDestinationRegionResourceLevel = destinationRecord.getAmount(); + final long previousSourceRegionResourceLevel = sourceRecord.getValue(); + final long previousDestinationRegionResourceLevel = destinationRecord.getValue(); decrementRegionResourceLevel(sourceRegionId, resourceId, amount); incrementRegionResourceLevel(destinationRegionId, resourceId, amount); - long currentSourceRegionResourceLevel = sourceRecord.getAmount(); - long currentDestinationRegionResourceLevel = destinationRecord.getAmount(); + long currentSourceRegionResourceLevel = sourceRecord.getValue(); + long currentDestinationRegionResourceLevel = destinationRecord.getValue(); dataManagerContext.releaseObservationEvent(new RegionResourceUpdateEvent(sourceRegionId, resourceId, previousSourceRegionResourceLevel, currentSourceRegionResourceLevel)); dataManagerContext.releaseObservationEvent(new RegionResourceUpdateEvent(destinationRegionId, resourceId, previousDestinationRegionResourceLevel, currentDestinationRegionResourceLevel)); } else { @@ -1134,8 +1071,7 @@ private void validateDifferentRegionsForResourceTransfer(final RegionId sourceRe * Preconditions : the region and resource must exist */ private void validateRegionHasSufficientResources(final ResourceId resourceId, final RegionId regionId, final long amount) { - RegionResourceRecord regionResourceRecord = regionResources.get(regionId).get(resourceId); - final long currentAmount = regionResourceRecord.getAmount(); + final long currentAmount = regionResources.get(regionId).get(resourceId).getValue(); if (currentAmount < amount) { throw new ContractException(ResourceError.INSUFFICIENT_RESOURCES_AVAILABLE); } @@ -1246,13 +1182,13 @@ private void handleRegionResourceUpdateMutationEvent(DataManagerContext dataMana validateNonnegativeResourceAmount(amount); if (dataManagerContext.subscribersExist(RegionResourceUpdateEvent.class)) { - final long previousResourceLevel = regionResources.get(regionId).get(resourceId).getAmount(); + final long previousResourceLevel = regionResources.get(regionId).get(resourceId).getValue(); validateResourceAdditionValue(previousResourceLevel, amount); incrementRegionResourceLevel(regionId, resourceId, amount); - long currentResourceLevel = regionResources.get(regionId).get(resourceId).getAmount(); + long currentResourceLevel = regionResources.get(regionId).get(resourceId).getValue(); dataManagerContext.releaseObservationEvent(new RegionResourceUpdateEvent(regionId, resourceId, previousResourceLevel, currentResourceLevel)); } else { - final long previousResourceLevel = regionResources.get(regionId).get(resourceId).getAmount(); + final long previousResourceLevel = regionResources.get(regionId).get(resourceId).getValue(); validateResourceAdditionValue(previousResourceLevel, amount); incrementRegionResourceLevel(regionId, resourceId, amount); } @@ -1297,9 +1233,9 @@ private void handleRegionResourceRemovalMutationEvent(DataManagerContext dataMan validateNonnegativeResourceAmount(amount); validateRegionHasSufficientResources(resourceId, regionId, amount); if (dataManagerContext.subscribersExist(RegionResourceUpdateEvent.class)) { - final long previousResourceLevel = regionResources.get(regionId).get(resourceId).getAmount(); + final long previousResourceLevel = regionResources.get(regionId).get(resourceId).getValue(); decrementRegionResourceLevel(regionId, resourceId, amount); - long currentResourceLevel = regionResources.get(regionId).get(resourceId).getAmount(); + long currentResourceLevel = regionResources.get(regionId).get(resourceId).getValue(); dataManagerContext.releaseObservationEvent(new RegionResourceUpdateEvent(regionId, resourceId, previousResourceLevel, currentResourceLevel)); } else { decrementRegionResourceLevel(regionId, resourceId, amount); @@ -1416,13 +1352,13 @@ private void handlePersonToRegionResourceTransferMutationEvent(DataManagerContex validateNonnegativeResourceAmount(amount); validatePersonHasSufficientResources(resourceId, personId, amount); final RegionId regionId = regionsDataManager.getPersonRegion(personId); - final long previousRegionResourceLevel = regionResources.get(regionId).get(resourceId).getAmount(); + final long previousRegionResourceLevel = regionResources.get(regionId).get(resourceId).getValue(); validateResourceAdditionValue(previousRegionResourceLevel, amount); final long oldLevel = personResourceValues.get(resourceId).getValueAsLong(personId.getValue()); decrementPersonResourceLevel(resourceId, personId, amount); final long newLevel = personResourceValues.get(resourceId).getValueAsLong(personId.getValue()); incrementRegionResourceLevel(regionId, resourceId, amount); - long currentRegionResourceLevel = regionResources.get(regionId).get(resourceId).getAmount(); + long currentRegionResourceLevel = regionResources.get(regionId).get(resourceId).getValue(); if (dataManagerContext.subscribersExist(PersonResourceUpdateEvent.class)) { dataManagerContext.releaseObservationEvent(new PersonResourceUpdateEvent(personId, resourceId, oldLevel, newLevel)); } @@ -1479,11 +1415,11 @@ private void handleRegionToPersonResourceTransferMutationEvent(DataManagerContex final long personResourceLevel = personResourceValues.get(resourceId).getValueAsLong(personId.getValue()); validateResourceAdditionValue(personResourceLevel, amount); - final long previousRegionResourceLevel = regionResources.get(regionId).get(resourceId).getAmount(); + final long previousRegionResourceLevel = regionResources.get(regionId).get(resourceId).getValue(); decrementRegionResourceLevel(regionId, resourceId, amount); incrementPersonResourceLevel(resourceId, personId, amount); final long newLevel = personResourceValues.get(resourceId).getValueAsLong(personId.getValue()); - long currentRegionResourceLevel = regionResources.get(regionId).get(resourceId).getAmount(); + long currentRegionResourceLevel = regionResources.get(regionId).get(resourceId).getValue(); if (dataManagerContext.subscribersExist(RegionResourceUpdateEvent.class)) { dataManagerContext.releaseObservationEvent(new RegionResourceUpdateEvent(regionId, resourceId, previousRegionResourceLevel, currentRegionResourceLevel)); diff --git a/gcm4/src/main/java/plugins/resources/events/ResourceIdAdditionEvent.java b/gcm4/src/main/java/plugins/resources/events/ResourceIdAdditionEvent.java index 328095bf8..48c1e7a2a 100644 --- a/gcm4/src/main/java/plugins/resources/events/ResourceIdAdditionEvent.java +++ b/gcm4/src/main/java/plugins/resources/events/ResourceIdAdditionEvent.java @@ -4,8 +4,6 @@ import nucleus.Event; import plugins.resources.support.ResourceError; import plugins.resources.support.ResourceId; -import plugins.util.properties.PropertyError; -import plugins.util.properties.TimeTrackingPolicy; import util.errors.ContractException; /** @@ -15,23 +13,19 @@ @Immutable public record ResourceIdAdditionEvent(ResourceId resourceId, - TimeTrackingPolicy timeTrackingPolicy) implements Event { + boolean timeTrackingPolicy) implements Event { /** * Constructs the event * * @throws ContractException
  • {@linkplain ResourceError#NULL_RESOURCE_ID} if the - * resource id is null
  • - *
  • {@linkplain PropertyError#NULL_TIME_TRACKING_POLICY} if - * the time tracking policy is null
  • + * resource id is null */ public ResourceIdAdditionEvent { if (resourceId == null) { throw new ContractException(ResourceError.NULL_RESOURCE_ID); } - if (timeTrackingPolicy == null) { - throw new ContractException(PropertyError.NULL_TIME_TRACKING_POLICY); - } + } diff --git a/gcm4/src/main/java/plugins/resources/support/ResourceError.java b/gcm4/src/main/java/plugins/resources/support/ResourceError.java index a23566d67..4618eba68 100644 --- a/gcm4/src/main/java/plugins/resources/support/ResourceError.java +++ b/gcm4/src/main/java/plugins/resources/support/ResourceError.java @@ -15,6 +15,8 @@ public enum ResourceError implements ContractError { DUPLICATE_RESOURCE_ID("Duplicate resource"), DUPLICATE_REGION_RESOURCE_LEVEL_ASSIGNMENT("Duplicate region resource level assignment"), NEGATIVE_RESOURCE_AMOUNT("Resource amount is negative"), + NULL_AMOUNT("Null amount"), + NULL_TIME("Null time"), NULL_RESOURCE_ID("Null resource id"), NULL_RESOURCE_DATA_MANAGER("Null resource data manager"), NULL_RESOURCE_PLUGIN_DATA("Null resource plugin data"), @@ -25,6 +27,9 @@ public enum ResourceError implements ContractError { REFLEXIVE_RESOURCE_TRANSFER("Cannot transfer resources from a region to itself"), RESOURCE_ARITHMETIC_EXCEPTION("Resource arithmetic resulting in underflow/overflow"), RESOURCE_ASSIGNMENT_TIME_NOT_TRACKED("Resource assignment time not actively tracked"), + RESOURCE_CREATION_TIME_EXCEEDS_SIM_TIME("Resource creation time exceeds current simulation time"), + RESOURCE_ASSIGNMENT_TIME_PRECEEDS_RESOURCE_CREATION_TIME("Resource assignment time preceeds resource creation time"), + RESOURCE_ASSIGNMENT_TIME_EXCEEDS_SIM_TIME("Resource assignment time exceeds current simulation time"), UNKNOWN_RESOURCE_ID("Unknown resource id"), ; diff --git a/gcm4/src/main/java/plugins/resources/support/ResourceInitialization.java b/gcm4/src/main/java/plugins/resources/support/ResourceInitialization.java index 0ab715108..03f838cd8 100644 --- a/gcm4/src/main/java/plugins/resources/support/ResourceInitialization.java +++ b/gcm4/src/main/java/plugins/resources/support/ResourceInitialization.java @@ -3,7 +3,7 @@ import net.jcip.annotations.Immutable; @Immutable -public class ResourceInitialization { +public final class ResourceInitialization { private final ResourceId resourceId; private final Long amount; diff --git a/gcm4/src/main/java/plugins/resources/testsupport/ResourcesTestPluginFactory.java b/gcm4/src/main/java/plugins/resources/testsupport/ResourcesTestPluginFactory.java index a4e5b1486..070e34276 100644 --- a/gcm4/src/main/java/plugins/resources/testsupport/ResourcesTestPluginFactory.java +++ b/gcm4/src/main/java/plugins/resources/testsupport/ResourcesTestPluginFactory.java @@ -390,7 +390,7 @@ public static ResourcesPluginData getStandardResourcesPluginData(long seed) { ResourcesPluginData.Builder resourcesBuilder = ResourcesPluginData.builder(); for (TestResourceId testResourceId : TestResourceId.values()) { - resourcesBuilder.addResource(testResourceId); + resourcesBuilder.addResource(testResourceId, 0.0); resourcesBuilder.setResourceTimeTracking(testResourceId, testResourceId.getTimeTrackingPolicy()); } diff --git a/gcm4/src/main/java/plugins/resources/testsupport/TestResourceId.java b/gcm4/src/main/java/plugins/resources/testsupport/TestResourceId.java index fbca9c4f9..417dcde4a 100644 --- a/gcm4/src/main/java/plugins/resources/testsupport/TestResourceId.java +++ b/gcm4/src/main/java/plugins/resources/testsupport/TestResourceId.java @@ -3,26 +3,25 @@ import org.apache.commons.math3.random.RandomGenerator; import plugins.resources.support.ResourceId; -import plugins.util.properties.TimeTrackingPolicy; /** * Enumeration that identifies resources for all tests */ public enum TestResourceId implements ResourceId { - RESOURCE_1(TimeTrackingPolicy.TRACK_TIME), - RESOURCE_2(TimeTrackingPolicy.DO_NOT_TRACK_TIME), - RESOURCE_3(TimeTrackingPolicy.TRACK_TIME), - RESOURCE_4(TimeTrackingPolicy.DO_NOT_TRACK_TIME), - RESOURCE_5(TimeTrackingPolicy.TRACK_TIME); + RESOURCE_1(true), + RESOURCE_2(false), + RESOURCE_3(true), + RESOURCE_4(false), + RESOURCE_5(true); - private final TimeTrackingPolicy timeTrackingPolicy; + private final boolean timeTrackingPolicy; - private TestResourceId(TimeTrackingPolicy timeTrackingPolicy) { + private TestResourceId(boolean timeTrackingPolicy) { this.timeTrackingPolicy = timeTrackingPolicy; } - public TimeTrackingPolicy getTimeTrackingPolicy() { + public boolean getTimeTrackingPolicy() { return timeTrackingPolicy; } diff --git a/gcm4/src/test/java/plugins/materials/datamanagers/AT_MaterialsDataManager.java b/gcm4/src/test/java/plugins/materials/datamanagers/AT_MaterialsDataManager.java index f7a99ab97..9d789c4a8 100644 --- a/gcm4/src/test/java/plugins/materials/datamanagers/AT_MaterialsDataManager.java +++ b/gcm4/src/test/java/plugins/materials/datamanagers/AT_MaterialsDataManager.java @@ -76,7 +76,6 @@ import plugins.stochastics.StochasticsDataManager; import plugins.util.properties.PropertyDefinition; import plugins.util.properties.PropertyError; -import plugins.util.properties.TimeTrackingPolicy; import util.annotations.UnitTestConstructor; import util.annotations.UnitTestMethod; import util.errors.ContractException; @@ -4602,7 +4601,7 @@ public void testResourceIdAddition() { Factory factory = MaterialsTestPluginFactory.factory(0, 0, 0, 7336173642619419311L, (c) -> { ResourceId newResourceId = TestResourceId.getUnknownResourceId(); ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - resourcesDataManager.addResourceId(newResourceId, TimeTrackingPolicy.TRACK_TIME); + resourcesDataManager.addResourceId(newResourceId, true); MaterialsDataManager materialsDataManager = c.getDataManager(MaterialsDataManager.class); Set materialsProducerIds = materialsDataManager.getMaterialsProducerIds(); diff --git a/gcm4/src/test/java/plugins/materials/reports/AT_MaterialsProducerResourceReport.java b/gcm4/src/test/java/plugins/materials/reports/AT_MaterialsProducerResourceReport.java index dc85cf928..e27dc70ff 100644 --- a/gcm4/src/test/java/plugins/materials/reports/AT_MaterialsProducerResourceReport.java +++ b/gcm4/src/test/java/plugins/materials/reports/AT_MaterialsProducerResourceReport.java @@ -36,7 +36,6 @@ import plugins.resources.support.ResourceId; import plugins.resources.testsupport.TestResourceId; import plugins.stochastics.StochasticsDataManager; -import plugins.util.properties.TimeTrackingPolicy; import util.annotations.UnitTag; import util.annotations.UnitTestConstructor; import util.annotations.UnitTestMethod; @@ -86,7 +85,7 @@ public void testInit() { ResourceId newResourceId = TestResourceId.getUnknownResourceId(); ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - resourcesDataManager.addResourceId(newResourceId, TimeTrackingPolicy.TRACK_TIME); + resourcesDataManager.addResourceId(newResourceId, true); for (TestMaterialsProducerId testMaterialsProducerId : TestMaterialsProducerId.values()) { expectedReportItems.put(getReportItemFromResourceId(c, testMaterialsProducerId, newResourceId, 0L), 1); @@ -182,7 +181,7 @@ public void testInit_State() { pluginBuilder.addTestActorPlan("actor", new TestActorPlan(actionTime++, (c) -> { ResourceId newResourceId = TestResourceId.getUnknownResourceId(); ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - resourcesDataManager.addResourceId(newResourceId, TimeTrackingPolicy.TRACK_TIME); + resourcesDataManager.addResourceId(newResourceId, true); })); // add a new materials producer just before time 20 diff --git a/gcm4/src/test/java/plugins/materials/testsupport/AT_MaterialsTestPluginFactory.java b/gcm4/src/test/java/plugins/materials/testsupport/AT_MaterialsTestPluginFactory.java index 8454bf6ed..8b89fed1e 100644 --- a/gcm4/src/test/java/plugins/materials/testsupport/AT_MaterialsTestPluginFactory.java +++ b/gcm4/src/test/java/plugins/materials/testsupport/AT_MaterialsTestPluginFactory.java @@ -61,7 +61,6 @@ import plugins.stochastics.support.WellState; import plugins.stochastics.testsupport.TestRandomGeneratorId; import plugins.util.properties.PropertyDefinition; -import plugins.util.properties.TimeTrackingPolicy; import util.annotations.UnitTestMethod; import util.errors.ContractException; import util.random.RandomGeneratorProvider; @@ -441,8 +440,8 @@ public void testGetStandardResourcesPluginData() { assertEquals(expectedResourceIds, actualResourceIds); for (TestResourceId resourceId : TestResourceId.values()) { - TimeTrackingPolicy expectedPolicy = resourceId.getTimeTrackingPolicy(); - TimeTrackingPolicy actualPolicy = resourcesPluginData.getPersonResourceTimeTrackingPolicy(resourceId); + boolean expectedPolicy = resourceId.getTimeTrackingPolicy(); + boolean actualPolicy = resourcesPluginData.getResourceTimeTrackingPolicy(resourceId); assertEquals(expectedPolicy, actualPolicy); } diff --git a/gcm4/src/test/java/plugins/resources/AT_ResourcesPluginData.java b/gcm4/src/test/java/plugins/resources/AT_ResourcesPluginData.java index 7c6973b83..a21d49b7f 100644 --- a/gcm4/src/test/java/plugins/resources/AT_ResourcesPluginData.java +++ b/gcm4/src/test/java/plugins/resources/AT_ResourcesPluginData.java @@ -1,6 +1,7 @@ package plugins.resources; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -28,7 +29,6 @@ import plugins.resources.testsupport.TestResourcePropertyId; import plugins.util.properties.PropertyDefinition; import plugins.util.properties.PropertyError; -import plugins.util.properties.TimeTrackingPolicy; import util.annotations.UnitTestMethod; import util.errors.ContractException; import util.random.RandomGeneratorProvider; @@ -37,6 +37,292 @@ public final class AT_ResourcesPluginData { + @Test + @UnitTestMethod(target = ResourcesPluginData.class, name = "getPersonResourceTimes", args = { ResourceId.class }) + public void testGetPersonResourceTimes() { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(2121375123528875466L); + + // add the resources + ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); + for (TestResourceId testResourceId : TestResourceId.values()) { + builder.addResource(testResourceId, 0.0); + } + + Set expectedValues = new LinkedHashSet<>(); + + // add up to 30 people + Set people = new LinkedHashSet<>(); + int id = 0; + for (int i = 0; i < 30; i++) { + id += randomGenerator.nextInt(3) + 1; + people.add(new PersonId(id)); + } + assertTrue(people.size() > 20); + for (PersonId personId : people) { + for (TestResourceId testResourceId : TestResourceId.values()) { + if (randomGenerator.nextBoolean()) { + long amount = randomGenerator.nextInt(10); + double time = randomGenerator.nextDouble(); + builder.setPersonResourceLevel(personId, testResourceId, amount); + builder.setPersonResourceTime(personId, testResourceId, time); + MultiKey multiKey = new MultiKey(personId, testResourceId, time); + expectedValues.add(multiKey); + } + } + } + + ResourcesPluginData resourceInitialData = builder.build(); + + Set actualValues = new LinkedHashSet<>(); + for (TestResourceId testResourceId : TestResourceId.values()) { + List personResourceTimes = resourceInitialData.getPersonResourceTimes(testResourceId); + for (int i = 0; i < personResourceTimes.size(); i++) { + Double time = personResourceTimes.get(i); + if (time != null) { + MultiKey multiKey = new MultiKey(new PersonId(i), testResourceId, time); + actualValues.add(multiKey); + } + } + } + + assertEquals(expectedValues, actualValues); + + // precondition test: if the person id is null + ContractException contractException = assertThrows(ContractException.class, () -> resourceInitialData.getPersonResourceTimes(null)); + assertEquals(ResourceError.NULL_RESOURCE_ID, contractException.getErrorType()); + } + + @Test + @UnitTestMethod(target = ResourcesPluginData.class, name = "getResourceDefaultTime", args = { ResourceId.class }) + public void testGetResourceDefaultTime() { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(9133618222677631125L); + Set expectedValues = new LinkedHashSet<>(); + // add the resources + ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); + for (TestResourceId testResourceId : TestResourceId.values()) { + double time = randomGenerator.nextDouble(); + builder.addResource(testResourceId, time); + expectedValues.add(new MultiKey(testResourceId, time)); + } + + ResourcesPluginData resourceInitialData = builder.build(); + + Set actualValues = new LinkedHashSet<>(); + for (ResourceId resourceId : resourceInitialData.getResourceIds()) { + Double time = resourceInitialData.getResourceDefaultTime(resourceId); + actualValues.add(new MultiKey(resourceId, time)); + } + + assertEquals(expectedValues, actualValues); + + // precondition test: if the person id is null + ContractException contractException = assertThrows(ContractException.class, () -> resourceInitialData.getResourceDefaultTime(null)); + assertEquals(ResourceError.NULL_RESOURCE_ID, contractException.getErrorType()); + + } + + @Test + @UnitTestMethod(target = ResourcesPluginData.class, name = "hashCode", args = {}) + public void testHashCode() { + + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(7567353570953948981L); + + // equal objects have equal hash codes + for (int i = 0; i < 10; i++) { + long seed = randomGenerator.nextLong(); + ResourcesPluginData rpd1 = getRandomResourcesPluginData(seed); + ResourcesPluginData rpd2 = getRandomResourcesPluginData(seed); + + assertEquals(rpd1, rpd2); + assertEquals(rpd1.hashCode(), rpd2.hashCode()); + } + int count = 100; + Set hashCodes = new LinkedHashSet<>(); + for(int i = 0;iminimumCount); + } + + /* + * Returns a randomly generated resources plugin data + */ + private ResourcesPluginData getRandomResourcesPluginData(long seed) { + // equal objects have equal hashCodes + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(seed); + ResourcesPluginData.Builder pluginDataBuilder = ResourcesPluginData.builder(); + + Set selectedTestResourceIds = new LinkedHashSet<>(); + for (TestResourceId testResourceId : TestResourceId.values()) { + if (randomGenerator.nextDouble() < 0.8) { + selectedTestResourceIds.add(testResourceId); + } + } + + for (TestResourceId testResourceId : selectedTestResourceIds) { + boolean timeTrackingPolicy = randomGenerator.nextBoolean(); + pluginDataBuilder.setResourceTimeTracking(testResourceId, timeTrackingPolicy); + } + + for (TestResourceId testResourceId : selectedTestResourceIds) { + double time = randomGenerator.nextDouble(); + pluginDataBuilder.addResource(testResourceId, time); + } + + Set selectedTestResourcePropertyIds = new LinkedHashSet<>(); + for (TestResourcePropertyId testResourcePropertyId : TestResourcePropertyId.values()) { + TestResourceId testResourceId = testResourcePropertyId.getTestResourceId(); + if (selectedTestResourceIds.contains(testResourceId)) { + if (randomGenerator.nextDouble() < 0.8) { + selectedTestResourcePropertyIds.add(testResourcePropertyId); + } + } + } + + for (TestResourcePropertyId testResourcePropertyId : selectedTestResourcePropertyIds) { + pluginDataBuilder.defineResourceProperty(testResourcePropertyId.getTestResourceId(), testResourcePropertyId, testResourcePropertyId.getPropertyDefinition()); + } + + for (TestResourcePropertyId testResourcePropertyId : selectedTestResourcePropertyIds) { + if (randomGenerator.nextBoolean()) { + pluginDataBuilder.setResourcePropertyValue(testResourcePropertyId.getTestResourceId(), testResourcePropertyId, testResourcePropertyId.getRandomPropertyValue(randomGenerator)); + } + } + Set selectedRegionIds = new LinkedHashSet<>(); + + for (TestRegionId testRegionId : TestRegionId.values()) { + if(randomGenerator.nextDouble()<0.8) { + selectedRegionIds.add(testRegionId); + } + } + + for (TestRegionId testRegionId : selectedRegionIds) { + for (TestResourceId testResourceId : selectedTestResourceIds) { + if (randomGenerator.nextBoolean()) { + long value = randomGenerator.nextInt(1000); + pluginDataBuilder.setRegionResourceLevel(testRegionId, testResourceId, value); + } + } + } + + int personCount = randomGenerator.nextInt(5)+5; + + for (int i = 0; i < personCount; i++) { + PersonId personId = new PersonId(i * i); + for (TestResourceId testResourceId : selectedTestResourceIds) { + if (randomGenerator.nextBoolean()) { + long value = randomGenerator.nextInt(5); + pluginDataBuilder.setPersonResourceLevel(personId, testResourceId, value); + } + if (randomGenerator.nextBoolean()) { + double time = randomGenerator.nextDouble() + 1.0; + pluginDataBuilder.setPersonResourceTime(personId, testResourceId, time); + } + } + } + + return pluginDataBuilder.build(); + } + + @Test + @UnitTestMethod(target = ResourcesPluginData.class, name = "equals", args = { Object.class }) + public void testEquals() { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(1110078478105073449L); + + //null equality + for (int i = 0; i < 10; i++) { + long seed = randomGenerator.nextLong(); + ResourcesPluginData rpd = getRandomResourcesPluginData(seed); + assertFalse(rpd.equals(null)); + } + + // reflexivity + for (int i = 0; i < 10; i++) { + long seed = randomGenerator.nextLong(); + ResourcesPluginData rpd = getRandomResourcesPluginData(seed); + assertEquals(rpd, rpd); + } + + // symmetry + for (int i = 0; i < 10; i++) { + long seed = randomGenerator.nextLong(); + ResourcesPluginData rpd1 = getRandomResourcesPluginData(seed); + ResourcesPluginData rpd2 = getRandomResourcesPluginData(seed); + assertEquals(rpd1, rpd2); + assertEquals(rpd2, rpd1); + } + + // transitivity -- implied by symmetry + + + } + + @Test + @UnitTestMethod(target = ResourcesPluginData.class, name = "setPersonResourceTime", args = { PersonId.class, ResourceId.class, Double.class }) + public void testSetPersonResourceTime() { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(2121375123528875466L); + + // add the resources + ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); + for (TestResourceId testResourceId : TestResourceId.values()) { + builder.addResource(testResourceId, 0.0); + } + + Set expectedValues = new LinkedHashSet<>(); + + // add up to 30 people + Set people = new LinkedHashSet<>(); + int id = 0; + for (int i = 0; i < 30; i++) { + id += randomGenerator.nextInt(3) + 1; + people.add(new PersonId(id)); + } + assertTrue(people.size() > 20); + for (PersonId personId : people) { + for (TestResourceId testResourceId : TestResourceId.values()) { + if (randomGenerator.nextBoolean()) { + long amount = randomGenerator.nextInt(10); + double time = randomGenerator.nextDouble(); + builder.setPersonResourceLevel(personId, testResourceId, amount); + builder.setPersonResourceTime(personId, testResourceId, time); + MultiKey multiKey = new MultiKey(personId, testResourceId, time); + expectedValues.add(multiKey); + } + } + } + + ResourcesPluginData resourceInitialData = builder.build(); + + Set actualValues = new LinkedHashSet<>(); + for (TestResourceId testResourceId : TestResourceId.values()) { + List personResourceTimes = resourceInitialData.getPersonResourceTimes(testResourceId); + for (int i = 0; i < personResourceTimes.size(); i++) { + Double time = personResourceTimes.get(i); + if (time != null) { + MultiKey multiKey = new MultiKey(new PersonId(i), testResourceId, time); + actualValues.add(multiKey); + } + } + } + + assertEquals(expectedValues, actualValues); + + // precondition test: if the person id is null + ContractException contractException = assertThrows(ContractException.class, () -> ResourcesPluginData.builder().setPersonResourceTime(null, TestResourceId.RESOURCE_1, 0.0)); + assertEquals(PersonError.NULL_PERSON_ID, contractException.getErrorType()); + + // precondition test: if the resource id is null + contractException = assertThrows(ContractException.class, () -> ResourcesPluginData.builder().setPersonResourceTime(new PersonId(0), null, 0.0)); + assertEquals(ResourceError.NULL_RESOURCE_ID, contractException.getErrorType()); + + // precondition test: if the time is null + contractException = assertThrows(ContractException.class, () -> ResourcesPluginData.builder().setPersonResourceTime(new PersonId(0), TestResourceId.RESOURCE_1, null)); + assertEquals(ResourceError.NULL_TIME, contractException.getErrorType()); + } + @Test @UnitTestMethod(target = ResourcesPluginData.class, name = "builder", args = {}) public void testBuilder() { @@ -94,7 +380,7 @@ public void testBuild() { ResourcePropertyId resourcePropertyId = TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE; Boolean value = false; ResourcesPluginData .builder()// - .addResource(resourceId)// + .addResource(resourceId, 0.0)// .setResourcePropertyValue(resourceId, resourcePropertyId, value)// .build();// });// @@ -111,7 +397,7 @@ public void testBuild() { PropertyDefinition propertyDefinition = TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE.getPropertyDefinition(); Integer value = 5; ResourcesPluginData .builder()// - .addResource(resourceId)// + .addResource(resourceId, 0.0)// .defineResourceProperty(resourceId, resourcePropertyId, propertyDefinition)// .setResourcePropertyValue(resourceId, resourcePropertyId, value)// .build(); @@ -127,7 +413,7 @@ public void testBuild() { ResourcePropertyId resourcePropertyId = TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE; PropertyDefinition propertyDefinition = PropertyDefinition.builder().setType(Boolean.class).build(); ResourcesPluginData .builder()// - .addResource(resourceId)// + .addResource(resourceId, 0.0)// .defineResourceProperty(resourceId, resourcePropertyId, propertyDefinition)// .build(); });// @@ -157,7 +443,7 @@ public void testBuild() { } @Test - @UnitTestMethod(target = ResourcesPluginData.Builder.class, name = "addResource", args = { ResourceId.class }) + @UnitTestMethod(target = ResourcesPluginData.Builder.class, name = "addResource", args = { ResourceId.class, Double.class }) public void testAddResource() { ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); @@ -165,9 +451,9 @@ public void testAddResource() { for (TestResourceId testResourceId : TestResourceId.values()) { // replacing data to show that the value persists - builder.addResource(testResourceId); + builder.addResource(testResourceId, 0.0); // adding duplicate data to show that the value persists - builder.addResource(testResourceId); + builder.addResource(testResourceId, 0.0); expectedResourceIds.add(testResourceId); } ResourcesPluginData resourceInitialData = builder.build(); @@ -176,7 +462,7 @@ public void testAddResource() { // precondition tests // if the resource id is null - ContractException contractException = assertThrows(ContractException.class, () -> ResourcesPluginData.builder().addResource(null)); + ContractException contractException = assertThrows(ContractException.class, () -> ResourcesPluginData.builder().addResource(null, 0.0)); assertEquals(ResourceError.NULL_RESOURCE_ID, contractException.getErrorType()); } @@ -187,7 +473,7 @@ public void testDefineResourceProperty() { ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); for (TestResourceId testResourceId : TestResourceId.values()) { - builder.addResource(testResourceId); + builder.addResource(testResourceId, 0.0); Set testResourcePropertyIds = TestResourcePropertyId.getTestResourcePropertyIds(testResourceId); for (TestResourcePropertyId testResourcePropertyId : testResourcePropertyIds) { PropertyDefinition propertyDefinition = testResourcePropertyId.getPropertyDefinition(); @@ -245,7 +531,7 @@ public void testSetPersonResourceLevel() { // add the resources ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); for (TestResourceId testResourceId : TestResourceId.values()) { - builder.addResource(testResourceId); + builder.addResource(testResourceId, 0.0); } Set expectedValues = new LinkedHashSet<>(); @@ -277,13 +563,14 @@ public void testSetPersonResourceLevel() { ResourcesPluginData resourceInitialData = builder.build(); Set actualValues = new LinkedHashSet<>(); - for (PersonId personId : people) { - List personResourceLevels = resourceInitialData.getPersonResourceLevels(personId); - for (ResourceInitialization resourceInitialization : personResourceLevels) { - ResourceId resourceId = resourceInitialization.getResourceId(); - Long amount = resourceInitialization.getAmount(); - MultiKey multiKey = new MultiKey(personId, resourceId, amount); - actualValues.add(multiKey); + for (TestResourceId testResourceId : TestResourceId.values()) { + List personResourceLevels = resourceInitialData.getPersonResourceLevels(testResourceId); + for (int i = 0; i < personResourceLevels.size(); i++) { + Long amount = personResourceLevels.get(i); + if (amount != null) { + MultiKey multiKey = new MultiKey(new PersonId(i), testResourceId, amount); + actualValues.add(multiKey); + } } } @@ -316,7 +603,7 @@ public void testSetRegionResourceLevel() { // add the resources ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); for (TestResourceId testResourceId : TestResourceId.values()) { - builder.addResource(testResourceId); + builder.addResource(testResourceId, 0.0); } Map expectedValues = new LinkedHashMap<>(); @@ -386,7 +673,7 @@ public void testSetResourcePropertyValue() { ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); for (TestResourceId testResourceId : TestResourceId.values()) { - builder.addResource(testResourceId); + builder.addResource(testResourceId, 0.0); Set testResourcePropertyIds = TestResourcePropertyId.getTestResourcePropertyIds(testResourceId); for (TestResourcePropertyId testResourcePropertyId : testResourcePropertyIds) { MultiKey multiKey = new MultiKey(testResourceId, testResourcePropertyId); @@ -440,19 +727,19 @@ public void testSetResourcePropertyValue() { } @Test - @UnitTestMethod(target = ResourcesPluginData.Builder.class, name = "setResourceTimeTracking", args = { ResourceId.class, TimeTrackingPolicy.class }) + @UnitTestMethod(target = ResourcesPluginData.Builder.class, name = "setResourceTimeTracking", args = { ResourceId.class, boolean.class }) public void testSetResourceTimeTracking() { RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(9113503089361379130L); - Map expectedValues = new LinkedHashMap<>(); + Map expectedValues = new LinkedHashMap<>(); ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); for (TestResourceId testResourceId : TestResourceId.values()) { if (testResourceId != TestResourceId.RESOURCE_5) { - builder.addResource(testResourceId); - TimeTrackingPolicy timeTrackingPolicy = TimeTrackingPolicy.getRandomTimeTrackingPolicy(randomGenerator); - TimeTrackingPolicy timeTrackingPolicy2 = timeTrackingPolicy.next(); + builder.addResource(testResourceId, 0.0); + boolean timeTrackingPolicy = randomGenerator.nextBoolean(); + boolean timeTrackingPolicy2 = !timeTrackingPolicy; builder.setResourceTimeTracking(testResourceId, timeTrackingPolicy2); // replacing data to show that the value persists builder.setResourceTimeTracking(testResourceId, timeTrackingPolicy); @@ -461,29 +748,23 @@ public void testSetResourceTimeTracking() { expectedValues.put(testResourceId, timeTrackingPolicy); } } - builder.addResource(TestResourceId.RESOURCE_5); - expectedValues.put(TestResourceId.RESOURCE_5, TimeTrackingPolicy.DO_NOT_TRACK_TIME); + builder.addResource(TestResourceId.RESOURCE_5, 0.0); + expectedValues.put(TestResourceId.RESOURCE_5, false); ResourcesPluginData resourceInitialData = builder.build(); for (TestResourceId testResourceId : TestResourceId.values()) { - TimeTrackingPolicy expectedPolicy = expectedValues.get(testResourceId); - TimeTrackingPolicy actualPolicy = resourceInitialData.getPersonResourceTimeTrackingPolicy(testResourceId); + boolean expectedPolicy = expectedValues.get(testResourceId); + boolean actualPolicy = resourceInitialData.getResourceTimeTrackingPolicy(testResourceId); assertEquals(expectedPolicy, actualPolicy); } - // precondition tests - ResourceId resourceId = TestResourceId.RESOURCE_2; - TimeTrackingPolicy timeTrackingPolicy = TimeTrackingPolicy.TRACK_TIME; - - // if the resource id is null - // ResourceError#NULL_RESOURCE_ID - ContractException contractException = assertThrows(ContractException.class, () -> builder.setResourceTimeTracking(null, timeTrackingPolicy)); + /* + * precondition test: if the resource id is null + * ResourceError#NULL_RESOURCE_ID + */ + ContractException contractException = assertThrows(ContractException.class, () -> builder.setResourceTimeTracking(null, true)); assertEquals(ResourceError.NULL_RESOURCE_ID, contractException.getErrorType()); - // if the tracking policy is null - // ResourceError.NULL_TIME_TRACKING_POLICY - contractException = assertThrows(ContractException.class, () -> builder.setResourceTimeTracking(resourceId, null)); - assertEquals(ResourceError.NULL_TIME_TRACKING_POLICY, contractException.getErrorType()); } @Test @@ -493,7 +774,7 @@ public void testGetResourcePropertyDefinition() { ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); for (TestResourceId testResourceId : TestResourceId.values()) { - builder.addResource(testResourceId); + builder.addResource(testResourceId, 0.0); Set testResourcePropertyIds = TestResourcePropertyId.getTestResourcePropertyIds(testResourceId); for (TestResourcePropertyId testResourcePropertyId : testResourcePropertyIds) { PropertyDefinition propertyDefinition = testResourcePropertyId.getPropertyDefinition(); @@ -504,7 +785,7 @@ public void testGetResourcePropertyDefinition() { ResourcesPluginData resourceInitialData = builder.build(); for (TestResourceId testResourceId : TestResourceId.values()) { - builder.addResource(testResourceId); + builder.addResource(testResourceId, 0.0); Set testResourcePropertyIds = TestResourcePropertyId.getTestResourcePropertyIds(testResourceId); for (TestResourcePropertyId testResourcePropertyId : testResourcePropertyIds) { PropertyDefinition expectedPropertyDefinition = testResourcePropertyId.getPropertyDefinition(); @@ -552,7 +833,7 @@ public void testGetResourcePropertyIds() { // 7475098698397765251L ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); for (TestResourceId testResourceId : TestResourceId.values()) { - builder.addResource(testResourceId); + builder.addResource(testResourceId, 0.0); Set testResourcePropertyIds = TestResourcePropertyId.getTestResourcePropertyIds(testResourceId); for (TestResourcePropertyId testResourcePropertyId : testResourcePropertyIds) { PropertyDefinition propertyDefinition = testResourcePropertyId.getPropertyDefinition(); @@ -591,7 +872,7 @@ public void testGetResourcePropertyValue() { ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); for (TestResourceId testResourceId : TestResourceId.values()) { - builder.addResource(testResourceId); + builder.addResource(testResourceId, 0.0); Set testResourcePropertyIds = TestResourcePropertyId.getTestResourcePropertyIds(testResourceId); for (TestResourcePropertyId testResourcePropertyId : testResourcePropertyIds) { MultiKey multiKey = new MultiKey(testResourceId, testResourcePropertyId); @@ -645,7 +926,7 @@ public void testGetResourcePropertyValue() { } @Test - @UnitTestMethod(target = ResourcesPluginData.class, name = "getPersonResourceLevels", args = { PersonId.class }) + @UnitTestMethod(target = ResourcesPluginData.class, name = "getPersonResourceLevels", args = { ResourceId.class }) public void testGetPersonResourceLevels() { RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(2902745806851600371L); @@ -653,7 +934,7 @@ public void testGetPersonResourceLevels() { // add the resources ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); for (TestResourceId testResourceId : TestResourceId.values()) { - builder.addResource(testResourceId); + builder.addResource(testResourceId, 0.0); } Set expectedValues = new LinkedHashSet<>(); @@ -681,13 +962,14 @@ public void testGetPersonResourceLevels() { ResourcesPluginData resourceInitialData = builder.build(); Set actualValues = new LinkedHashSet<>(); - for (PersonId personId : people) { - List personResourceLevels = resourceInitialData.getPersonResourceLevels(personId); - for (ResourceInitialization resourceInitialization : personResourceLevels) { - ResourceId resourceId = resourceInitialization.getResourceId(); - Long amount = resourceInitialization.getAmount(); - MultiKey multiKey = new MultiKey(personId, resourceId, amount); - actualValues.add(multiKey); + for (TestResourceId testResourceId : TestResourceId.values()) { + List personResourceLevels = resourceInitialData.getPersonResourceLevels(testResourceId); + for (int i = 0; i < personResourceLevels.size(); i++) { + Long amount = personResourceLevels.get(i); + if (amount != null) { + MultiKey multiKey = new MultiKey(new PersonId(i), testResourceId, amount); + actualValues.add(multiKey); + } } } @@ -695,7 +977,7 @@ public void testGetPersonResourceLevels() { // precondition test: if the person id is null ContractException contractException = assertThrows(ContractException.class, () -> resourceInitialData.getPersonResourceLevels(null)); - assertEquals(PersonError.NULL_PERSON_ID, contractException.getErrorType()); + assertEquals(ResourceError.NULL_RESOURCE_ID, contractException.getErrorType()); } @@ -706,7 +988,7 @@ public void testGetResourceIds() { ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); Set expectedResourceIds = new LinkedHashSet<>(); for (TestResourceId testResourceId : TestResourceId.values()) { - builder.addResource(testResourceId); + builder.addResource(testResourceId, 0.0); expectedResourceIds.add(testResourceId); } ResourcesPluginData resourceInitialData = builder.build(); @@ -716,14 +998,14 @@ public void testGetResourceIds() { @Test @UnitTestMethod(target = ResourcesPluginData.class, name = "getRegionResourceLevels", args = { RegionId.class }) - public void testGetRegionResourceLevel() { + public void testGetRegionResourceLevels() { RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(6794457915874374469L); // add the resources ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); for (TestResourceId testResourceId : TestResourceId.values()) { - builder.addResource(testResourceId); + builder.addResource(testResourceId, 0.0); } Map expectedValues = new LinkedHashMap<>(); @@ -776,7 +1058,7 @@ public void testGetPersonResourceTimeTrackingPolicy() { ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); for (TestResourceId testResourceId : TestResourceId.values()) { - builder.addResource(testResourceId); + builder.addResource(testResourceId, 0.0); Set testResourcePropertyIds = TestResourcePropertyId.getTestResourcePropertyIds(testResourceId); for (TestResourcePropertyId testResourcePropertyId : testResourcePropertyIds) { MultiKey multiKey = new MultiKey(testResourceId, testResourcePropertyId); @@ -821,53 +1103,6 @@ public void testGetPersonResourceTimeTrackingPolicy() { } - @Test - @UnitTestMethod(target = ResourcesPluginData.class, name = "getPersonCount", args = {}) - public void testGetPersonCount() { - - RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(1188005474782684784L); - - // add the resources - ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); - for (TestResourceId testResourceId : TestResourceId.values()) { - builder.addResource(testResourceId); - } - - Map expectedValues = new LinkedHashMap<>(); - - // add up to 30 people - Set people = new LinkedHashSet<>(); - int id = 0; - for (int i = 0; i < 30; i++) { - id += randomGenerator.nextInt(3) + 1; - people.add(new PersonId(id)); - } - assertTrue(people.size() > 20); - - Set expectedPeople = new LinkedHashSet<>(); - - int expectedPersonCount = 0; - for (PersonId personId : people) { - for (TestResourceId testResourceId : TestResourceId.values()) { - MultiKey multiKey = new MultiKey(personId, testResourceId); - MutableInteger mutableInteger = new MutableInteger(); - expectedValues.put(multiKey, mutableInteger); - if (randomGenerator.nextBoolean()) { - int amount = randomGenerator.nextInt(10); - builder.setPersonResourceLevel(personId, testResourceId, amount); - expectedPersonCount = personId.getValue() + 1; - expectedPeople.add(personId); - mutableInteger.setValue(amount); - } - } - } - - ResourcesPluginData resourceInitialData = builder.build(); - - assertEquals(expectedPersonCount, resourceInitialData.getPersonCount()); - - } - @Test @UnitTestMethod(target = ResourcesPluginData.class, name = "getRegionIds", args = {}) public void testGetRegionIds() { @@ -877,7 +1112,7 @@ public void testGetRegionIds() { // add the resources ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); for (TestResourceId testResourceId : TestResourceId.values()) { - builder.addResource(testResourceId); + builder.addResource(testResourceId, 0.0); } Set expectedRegionIds = new LinkedHashSet<>(); @@ -900,19 +1135,21 @@ public void testGetRegionIds() { @Test @UnitTestMethod(target = ResourcesPluginData.class, name = "getCloneBuilder", args = {}) public void testGetCloneBuilder() { + RandomGenerator randomGenerator = RandomGeneratorProvider.getRandomGenerator(7644775230297230691L); ResourcesPluginData.Builder pluginDataBuilder = ResourcesPluginData.builder(); for (TestResourceId testResourceId : TestResourceId.values()) { - TimeTrackingPolicy timeTrackingPolicy = TimeTrackingPolicy.DO_NOT_TRACK_TIME; + boolean timeTrackingPolicy = false; if (randomGenerator.nextBoolean()) { - timeTrackingPolicy = TimeTrackingPolicy.TRACK_TIME; + timeTrackingPolicy = true; } pluginDataBuilder.setResourceTimeTracking(testResourceId, timeTrackingPolicy); } for (TestResourceId testResourceId : TestResourceId.values()) { - pluginDataBuilder.addResource(testResourceId); + double time = randomGenerator.nextDouble(); + pluginDataBuilder.addResource(testResourceId, time); } for (TestResourcePropertyId testResourcePropertyId : TestResourcePropertyId.values()) { pluginDataBuilder.defineResourceProperty(testResourcePropertyId.getTestResourceId(), testResourcePropertyId, testResourcePropertyId.getPropertyDefinition()); @@ -938,7 +1175,9 @@ public void testGetCloneBuilder() { for (TestResourceId testResourceId : TestResourceId.values()) { if (randomGenerator.nextBoolean()) { long value = randomGenerator.nextInt(5); + double time = randomGenerator.nextDouble() + 1.0; pluginDataBuilder.setPersonResourceLevel(personId, testResourceId, value); + pluginDataBuilder.setPersonResourceTime(personId, testResourceId, time); } } } @@ -952,53 +1191,7 @@ public void testGetCloneBuilder() { ResourcesPluginData cloneResourcesPluginData = (ResourcesPluginData) pluginData; - assertEquals(resourcesPluginData.getResourceIds(), cloneResourcesPluginData.getResourceIds()); - - assertEquals(resourcesPluginData.getPersonCount(), cloneResourcesPluginData.getPersonCount()); - - for (int i = 0; i < resourcesPluginData.getPersonCount(); i++) { - PersonId personId = new PersonId(i); - List expectedLevels = resourcesPluginData.getPersonResourceLevels(personId); - List actualLevels = cloneResourcesPluginData.getPersonResourceLevels(personId); - assertEquals(expectedLevels.size(), actualLevels.size()); - - Set expectedSet = new LinkedHashSet<>(expectedLevels); - Set actualSet = new LinkedHashSet<>(actualLevels); - assertEquals(expectedSet, actualSet); - } - - for (ResourceId resourceId : resourcesPluginData.getResourceIds()) { - TimeTrackingPolicy expectedPolicy = resourcesPluginData.getPersonResourceTimeTrackingPolicy(resourceId); - TimeTrackingPolicy actualPolicy = cloneResourcesPluginData.getPersonResourceTimeTrackingPolicy(resourceId); - assertEquals(expectedPolicy, actualPolicy); - } - for (ResourceId resourceId : resourcesPluginData.getResourceIds()) { - assertEquals(resourcesPluginData.getResourcePropertyIds(resourceId), cloneResourcesPluginData.getResourcePropertyIds(resourceId)); - } - - for (ResourceId resourceId : resourcesPluginData.getResourceIds()) { - for (ResourcePropertyId resourcePropertyId : resourcesPluginData.getResourcePropertyIds(resourceId)) { - Object expectedValue = resourcesPluginData.getResourcePropertyValue(resourceId, resourcePropertyId); - Object actualValue = cloneResourcesPluginData.getResourcePropertyValue(resourceId, resourcePropertyId); - assertEquals(expectedValue, actualValue); - } - } - - for (ResourceId resourceId : resourcesPluginData.getResourceIds()) { - for (ResourcePropertyId resourcePropertyId : resourcesPluginData.getResourcePropertyIds(resourceId)) { - PropertyDefinition expectedPropertyDefinition = resourcesPluginData.getResourcePropertyDefinition(resourceId, resourcePropertyId); - PropertyDefinition actualPropertyDefinition = cloneResourcesPluginData.getResourcePropertyDefinition(resourceId, resourcePropertyId); - assertEquals(expectedPropertyDefinition, actualPropertyDefinition); - } - } - - assertEquals(resourcesPluginData.getRegionIds(), cloneResourcesPluginData.getRegionIds()); - - for (RegionId regionId : resourcesPluginData.getRegionIds()) { - List regionResourceLevels = resourcesPluginData.getRegionResourceLevels(regionId); - List cloneRegionResourceLevels = cloneResourcesPluginData.getRegionResourceLevels(regionId); - assertEquals(regionResourceLevels, cloneRegionResourceLevels); - } + assertEquals(resourcesPluginData, cloneResourcesPluginData); } diff --git a/gcm4/src/test/java/plugins/resources/datamanagers/AT_ResourcesDataManager.java b/gcm4/src/test/java/plugins/resources/datamanagers/AT_ResourcesDataManager.java index 34dfbe7c6..b605a443a 100644 --- a/gcm4/src/test/java/plugins/resources/datamanagers/AT_ResourcesDataManager.java +++ b/gcm4/src/test/java/plugins/resources/datamanagers/AT_ResourcesDataManager.java @@ -61,17 +61,22 @@ public final class AT_ResourcesDataManager { @Test - @UnitTestMethod(target = ResourcesDataManager.class, name = "init", args = {DataManagerContext.class}) + @UnitTestMethod(target = ResourcesDataManager.class, name = "init", args = { DataManagerContext.class }) public void testInit_State() { + testInit_State_1(); + testInit_State_2(); + } - ResourcesPluginData resourcesPluginData = ResourcesPluginData.builder() - .defineResourceProperty(TestResourceId.RESOURCE_1, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE.getPropertyDefinition()) - .defineResourceProperty(TestResourceId.RESOURCE_2, TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE, TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE.getPropertyDefinition()) - .addResource(TestResourceId.RESOURCE_1) - .addResource(TestResourceId.RESOURCE_2) - .setResourceTimeTracking(TestResourceId.RESOURCE_2, TimeTrackingPolicy.TRACK_TIME) - .setResourcePropertyValue(TestResourceId.RESOURCE_1, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE, 45) - .build(); + private void testInit_State_1() { + + ResourcesPluginData resourcesPluginData = ResourcesPluginData .builder() + .defineResourceProperty(TestResourceId.RESOURCE_1, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE, + TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE.getPropertyDefinition()) + .defineResourceProperty(TestResourceId.RESOURCE_2, TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE, + TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE.getPropertyDefinition()) + .addResource(TestResourceId.RESOURCE_1, 0.0).addResource(TestResourceId.RESOURCE_2, 0.0) + .setResourceTimeTracking(TestResourceId.RESOURCE_2, true) + .setResourcePropertyValue(TestResourceId.RESOURCE_1, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE, 45).build(); List expectedRegionIds = new ArrayList<>(); TestPluginData.Builder pluginBuilder = TestPluginData.builder(); @@ -88,43 +93,41 @@ public void testInit_State() { })); TestPluginData testPluginData = pluginBuilder.build(); - Factory factory = ResourcesTestPluginFactory.factory(1, 7939130943360648501L, testPluginData) - .setResourcesPluginData(resourcesPluginData); - TestOutputConsumer testOutputConsumer = TestSimulation.builder().addPlugins(factory.getPlugins()) - .setProduceSimulationStateOnHalt(true) - .setSimulationHaltTime(2) - .build() - .execute(); + Factory factory = ResourcesTestPluginFactory.factory(1, 7939130943360648501L, testPluginData).setResourcesPluginData(resourcesPluginData); + TestOutputConsumer testOutputConsumer = TestSimulation.builder().addPlugins(factory.getPlugins()).setProduceSimulationStateOnHalt(true).setSimulationHaltTime(2).build().execute(); Map outputItems = testOutputConsumer.getOutputItems(ResourcesPluginData.class); assertEquals(1, outputItems.size()); ResourcesPluginData actualPluginData = outputItems.keySet().iterator().next(); ResourcesPluginData expectedPluginData = ResourcesPluginData.builder() - .defineResourceProperty(TestResourceId.RESOURCE_1, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE.getPropertyDefinition()) - .defineResourceProperty(TestResourceId.RESOURCE_2, TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE, TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE.getPropertyDefinition()) - .addResource(TestResourceId.RESOURCE_1) - .addResource(TestResourceId.RESOURCE_2) - .setResourceTimeTracking(TestResourceId.RESOURCE_2, TimeTrackingPolicy.TRACK_TIME) - .setResourcePropertyValue(TestResourceId.RESOURCE_1, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE, 45) - .setResourcePropertyValue(TestResourceId.RESOURCE_2, TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE, false) - .setRegionResourceLevel(TestRegionId.REGION_1, TestResourceId.RESOURCE_1, 55) - .setRegionResourceLevel(expectedRegionIds.get(0), TestResourceId.RESOURCE_2, 3) - .setPersonResourceLevel(new PersonId(0), TestResourceId.RESOURCE_2, 30) - .build(); + .defineResourceProperty(TestResourceId.RESOURCE_1, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE, + TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE.getPropertyDefinition()) + .defineResourceProperty(TestResourceId.RESOURCE_2, TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE, + TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE.getPropertyDefinition()) + .addResource(TestResourceId.RESOURCE_1, 0.0).addResource(TestResourceId.RESOURCE_2, 0.0) + .setResourceTimeTracking(TestResourceId.RESOURCE_2, true) + .setResourcePropertyValue(TestResourceId.RESOURCE_1, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE, 45) + .setResourcePropertyValue(TestResourceId.RESOURCE_2, TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE, false) + .setRegionResourceLevel(TestRegionId.REGION_1, TestResourceId.RESOURCE_1, 55) + .setRegionResourceLevel(expectedRegionIds.get(0), TestResourceId.RESOURCE_2, 3L) + .setPersonResourceLevel(new PersonId(0), TestResourceId.RESOURCE_2, 30L).build(); assertEquals(expectedPluginData, actualPluginData); + } + private void testInit_State_2() { // show that the plugin data persists after multiple actions - expectedRegionIds.clear(); - ResourcesPluginData resourcesPluginData2 = ResourcesPluginData.builder() - .defineResourceProperty(TestResourceId.RESOURCE_1, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE.getPropertyDefinition()) - .defineResourceProperty(TestResourceId.RESOURCE_2, TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE, TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE.getPropertyDefinition()) - .addResource(TestResourceId.RESOURCE_1) - .addResource(TestResourceId.RESOURCE_2) - .setResourceTimeTracking(TestResourceId.RESOURCE_2, TimeTrackingPolicy.TRACK_TIME) - .setResourcePropertyValue(TestResourceId.RESOURCE_1, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE, 45) - .build(); - TestPluginData.Builder pluginBuilder2 = TestPluginData.builder(); - - pluginBuilder2.addTestActorPlan("actor", new TestActorPlan(0, (c) -> { + List expectedRegionIds = new ArrayList<>(); + + ResourcesPluginData resourcesPluginData2 = ResourcesPluginData .builder() + .defineResourceProperty(TestResourceId.RESOURCE_1, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE, + TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE.getPropertyDefinition()) + .defineResourceProperty(TestResourceId.RESOURCE_2, TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE, + TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE.getPropertyDefinition()) + .addResource(TestResourceId.RESOURCE_1, 0.0).addResource(TestResourceId.RESOURCE_2, 0.0) + .setResourceTimeTracking(TestResourceId.RESOURCE_2, true) + .setResourcePropertyValue(TestResourceId.RESOURCE_1, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE, 45).build(); + TestPluginData.Builder pluginBuilder = TestPluginData.builder(); + + pluginBuilder.addTestActorPlan("actor", new TestActorPlan(0, (c) -> { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); RegionsDataManager regionsDataManager = c.getDataManager(RegionsDataManager.class); @@ -136,10 +139,10 @@ public void testInit_State() { resourcesDataManager.transferResourceToPersonFromRegion(TestResourceId.RESOURCE_2, new PersonId(0), 30); })); - pluginBuilder2.addTestActorPlan("actor", new TestActorPlan(1, (c) -> { + pluginBuilder.addTestActorPlan("actor", new TestActorPlan(1, (c) -> { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - resourcesDataManager.addResourceId(TestResourceId.RESOURCE_3, TimeTrackingPolicy.DO_NOT_TRACK_TIME); + resourcesDataManager.addResourceId(TestResourceId.RESOURCE_3, false); resourcesDataManager.addResourceToRegion(TestResourceId.RESOURCE_3, TestRegionId.REGION_2, 73); resourcesDataManager.transferResourceFromPersonToRegion(TestResourceId.RESOURCE_2, new PersonId(0), 10); resourcesDataManager.transferResourceBetweenRegions(TestResourceId.RESOURCE_2, TestRegionId.REGION_1, TestRegionId.REGION_2, 5); @@ -147,36 +150,40 @@ public void testInit_State() { })); - TestPluginData testPluginData2 = pluginBuilder2.build(); - Factory factory2 = ResourcesTestPluginFactory.factory(2, 7939130943360648501L, testPluginData2) + TestPluginData testPluginData2 = pluginBuilder.build(); + Factory factory2 = ResourcesTestPluginFactory.factory(2, 7939130943360648501L, testPluginData2)// .setResourcesPluginData(resourcesPluginData2); - TestOutputConsumer testOutputConsumer2 = TestSimulation.builder().addPlugins(factory2.getPlugins()) - .setProduceSimulationStateOnHalt(true) - .setSimulationHaltTime(2) - .build() - .execute(); + TestOutputConsumer testOutputConsumer2 = TestSimulation .builder()// + .addPlugins(factory2.getPlugins())// + .setProduceSimulationStateOnHalt(true)// + .setSimulationHaltTime(2)// + .build()// + .execute(); Map outputItems2 = testOutputConsumer2.getOutputItems(ResourcesPluginData.class); assertEquals(1, outputItems2.size()); - ResourcesPluginData actualPluginData2 = outputItems2.keySet().iterator().next(); - ResourcesPluginData expectedPluginData2 = ResourcesPluginData.builder() - .defineResourceProperty(TestResourceId.RESOURCE_1, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE.getPropertyDefinition()) - .defineResourceProperty(TestResourceId.RESOURCE_2, TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE, TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE.getPropertyDefinition()) - .addResource(TestResourceId.RESOURCE_1) - .addResource(TestResourceId.RESOURCE_2) - .addResource(TestResourceId.RESOURCE_3) - .setResourceTimeTracking(TestResourceId.RESOURCE_2, TimeTrackingPolicy.TRACK_TIME) - .setResourcePropertyValue(TestResourceId.RESOURCE_1, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE, 45) - .setResourcePropertyValue(TestResourceId.RESOURCE_2, TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE, false) - .setRegionResourceLevel(TestRegionId.REGION_1, TestResourceId.RESOURCE_1, 55) - .setRegionResourceLevel(expectedRegionIds.get(0), TestResourceId.RESOURCE_2, 8) - .setRegionResourceLevel(TestRegionId.REGION_2, TestResourceId.RESOURCE_2, 5) - .setRegionResourceLevel(TestRegionId.REGION_2, TestResourceId.RESOURCE_3, 73) - .setPersonResourceLevel(new PersonId(0), TestResourceId.RESOURCE_2, 20) - .build(); - assertEquals(expectedPluginData2, actualPluginData2); + ResourcesPluginData actualPluginData = outputItems2.keySet().iterator().next(); + ResourcesPluginData expectedPluginData = ResourcesPluginData .builder() + .defineResourceProperty(TestResourceId.RESOURCE_1, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE, + TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE.getPropertyDefinition()) + .defineResourceProperty(TestResourceId.RESOURCE_2, TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE, + TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE.getPropertyDefinition()) + .addResource(TestResourceId.RESOURCE_1, 0.0)// + .addResource(TestResourceId.RESOURCE_2, 0.0)// + .addResource(TestResourceId.RESOURCE_3, 1.0)// + .setResourceTimeTracking(TestResourceId.RESOURCE_2, true) + .setResourcePropertyValue(TestResourceId.RESOURCE_1, TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE, 45) + .setResourcePropertyValue(TestResourceId.RESOURCE_2, TestResourcePropertyId.ResourceProperty_1_1_BOOLEAN_MUTABLE, false) + .setRegionResourceLevel(TestRegionId.REGION_1, TestResourceId.RESOURCE_1, 55) + .setRegionResourceLevel(expectedRegionIds.get(0), TestResourceId.RESOURCE_2, 8) + .setRegionResourceLevel(TestRegionId.REGION_2, TestResourceId.RESOURCE_2, 5) + .setRegionResourceLevel(TestRegionId.REGION_2, TestResourceId.RESOURCE_3, 73) + .setPersonResourceLevel(new PersonId(0), TestResourceId.RESOURCE_2, 20L)// + .setPersonResourceTime(new PersonId(0), TestResourceId.RESOURCE_2, 1.0) + .build(); + + assertEquals(expectedPluginData, actualPluginData); } - @Test @UnitTestMethod(target = ResourcesDataManager.class, name = "init", args = { DataManagerContext.class }) public void testPersonRemovalEvent() { @@ -442,8 +449,8 @@ public void testGetPersonResourceTime() { // tracked int trackedResourceCount = 0; for (ResourceId resourceId : resourceIds) { - TimeTrackingPolicy personResourceTimeTrackingPolicy = resourcesDataManager.getPersonResourceTimeTrackingPolicy(resourceId); - if (personResourceTimeTrackingPolicy == TimeTrackingPolicy.TRACK_TIME) { + boolean personResourceTimeTrackingPolicy = resourcesDataManager.getPersonResourceTimeTrackingPolicy(resourceId); + if (personResourceTimeTrackingPolicy) { trackedResourceCount++; } } @@ -529,8 +536,8 @@ public void testGetPersonResourceTime() { for (MultiKey multiKey : expectedTimes.keySet()) { PersonId personId = multiKey.getKey(0); ResourceId resourceId = multiKey.getKey(1); - TimeTrackingPolicy personResourceTimeTrackingPolicy = resourcesDataManager.getPersonResourceTimeTrackingPolicy(resourceId); - if (personResourceTimeTrackingPolicy == TimeTrackingPolicy.TRACK_TIME) { + boolean trackTimes = resourcesDataManager.getPersonResourceTimeTrackingPolicy(resourceId); + if (trackTimes) { double expectedTime = expectedTimes.get(multiKey).getValue(); double actualTime = resourcesDataManager.getPersonResourceTime(resourceId, personId); assertEquals(expectedTime, actualTime); @@ -545,8 +552,8 @@ public void testGetPersonResourceTime() { int trackedResourceCount = 0; for (ResourceId resourceId : resourcesDataManager.getResourceIds()) { - TimeTrackingPolicy personResourceTimeTrackingPolicy = resourcesDataManager.getPersonResourceTimeTrackingPolicy(resourceId); - if (personResourceTimeTrackingPolicy == TimeTrackingPolicy.TRACK_TIME) { + boolean trackTimes = resourcesDataManager.getPersonResourceTimeTrackingPolicy(resourceId); + if (trackTimes) { trackedResourceCount++; } } @@ -610,8 +617,8 @@ public void testGetPersonResourceTimeTrackingPolicy() { Factory factory = ResourcesTestPluginFactory.factory(5, 757175164544632409L, (c) -> { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); for (TestResourceId testResourceId : TestResourceId.values()) { - TimeTrackingPolicy actualPolicy = resourcesDataManager.getPersonResourceTimeTrackingPolicy(testResourceId); - TimeTrackingPolicy expectedPolicy = testResourceId.getTimeTrackingPolicy(); + boolean actualPolicy = resourcesDataManager.getPersonResourceTimeTrackingPolicy(testResourceId); + boolean expectedPolicy = testResourceId.getTimeTrackingPolicy(); assertEquals(expectedPolicy, actualPolicy); } }); @@ -708,162 +715,6 @@ public void testGetRegionResourceLevel() { assertEquals(RegionError.UNKNOWN_REGION_ID, contractException.getErrorType()); } - @Test - @UnitTestMethod(target = ResourcesDataManager.class, name = "getRegionResourceTime", args = { RegionId.class, ResourceId.class }) - public void testGetRegionResourceTime() { - - TestPluginData.Builder pluginBuilder = TestPluginData.builder(); - - Map expectedTimes = new LinkedHashMap<>(); - - pluginBuilder.addTestActorPlan("actor", new TestActorPlan(0, (c) -> { - // establish data views - - ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - StochasticsDataManager stochasticsDataManager = c.getDataManager(StochasticsDataManager.class); - RandomGenerator randomGenerator = stochasticsDataManager.getRandomGenerator(); - RegionsDataManager regionsDataManager = c.getDataManager(RegionsDataManager.class); - - // establish the people and resources - Set resourceIds = resourcesDataManager.getResourceIds(); - List regionIds = new ArrayList<>(regionsDataManager.getRegionIds()); - - // initialize the expected times - for (RegionId regionId : regionIds) { - for (ResourceId resourceId : resourceIds) { - expectedTimes.put(new MultiKey(regionId, resourceId), new MutableDouble()); - } - } - - // give random amounts of resource to random regions - for (int i = 0; i < regionIds.size(); i++) { - RegionId regionId = regionIds.get(randomGenerator.nextInt(regionIds.size())); - ResourceId resourceId = TestResourceId.getRandomResourceId(randomGenerator); - int amount = randomGenerator.nextInt(5) + 1; - resourcesDataManager.addResourceToRegion(resourceId, regionId, amount); - expectedTimes.get(new MultiKey(regionId, resourceId)).setValue(c.getTime()); - } - - })); - - // make more resource updates at time 1 - pluginBuilder.addTestActorPlan("actor", new TestActorPlan(1, (c) -> { - // establish data views - - StochasticsDataManager stochasticsDataManager = c.getDataManager(StochasticsDataManager.class); - RandomGenerator randomGenerator = stochasticsDataManager.getRandomGenerator(); - RegionsDataManager regionsDataManager = c.getDataManager(RegionsDataManager.class); - ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - - // establish the regions - List regionIds = new ArrayList<>(regionsDataManager.getRegionIds()); - - // give random amounts of resource to random regions - for (int i = 0; i < regionIds.size(); i++) { - RegionId regionId = regionIds.get(randomGenerator.nextInt(regionIds.size())); - ResourceId resourceId = TestResourceId.getRandomResourceId(randomGenerator); - int amount = randomGenerator.nextInt(5) + 1; - resourcesDataManager.addResourceToRegion(resourceId, regionId, amount); - expectedTimes.get(new MultiKey(regionId, resourceId)).setValue(c.getTime()); - } - - })); - - // make more resource updates at time 2 - pluginBuilder.addTestActorPlan("actor", new TestActorPlan(2, (c) -> { - // establish data views - - StochasticsDataManager stochasticsDataManager = c.getDataManager(StochasticsDataManager.class); - RandomGenerator randomGenerator = stochasticsDataManager.getRandomGenerator(); - RegionsDataManager regionsDataManager = c.getDataManager(RegionsDataManager.class); - ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - // establish the regions - List regionIds = new ArrayList<>(regionsDataManager.getRegionIds()); - - // give random amounts of resource to random regions - for (int i = 0; i < regionIds.size(); i++) { - RegionId regionId = regionIds.get(randomGenerator.nextInt(regionIds.size())); - ResourceId resourceId = TestResourceId.getRandomResourceId(randomGenerator); - int amount = randomGenerator.nextInt(5) + 1; - resourcesDataManager.addResourceToRegion(resourceId, regionId, amount); - expectedTimes.get(new MultiKey(regionId, resourceId)).setValue(c.getTime()); - } - - })); - - // test the person resource times - pluginBuilder.addTestActorPlan("actor", new TestActorPlan(3, (c) -> { - // establish data views - - ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - RegionsDataManager regionsDataManager = c.getDataManager(RegionsDataManager.class); - - // show that the region resource times match expectations - int actualAssertionsCount = 0; - for (MultiKey multiKey : expectedTimes.keySet()) { - RegionId regionId = multiKey.getKey(0); - ResourceId resourceId = multiKey.getKey(1); - double expectedTime = expectedTimes.get(multiKey).getValue(); - double actualTime = resourcesDataManager.getRegionResourceTime(regionId, resourceId); - assertEquals(expectedTime, actualTime); - actualAssertionsCount++; - } - /* - * Show that the number of time values that were tested is equal to - * the size of the population times the number of resources - */ - int expectedAssertionsCount = regionsDataManager.getRegionIds().size() * resourcesDataManager.getResourceIds().size(); - assertEquals(expectedAssertionsCount, actualAssertionsCount); - })); - - TestPluginData testPluginData = pluginBuilder.build(); - Factory factory = ResourcesTestPluginFactory.factory(30, 6128764970683025350L, testPluginData); - TestSimulation.builder().addPlugins(factory.getPlugins()).build().execute(); - /* - * precondition test: if the assignment times for the resource are not - * tracked - */ - ContractException contractException = assertThrows(ContractException.class, () -> { - Factory factory2 = ResourcesTestPluginFactory.factory(30, 3888561557931148149L, (c) -> { - ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - resourcesDataManager.getPersonResourceTime(TestResourceId.RESOURCE_2, new PersonId(0)); - }); - TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); - }); - assertEquals(ResourceError.RESOURCE_ASSIGNMENT_TIME_NOT_TRACKED, contractException.getErrorType()); - - /* precondition test: if the resource id is null */ - contractException = assertThrows(ContractException.class, () -> { - Factory factory2 = ResourcesTestPluginFactory.factory(30, 9045818580061726595L, (c) -> { - ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - resourcesDataManager.getPersonResourceTime(null, new PersonId(0)); - }); - TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); - }); - assertEquals(ResourceError.NULL_RESOURCE_ID, contractException.getErrorType()); - - /* precondition test: if the resource id is unknown */ - contractException = assertThrows(ContractException.class, () -> { - Factory factory2 = ResourcesTestPluginFactory.factory(30, 5592254382530100326L, (c) -> { - ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - resourcesDataManager.getPersonResourceTime(TestResourceId.getUnknownResourceId(), new PersonId(0)); - }); - TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); - }); - assertEquals(ResourceError.UNKNOWN_RESOURCE_ID, contractException.getErrorType()); - - /* precondition test: if the person id null */ - contractException = assertThrows(ContractException.class, () -> { - Factory factory2 = ResourcesTestPluginFactory.factory(30, 1245016103076447355L, (c) -> { - ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - resourcesDataManager.getPersonResourceTime(TestResourceId.RESOURCE_1, null); - }); - TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); - }); - assertEquals(PersonError.NULL_PERSON_ID, contractException.getErrorType()); - - } - @Test @UnitTestMethod(target = ResourcesDataManager.class, name = "getResourceIds", args = {}) public void testGetResourceIds() { @@ -1378,21 +1229,21 @@ public void testAddResourceId() { pluginBuilder.addTestActorPlan("actor", new TestActorPlan(1, (c) -> { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - TimeTrackingPolicy timeTrackingPolicy = TimeTrackingPolicy.DO_NOT_TRACK_TIME; + boolean timeTrackingPolicy = false; assertFalse(resourcesDataManager.resourceIdExists(newResourceId1)); resourcesDataManager.addResourceId(newResourceId1, timeTrackingPolicy); assertTrue(resourcesDataManager.resourceIdExists(newResourceId1)); - MultiKey multiKey = new MultiKey(c.getTime(), newResourceId1, TimeTrackingPolicy.DO_NOT_TRACK_TIME); + MultiKey multiKey = new MultiKey(c.getTime(), newResourceId1, false); expectedObservations.add(multiKey); })); pluginBuilder.addTestActorPlan("actor", new TestActorPlan(2, (c) -> { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - TimeTrackingPolicy timeTrackingPolicy = TimeTrackingPolicy.TRACK_TIME; + boolean timeTrackingPolicy = true; assertFalse(resourcesDataManager.resourceIdExists(newResourceId2)); resourcesDataManager.addResourceId(newResourceId2, timeTrackingPolicy); assertTrue(resourcesDataManager.resourceIdExists(newResourceId2)); - MultiKey multiKey = new MultiKey(c.getTime(), newResourceId2, TimeTrackingPolicy.TRACK_TIME); + MultiKey multiKey = new MultiKey(c.getTime(), newResourceId2, true); expectedObservations.add(multiKey); })); @@ -1408,7 +1259,7 @@ public void testAddResourceId() { ContractException contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(5, 3016555021220987436L, (c) -> { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - resourcesDataManager.addResourceId(null, TimeTrackingPolicy.DO_NOT_TRACK_TIME); + resourcesDataManager.addResourceId(null, false); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); @@ -1418,22 +1269,12 @@ public void testAddResourceId() { contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(5, 9097839209339012193L, (c) -> { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - resourcesDataManager.addResourceId(TestResourceId.RESOURCE_1, TimeTrackingPolicy.DO_NOT_TRACK_TIME); + resourcesDataManager.addResourceId(TestResourceId.RESOURCE_1, false); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.DUPLICATE_RESOURCE_ID, contractException.getErrorType()); - // precondition test: if the time tracking policy is null - contractException = assertThrows(ContractException.class, () -> { - Factory factory2 = ResourcesTestPluginFactory.factory(5, 5786650172226277505L, (c) -> { - ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - resourcesDataManager.addResourceId(TestResourceId.getUnknownResourceId(), null); - }); - TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); - }); - assertEquals(PropertyError.NULL_TIME_TRACKING_POLICY, contractException.getErrorType()); - } @Test @@ -1495,96 +1336,92 @@ public void testSetResourcePropertyValue() { TestPluginData testPluginData = pluginBuilder.build(); Factory factory = ResourcesTestPluginFactory.factory(0, 8240654442453940072L, testPluginData); TestSimulation.builder().addPlugins(factory.getPlugins()).build().execute(); - + /* precondition test: if the resource id is null */ - ContractException contractException = assertThrows(ContractException.class, () ->{ + ContractException contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(0, 8603231391482244436L, (c) -> { ResourcePropertyId resourcePropertyId = TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE; ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); Object value = 10; - resourcesDataManager.setResourcePropertyValue(null, resourcePropertyId, value); + resourcesDataManager.setResourcePropertyValue(null, resourcePropertyId, value); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.NULL_RESOURCE_ID, contractException.getErrorType()); /* precondition test: if the resource id is unknown */ - contractException = assertThrows(ContractException.class, () ->{ + contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(0, 4345368701918830681L, (c) -> { ResourcePropertyId resourcePropertyId = TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE; ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); Object value = 10; - resourcesDataManager.setResourcePropertyValue(TestResourceId.getUnknownResourceId(), resourcePropertyId, value); + resourcesDataManager.setResourcePropertyValue(TestResourceId.getUnknownResourceId(), resourcePropertyId, value); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.UNKNOWN_RESOURCE_ID, contractException.getErrorType()); - /* precondition test: if the resource property id is null */ - contractException = assertThrows(ContractException.class, () ->{ + contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(0, 697099694521127247L, (c) -> { ResourceId resourceId = TestResourceId.RESOURCE_1; ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); Object value = 10; - resourcesDataManager.setResourcePropertyValue(resourceId, null, value); + resourcesDataManager.setResourcePropertyValue(resourceId, null, value); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(PropertyError.NULL_PROPERTY_ID, contractException.getErrorType()); /* precondition test: if the resource property id is unknown */ - contractException = assertThrows(ContractException.class, () ->{ + contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(0, 5208483875882077960L, (c) -> { ResourceId resourceId = TestResourceId.RESOURCE_1; ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); Object value = 10; - resourcesDataManager.setResourcePropertyValue(resourceId, TestResourcePropertyId.getUnknownResourcePropertyId(), value); + resourcesDataManager.setResourcePropertyValue(resourceId, TestResourcePropertyId.getUnknownResourcePropertyId(), value); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(PropertyError.UNKNOWN_PROPERTY_ID, contractException.getErrorType()); /* precondition test: if the resource property value is null */ - contractException = assertThrows(ContractException.class, () ->{ + contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(0, 1862818482356534123L, (c) -> { ResourceId resourceId = TestResourceId.RESOURCE_1; ResourcePropertyId resourcePropertyId = TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE; ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - resourcesDataManager.setResourcePropertyValue(resourceId, resourcePropertyId, null); + resourcesDataManager.setResourcePropertyValue(resourceId, resourcePropertyId, null); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(PropertyError.NULL_PROPERTY_VALUE, contractException.getErrorType()); - + /* * precondition test: if the resource property value is incompatible * with the corresponding property definition */ - contractException = assertThrows(ContractException.class, () ->{ + contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(0, 8731358919842250070L, (c) -> { ResourceId resourceId = TestResourceId.RESOURCE_1; ResourcePropertyId resourcePropertyId = TestResourcePropertyId.ResourceProperty_1_2_INTEGER_MUTABLE; ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - resourcesDataManager.setResourcePropertyValue(resourceId, resourcePropertyId, 23.4); + resourcesDataManager.setResourcePropertyValue(resourceId, resourcePropertyId, 23.4); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(PropertyError.INCOMPATIBLE_VALUE, contractException.getErrorType()); - - /* precondition test: if the property has been defined as immutable */ - contractException = assertThrows(ContractException.class, () ->{ + contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(0, 2773568485593496806L, (c) -> { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); Object value = 10; - resourcesDataManager.setResourcePropertyValue(TestResourceId.RESOURCE_5, TestResourcePropertyId.ResourceProperty_5_1_INTEGER_IMMUTABLE, value); + resourcesDataManager.setResourcePropertyValue(TestResourceId.RESOURCE_5, TestResourcePropertyId.ResourceProperty_5_1_INTEGER_IMMUTABLE, value); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(PropertyError.IMMUTABLE_VALUE, contractException.getErrorType()); - } @@ -1676,7 +1513,7 @@ public void testPersonResourceRemovalEvent() { TestPluginData testPluginData = pluginBuilder.build(); Factory factory = ResourcesTestPluginFactory.factory(50, 6476360369877622233L, testPluginData); TestSimulation.builder().addPlugins(factory.getPlugins()).build().execute(); - + /* precondition test: if the person id is null */ ContractException contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(50, 368123167921446410L, (c) -> { @@ -1685,12 +1522,13 @@ public void testPersonResourceRemovalEvent() { ResourceId resourceId = TestResourceId.RESOURCE_1; PersonId personId = new PersonId(0); long amount = 10; - // add resource to the person to ensure the precondition tests will + // add resource to the person to ensure the precondition tests + // will // work RegionId regionId = regionsDataManager.getPersonRegion(personId); resourcesDataManager.addResourceToRegion(resourceId, regionId, 100L); resourcesDataManager.transferResourceToPersonFromRegion(resourceId, personId, 100L); - resourcesDataManager.removeResourceFromPerson(resourceId, null, amount); + resourcesDataManager.removeResourceFromPerson(resourceId, null, amount); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); @@ -1704,17 +1542,17 @@ public void testPersonResourceRemovalEvent() { ResourceId resourceId = TestResourceId.RESOURCE_1; PersonId personId = new PersonId(0); long amount = 10; - // add resource to the person to ensure the precondition tests will + // add resource to the person to ensure the precondition tests + // will // work RegionId regionId = regionsDataManager.getPersonRegion(personId); resourcesDataManager.addResourceToRegion(resourceId, regionId, 100L); resourcesDataManager.transferResourceToPersonFromRegion(resourceId, personId, 100L); - resourcesDataManager.removeResourceFromPerson(resourceId, new PersonId(1000), amount); + resourcesDataManager.removeResourceFromPerson(resourceId, new PersonId(1000), amount); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(PersonError.UNKNOWN_PERSON_ID, contractException.getErrorType()); - /* precondition test: if the resource id is null */ contractException = assertThrows(ContractException.class, () -> { @@ -1724,17 +1562,17 @@ public void testPersonResourceRemovalEvent() { ResourceId resourceId = TestResourceId.RESOURCE_1; PersonId personId = new PersonId(0); long amount = 10; - // add resource to the person to ensure the precondition tests will + // add resource to the person to ensure the precondition tests + // will // work RegionId regionId = regionsDataManager.getPersonRegion(personId); resourcesDataManager.addResourceToRegion(resourceId, regionId, 100L); resourcesDataManager.transferResourceToPersonFromRegion(resourceId, personId, 100L); - resourcesDataManager.removeResourceFromPerson(null, personId, amount); + resourcesDataManager.removeResourceFromPerson(null, personId, amount); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.NULL_RESOURCE_ID, contractException.getErrorType()); - /* precondition test: if the resource id is unknown */ contractException = assertThrows(ContractException.class, () -> { @@ -1744,17 +1582,18 @@ public void testPersonResourceRemovalEvent() { ResourceId resourceId = TestResourceId.RESOURCE_1; PersonId personId = new PersonId(0); long amount = 10; - // add resource to the person to ensure the precondition tests will + // add resource to the person to ensure the precondition tests + // will // work RegionId regionId = regionsDataManager.getPersonRegion(personId); resourcesDataManager.addResourceToRegion(resourceId, regionId, 100L); resourcesDataManager.transferResourceToPersonFromRegion(resourceId, personId, 100L); - resourcesDataManager.removeResourceFromPerson(TestResourceId.getUnknownResourceId(), personId, amount); + resourcesDataManager.removeResourceFromPerson(TestResourceId.getUnknownResourceId(), personId, amount); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.UNKNOWN_RESOURCE_ID, contractException.getErrorType()); - + /* precondition test: if the amount is negative */ contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(50, 6748548509217290999L, (c) -> { @@ -1762,7 +1601,8 @@ public void testPersonResourceRemovalEvent() { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); ResourceId resourceId = TestResourceId.RESOURCE_1; PersonId personId = new PersonId(0); - // add resource to the person to ensure the precondition tests will + // add resource to the person to ensure the precondition tests + // will // work RegionId regionId = regionsDataManager.getPersonRegion(personId); resourcesDataManager.addResourceToRegion(resourceId, regionId, 100L); @@ -1772,7 +1612,6 @@ public void testPersonResourceRemovalEvent() { TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.NEGATIVE_RESOURCE_AMOUNT, contractException.getErrorType()); - /* * precondition test: if the person does not have the required amount of @@ -1784,17 +1623,17 @@ public void testPersonResourceRemovalEvent() { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); ResourceId resourceId = TestResourceId.RESOURCE_1; PersonId personId = new PersonId(0); - // add resource to the person to ensure the precondition tests will + // add resource to the person to ensure the precondition tests + // will // work RegionId regionId = regionsDataManager.getPersonRegion(personId); resourcesDataManager.addResourceToRegion(resourceId, regionId, 100L); resourcesDataManager.transferResourceToPersonFromRegion(resourceId, personId, 100L); - resourcesDataManager.removeResourceFromPerson(resourceId, personId, 10000); + resourcesDataManager.removeResourceFromPerson(resourceId, personId, 10000); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.INSUFFICIENT_RESOURCES_AVAILABLE, contractException.getErrorType()); - } @@ -1884,12 +1723,11 @@ public void testRegionResourceRemovalEvent() { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); ResourceId resourceId = TestResourceId.RESOURCE_1; long amount = 10; - resourcesDataManager.removeResourceFromRegion(resourceId, null, amount); - }); + resourcesDataManager.removeResourceFromRegion(resourceId, null, amount); + }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(RegionError.NULL_REGION_ID, contractException.getErrorType()); - /* precondition test: if the region id is unknown */ contractException = assertThrows(ContractException.class, () -> { @@ -1897,7 +1735,7 @@ public void testRegionResourceRemovalEvent() { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); ResourceId resourceId = TestResourceId.RESOURCE_1; long amount = 10; - resourcesDataManager.removeResourceFromRegion(resourceId, TestRegionId.getUnknownRegionId(), amount); + resourcesDataManager.removeResourceFromRegion(resourceId, TestRegionId.getUnknownRegionId(), amount); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); @@ -1909,7 +1747,7 @@ public void testRegionResourceRemovalEvent() { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); RegionId regionId = TestRegionId.REGION_1; long amount = 10; - resourcesDataManager.removeResourceFromRegion(null, regionId, amount); + resourcesDataManager.removeResourceFromRegion(null, regionId, amount); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); @@ -1921,7 +1759,7 @@ public void testRegionResourceRemovalEvent() { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); RegionId regionId = TestRegionId.REGION_1; long amount = 10; - resourcesDataManager.removeResourceFromRegion(TestResourceId.getUnknownResourceId(), regionId, amount); + resourcesDataManager.removeResourceFromRegion(TestResourceId.getUnknownResourceId(), regionId, amount); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); @@ -1933,7 +1771,7 @@ public void testRegionResourceRemovalEvent() { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); ResourceId resourceId = TestResourceId.RESOURCE_1; RegionId regionId = TestRegionId.REGION_1; - resourcesDataManager.removeResourceFromRegion(resourceId, regionId, -1L); + resourcesDataManager.removeResourceFromRegion(resourceId, regionId, -1L); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); @@ -1948,9 +1786,9 @@ public void testRegionResourceRemovalEvent() { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); ResourceId resourceId = TestResourceId.RESOURCE_1; RegionId regionId = TestRegionId.REGION_1; - resourcesDataManager.removeResourceFromRegion(resourceId, regionId, 10000000L); + resourcesDataManager.removeResourceFromRegion(resourceId, regionId, 10000000L); }); - + TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.INSUFFICIENT_RESOURCES_AVAILABLE, contractException.getErrorType()); @@ -2042,7 +1880,7 @@ public void testTransferResourceBetweenRegions() { TestPluginData testPluginData = pluginBuilder.build(); Factory factory = ResourcesTestPluginFactory.factory(0, 7976375269741360076L, testPluginData); TestSimulation.builder().addPlugins(factory.getPlugins()).build().execute(); - + /* precondition test: if the source region is null */ ContractException contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(0, 2545276913032843668L, (c) -> { @@ -2051,19 +1889,19 @@ public void testTransferResourceBetweenRegions() { RegionId regionId2 = TestRegionId.REGION_2; long amount = 10; - // add resources to all the regions to ensure the precondition tests + // add resources to all the regions to ensure the precondition + // tests // will work for (TestRegionId testRegionId : TestRegionId.values()) { for (TestResourceId testResourceId : TestResourceId.values()) { resourcesDataManager.addResourceToRegion(testResourceId, testRegionId, 100L); } } - resourcesDataManager.transferResourceBetweenRegions(resourceId, null, regionId2, amount); + resourcesDataManager.transferResourceBetweenRegions(resourceId, null, regionId2, amount); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(RegionError.NULL_REGION_ID, contractException.getErrorType()); - /* precondition test: if the source region is unknown */ contractException = assertThrows(ContractException.class, () -> { @@ -2072,19 +1910,20 @@ public void testTransferResourceBetweenRegions() { ResourceId resourceId = TestResourceId.RESOURCE_1; RegionId regionId2 = TestRegionId.REGION_2; long amount = 10; - // add resources to all the regions to ensure the precondition tests + // add resources to all the regions to ensure the precondition + // tests // will work for (TestRegionId testRegionId : TestRegionId.values()) { for (TestResourceId testResourceId : TestResourceId.values()) { resourcesDataManager.addResourceToRegion(testResourceId, testRegionId, 100L); } } - resourcesDataManager.transferResourceBetweenRegions(resourceId, TestRegionId.getUnknownRegionId(), regionId2, amount); + resourcesDataManager.transferResourceBetweenRegions(resourceId, TestRegionId.getUnknownRegionId(), regionId2, amount); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(RegionError.UNKNOWN_REGION_ID, contractException.getErrorType()); - + /* precondition test: if the destination region is null */ contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(0, 3358578155263941L, (c) -> { @@ -2092,19 +1931,19 @@ public void testTransferResourceBetweenRegions() { ResourceId resourceId = TestResourceId.RESOURCE_1; RegionId regionId1 = TestRegionId.REGION_1; long amount = 10; - // add resources to all the regions to ensure the precondition tests + // add resources to all the regions to ensure the precondition + // tests // will work for (TestRegionId testRegionId : TestRegionId.values()) { for (TestResourceId testResourceId : TestResourceId.values()) { resourcesDataManager.addResourceToRegion(testResourceId, testRegionId, 100L); } } - resourcesDataManager.transferResourceBetweenRegions(resourceId, regionId1, null, amount); + resourcesDataManager.transferResourceBetweenRegions(resourceId, regionId1, null, amount); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(RegionError.NULL_REGION_ID, contractException.getErrorType()); - /* precondition test: if the destination region is unknown */ contractException = assertThrows(ContractException.class, () -> { @@ -2113,19 +1952,19 @@ public void testTransferResourceBetweenRegions() { ResourceId resourceId = TestResourceId.RESOURCE_1; RegionId regionId1 = TestRegionId.REGION_1; long amount = 10; - // add resources to all the regions to ensure the precondition tests + // add resources to all the regions to ensure the precondition + // tests // will work for (TestRegionId testRegionId : TestRegionId.values()) { for (TestResourceId testResourceId : TestResourceId.values()) { resourcesDataManager.addResourceToRegion(testResourceId, testRegionId, 100L); } } - resourcesDataManager.transferResourceBetweenRegions(resourceId, regionId1, TestRegionId.getUnknownRegionId(), amount); + resourcesDataManager.transferResourceBetweenRegions(resourceId, regionId1, TestRegionId.getUnknownRegionId(), amount); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(RegionError.UNKNOWN_REGION_ID, contractException.getErrorType()); - /* precondition test: if the resource id is null */ contractException = assertThrows(ContractException.class, () -> { @@ -2134,19 +1973,19 @@ public void testTransferResourceBetweenRegions() { RegionId regionId1 = TestRegionId.REGION_1; RegionId regionId2 = TestRegionId.REGION_2; long amount = 10; - // add resources to all the regions to ensure the precondition tests + // add resources to all the regions to ensure the precondition + // tests // will work for (TestRegionId testRegionId : TestRegionId.values()) { for (TestResourceId testResourceId : TestResourceId.values()) { resourcesDataManager.addResourceToRegion(testResourceId, testRegionId, 100L); } } - resourcesDataManager.transferResourceBetweenRegions(null, regionId1, regionId2, amount); + resourcesDataManager.transferResourceBetweenRegions(null, regionId1, regionId2, amount); }); - TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); + TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.NULL_RESOURCE_ID, contractException.getErrorType()); - /* precondition test: if the resource id is unknown */ contractException = assertThrows(ContractException.class, () -> { @@ -2155,19 +1994,19 @@ public void testTransferResourceBetweenRegions() { RegionId regionId1 = TestRegionId.REGION_1; RegionId regionId2 = TestRegionId.REGION_2; long amount = 10; - // add resources to all the regions to ensure the precondition tests + // add resources to all the regions to ensure the precondition + // tests // will work for (TestRegionId testRegionId : TestRegionId.values()) { for (TestResourceId testResourceId : TestResourceId.values()) { resourcesDataManager.addResourceToRegion(testResourceId, testRegionId, 100L); } } - resourcesDataManager.transferResourceBetweenRegions(TestResourceId.getUnknownResourceId(), regionId1, regionId2, amount); + resourcesDataManager.transferResourceBetweenRegions(TestResourceId.getUnknownResourceId(), regionId1, regionId2, amount); }); - TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); + TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.UNKNOWN_RESOURCE_ID, contractException.getErrorType()); - /* precondition test: if the resource amount is negative */ contractException = assertThrows(ContractException.class, () -> { @@ -2176,19 +2015,19 @@ public void testTransferResourceBetweenRegions() { ResourceId resourceId = TestResourceId.RESOURCE_1; RegionId regionId1 = TestRegionId.REGION_1; RegionId regionId2 = TestRegionId.REGION_2; - // add resources to all the regions to ensure the precondition tests + // add resources to all the regions to ensure the precondition + // tests // will work for (TestRegionId testRegionId : TestRegionId.values()) { for (TestResourceId testResourceId : TestResourceId.values()) { resourcesDataManager.addResourceToRegion(testResourceId, testRegionId, 100L); } } - resourcesDataManager.transferResourceBetweenRegions(resourceId, regionId1, regionId2, -1); + resourcesDataManager.transferResourceBetweenRegions(resourceId, regionId1, regionId2, -1); }); - TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); + TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.NEGATIVE_RESOURCE_AMOUNT, contractException.getErrorType()); - /* precondition test: if the source and destination region are equal */ contractException = assertThrows(ContractException.class, () -> { @@ -2197,19 +2036,19 @@ public void testTransferResourceBetweenRegions() { ResourceId resourceId = TestResourceId.RESOURCE_1; RegionId regionId1 = TestRegionId.REGION_1; long amount = 10; - // add resources to all the regions to ensure the precondition tests + // add resources to all the regions to ensure the precondition + // tests // will work for (TestRegionId testRegionId : TestRegionId.values()) { for (TestResourceId testResourceId : TestResourceId.values()) { resourcesDataManager.addResourceToRegion(testResourceId, testRegionId, 100L); } } - resourcesDataManager.transferResourceBetweenRegions(resourceId, regionId1, regionId1, amount); + resourcesDataManager.transferResourceBetweenRegions(resourceId, regionId1, regionId1, amount); }); - TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); + TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.REFLEXIVE_RESOURCE_TRANSFER, contractException.getErrorType()); - /* * precondition test: if the source region does not have sufficient @@ -2221,19 +2060,19 @@ public void testTransferResourceBetweenRegions() { ResourceId resourceId = TestResourceId.RESOURCE_1; RegionId regionId1 = TestRegionId.REGION_1; RegionId regionId2 = TestRegionId.REGION_2; - // add resources to all the regions to ensure the precondition tests + // add resources to all the regions to ensure the precondition + // tests // will work for (TestRegionId testRegionId : TestRegionId.values()) { for (TestResourceId testResourceId : TestResourceId.values()) { resourcesDataManager.addResourceToRegion(testResourceId, testRegionId, 100L); } } - resourcesDataManager.transferResourceBetweenRegions(resourceId, regionId1, regionId2, 100000L); + resourcesDataManager.transferResourceBetweenRegions(resourceId, regionId1, regionId2, 100000L); }); - TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); + TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.INSUFFICIENT_RESOURCES_AVAILABLE, contractException.getErrorType()); - /* * precondition test: if the transfer will cause a numeric overflow in @@ -2246,7 +2085,8 @@ public void testTransferResourceBetweenRegions() { RegionId regionId1 = TestRegionId.REGION_1; RegionId regionId2 = TestRegionId.REGION_2; long amount = 10; - // add resources to all the regions to ensure the precondition tests + // add resources to all the regions to ensure the precondition + // tests // will work for (TestRegionId testRegionId : TestRegionId.values()) { for (TestResourceId testResourceId : TestResourceId.values()) { @@ -2256,9 +2096,9 @@ public void testTransferResourceBetweenRegions() { // fill region 2 to the max long value long fillAmount = Long.MAX_VALUE - resourcesDataManager.getRegionResourceLevel(regionId2, resourceId); resourcesDataManager.addResourceToRegion(resourceId, regionId2, fillAmount); - resourcesDataManager.transferResourceBetweenRegions(resourceId, regionId1, regionId2, amount); + resourcesDataManager.transferResourceBetweenRegions(resourceId, regionId1, regionId2, amount); }); - TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); + TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.RESOURCE_ARITHMETIC_EXCEPTION, contractException.getErrorType()); @@ -2532,9 +2372,9 @@ public void testResourceTransferToPersonEvent() { TestPluginData testPluginData = pluginBuilder.build(); Factory factory = ResourcesTestPluginFactory.factory(30, 3808042869854225459L, testPluginData); TestSimulation.builder().addPlugins(factory.getPlugins()).build().execute(); - + /* precondition test: if the person id is null */ - ContractException contractException = assertThrows(ContractException.class, () ->{ + ContractException contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(30, 2628501738627419743L, (c) -> { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); RegionsDataManager regionsDataManager = c.getDataManager(RegionsDataManager.class); @@ -2546,14 +2386,14 @@ public void testResourceTransferToPersonEvent() { for (TestResourceId testResourceId : TestResourceId.values()) { resourcesDataManager.addResourceToRegion(testResourceId, regionId, 100L); } - resourcesDataManager.transferResourceToPersonFromRegion(resourceId, null, amount); + resourcesDataManager.transferResourceToPersonFromRegion(resourceId, null, amount); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(PersonError.NULL_PERSON_ID, contractException.getErrorType()); /* precondition test: if the person does not exist */ - contractException = assertThrows(ContractException.class, () ->{ + contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(30, 4172586983768511485L, (c) -> { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); RegionsDataManager regionsDataManager = c.getDataManager(RegionsDataManager.class); @@ -2565,15 +2405,14 @@ public void testResourceTransferToPersonEvent() { for (TestResourceId testResourceId : TestResourceId.values()) { resourcesDataManager.addResourceToRegion(testResourceId, regionId, 100L); } - resourcesDataManager.transferResourceToPersonFromRegion(resourceId, new PersonId(3434), amount); + resourcesDataManager.transferResourceToPersonFromRegion(resourceId, new PersonId(3434), amount); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(PersonError.UNKNOWN_PERSON_ID, contractException.getErrorType()); - /* precondition test: if the resource id is null */ - contractException = assertThrows(ContractException.class, () ->{ + contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(30, 6256935891787853979L, (c) -> { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); RegionsDataManager regionsDataManager = c.getDataManager(RegionsDataManager.class); @@ -2584,14 +2423,14 @@ public void testResourceTransferToPersonEvent() { for (TestResourceId testResourceId : TestResourceId.values()) { resourcesDataManager.addResourceToRegion(testResourceId, regionId, 100L); } - resourcesDataManager.transferResourceToPersonFromRegion(null, personId, amount); + resourcesDataManager.transferResourceToPersonFromRegion(null, personId, amount); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.NULL_RESOURCE_ID, contractException.getErrorType()); /* precondition test: if the resource id is unknown */ - contractException = assertThrows(ContractException.class, () ->{ + contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(30, 6949348067383487020L, (c) -> { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); RegionsDataManager regionsDataManager = c.getDataManager(RegionsDataManager.class); @@ -2602,14 +2441,14 @@ public void testResourceTransferToPersonEvent() { for (TestResourceId testResourceId : TestResourceId.values()) { resourcesDataManager.addResourceToRegion(testResourceId, regionId, 100L); } - resourcesDataManager.transferResourceToPersonFromRegion(TestResourceId.getUnknownResourceId(), personId, amount); + resourcesDataManager.transferResourceToPersonFromRegion(TestResourceId.getUnknownResourceId(), personId, amount); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.UNKNOWN_RESOURCE_ID, contractException.getErrorType()); /* precondition test: if the amount is negative */ - contractException = assertThrows(ContractException.class, () ->{ + contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(30, 6911979438110217773L, (c) -> { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); RegionsDataManager regionsDataManager = c.getDataManager(RegionsDataManager.class); @@ -2620,19 +2459,17 @@ public void testResourceTransferToPersonEvent() { for (TestResourceId testResourceId : TestResourceId.values()) { resourcesDataManager.addResourceToRegion(testResourceId, regionId, 100L); } - resourcesDataManager.transferResourceToPersonFromRegion(resourceId, personId, -1L); + resourcesDataManager.transferResourceToPersonFromRegion(resourceId, personId, -1L); }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.NEGATIVE_RESOURCE_AMOUNT, contractException.getErrorType()); - - /* * precondition test: if the region does not have the required amount of * the resource */ - contractException = assertThrows(ContractException.class, () ->{ + contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(30, 1022333582572896703L, (c) -> { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); RegionsDataManager regionsDataManager = c.getDataManager(RegionsDataManager.class); @@ -2643,19 +2480,17 @@ public void testResourceTransferToPersonEvent() { for (TestResourceId testResourceId : TestResourceId.values()) { resourcesDataManager.addResourceToRegion(testResourceId, regionId, 100L); } - resourcesDataManager.transferResourceToPersonFromRegion(resourceId, personId, 1000000); - }); + resourcesDataManager.transferResourceToPersonFromRegion(resourceId, personId, 1000000); + }); TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); }); assertEquals(ResourceError.INSUFFICIENT_RESOURCES_AVAILABLE, contractException.getErrorType()); - - /* * precondition test: if the transfer results in an overflow of the * person's resource level */ - contractException = assertThrows(ContractException.class, () ->{ + contractException = assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(30, 1989550065510462161L, (c) -> { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); RegionsDataManager regionsDataManager = c.getDataManager(RegionsDataManager.class); @@ -2685,9 +2520,9 @@ public void testResourceTransferToPersonEvent() { resourcesDataManager.transferResourceToPersonFromRegion(resourceId, personId, 1L); }); - + TestSimulation.builder().addPlugins(factory2.getPlugins()).build().execute(); - + }); assertEquals(ResourceError.RESOURCE_ARITHMETIC_EXCEPTION, contractException.getErrorType()); @@ -2933,13 +2768,13 @@ public void testPersonAdditionEvent() { PeopleDataManager peopleDataManager = c.getDataManager(PeopleDataManager.class); /* - * Precondition tests for the validity of the person id are shadowed - * by other plugins and cannot be easily tested + * Precondition tests for the validity of the person id are + * shadowed by other plugins and cannot be easily tested */ /* - * if the auxiliary data contains a ResourceInitialization that has - * a negative resource level + * if the auxiliary data contains a ResourceInitialization that + * has a negative resource level */ peopleDataManager.addPerson(PersonConstructionData .builder()// @@ -2958,14 +2793,11 @@ public void testPersonAdditionEvent() { @UnitTestMethod(target = ResourcesDataManager.class, name = "init", args = { DataManagerContext.class }) public void testRegionAdditionEvent() { - - /* * show that a newly added region will cause the resource data manager * to return the expected levels from the event. */ - - + Factory factory = ResourcesTestPluginFactory.factory(0, 7471968091128250788L, (c) -> { RegionsDataManager regionsDataManager = c.getDataManager(RegionsDataManager.class); RegionId newRegionId = TestRegionId.getUnknownRegionId(); @@ -3000,12 +2832,12 @@ public void testRegionAdditionEvent() { }); TestSimulation.builder().addPlugins(factory.getPlugins()).build().execute(); - + /* * show that an unknown region will cause the resource data manager to * throw an exception when retrieving a resource level for that region */ - assertThrows(ContractException.class, () ->{ + assertThrows(ContractException.class, () -> { Factory factory2 = ResourcesTestPluginFactory.factory(0, 4192802703078518338L, (c) -> { RegionId newRegionId = TestRegionId.getUnknownRegionId(); ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); @@ -3046,7 +2878,7 @@ public void testInitializeResourceDataManager() { } for (TestResourceId testResourceId : TestResourceId.values()) { - resourcesBuilder.addResource(testResourceId); + resourcesBuilder.addResource(testResourceId, 0.0); resourcesBuilder.setResourceTimeTracking(testResourceId, testResourceId.getTimeTrackingPolicy()); } @@ -3069,7 +2901,6 @@ public void testInitializeResourceDataManager() { RegionsDataManager regionsDataManager = c.getDataManager(RegionsDataManager.class); List personIds = peopleDataManager.getPeople(); - assertEquals(personIds.size(), resourcesPluginData.getPersonCount()); Set expectedRegionIds = regionsDataManager.getRegionIds(); Set actualRegionIds = resourcesPluginData.getRegionIds(); @@ -3091,28 +2922,49 @@ public void testInitializeResourceDataManager() { } for (ResourceId resourceId : resourcesPluginData.getResourceIds()) { - TimeTrackingPolicy expectedPolicy = resourcesPluginData.getPersonResourceTimeTrackingPolicy(resourceId); - TimeTrackingPolicy actualPolicy = resourcesDataManager.getPersonResourceTimeTrackingPolicy(resourceId); + boolean expectedPolicy = resourcesPluginData.getResourceTimeTrackingPolicy(resourceId); + boolean actualPolicy = resourcesDataManager.getPersonResourceTimeTrackingPolicy(resourceId); assertEquals(expectedPolicy, actualPolicy); } assertEquals(resourcesPluginData.getResourceIds(), resourcesDataManager.getResourceIds()); - for (PersonId personId : personIds) { - List personResourceLevels = resourcesPluginData.getPersonResourceLevels(personId); - Map expectedAmounts = new LinkedHashMap<>(); - for (ResourceId resourceId : resourcesPluginData.getResourceIds()) { - expectedAmounts.put(resourceId, 0L); - } - for (ResourceInitialization resourceInitialization : personResourceLevels) { - expectedAmounts.put(resourceInitialization.getResourceId(), resourceInitialization.getAmount()); + for (ResourceId resourceId : resourcesDataManager.getResourceIds()) { + List expectedResourceLevels = resourcesPluginData.getPersonResourceLevels(resourceId); + for (PersonId personId : personIds) { + long expectedLevel = 0L; + int personIndex = personId.getValue(); + if (personIndex < expectedResourceLevels.size()) { + Long value = expectedResourceLevels.get(personIndex); + if (value != null) { + expectedLevel = value; + } + } + long actualLevel = resourcesDataManager.getPersonResourceLevel(resourceId, personId); + assertEquals(expectedLevel, actualLevel); } - for (ResourceId resourceId : resourcesPluginData.getResourceIds()) { - Long expectedAmount = expectedAmounts.get(resourceId); - long actualAmount = resourcesDataManager.getPersonResourceLevel(resourceId, personId); - assertEquals(expectedAmount, actualAmount); + } + + for (ResourceId resourceId : resourcesDataManager.getResourceIds()) { + boolean trackTimes = resourcesPluginData.getResourceTimeTrackingPolicy(resourceId); + if (trackTimes) { + List expectedResourceTimes = resourcesPluginData.getPersonResourceTimes(resourceId); + Double resourceDefaultTime = resourcesPluginData.getResourceDefaultTime(resourceId); + for (PersonId personId : personIds) { + double expectedTime = resourceDefaultTime; + int personIndex = personId.getValue(); + if (personIndex < expectedResourceTimes.size()) { + Double time = expectedResourceTimes.get(personIndex); + if (time != null) { + expectedTime = time; + } + } + double actualTime = resourcesDataManager.getPersonResourceTime(resourceId, personId); + assertEquals(expectedTime, actualTime); + } } } + for (ResourceId resourceId : resourcesPluginData.getResourceIds()) { Set expectedResourcePropertyIds = resourcesPluginData.getResourcePropertyIds(resourceId); Set actualResourcePropertyIds = resourcesDataManager.getResourcePropertyIds(resourceId); @@ -4054,19 +3906,19 @@ public void testGetEventFilterForResourceIdAdditionEvent() { pluginBuilder.addTestActorPlan("actor", new TestActorPlan(1, (c) -> { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - TimeTrackingPolicy timeTrackingPolicy = TimeTrackingPolicy.DO_NOT_TRACK_TIME; + boolean timeTrackingPolicy = false; assertFalse(resourcesDataManager.resourceIdExists(newResourceId1)); resourcesDataManager.addResourceId(newResourceId1, timeTrackingPolicy); - MultiKey multiKey = new MultiKey(c.getTime(), newResourceId1, TimeTrackingPolicy.DO_NOT_TRACK_TIME); + MultiKey multiKey = new MultiKey(c.getTime(), newResourceId1, false); expectedObservations.add(multiKey); })); pluginBuilder.addTestActorPlan("actor", new TestActorPlan(2, (c) -> { ResourcesDataManager resourcesDataManager = c.getDataManager(ResourcesDataManager.class); - TimeTrackingPolicy timeTrackingPolicy = TimeTrackingPolicy.TRACK_TIME; + boolean timeTrackingPolicy = true; assertFalse(resourcesDataManager.resourceIdExists(newResourceId2)); resourcesDataManager.addResourceId(newResourceId2, timeTrackingPolicy); - MultiKey multiKey = new MultiKey(c.getTime(), newResourceId2, TimeTrackingPolicy.TRACK_TIME); + MultiKey multiKey = new MultiKey(c.getTime(), newResourceId2, true); expectedObservations.add(multiKey); })); diff --git a/gcm4/src/test/java/plugins/resources/events/AT_ResourceIdAdditionEvent.java b/gcm4/src/test/java/plugins/resources/events/AT_ResourceIdAdditionEvent.java index d859189bb..c8100bdaf 100644 --- a/gcm4/src/test/java/plugins/resources/events/AT_ResourceIdAdditionEvent.java +++ b/gcm4/src/test/java/plugins/resources/events/AT_ResourceIdAdditionEvent.java @@ -7,8 +7,6 @@ import plugins.resources.support.ResourceError; import plugins.resources.support.ResourceId; -import plugins.resources.testsupport.TestResourceId; -import plugins.util.properties.PropertyError; import plugins.util.properties.TimeTrackingPolicy; import util.annotations.UnitTestConstructor; import util.annotations.UnitTestMethod; @@ -19,16 +17,10 @@ public class AT_ResourceIdAdditionEvent { @Test @UnitTestConstructor(target = ResourceIdAdditionEvent.class, args = { ResourceId.class, TimeTrackingPolicy.class }) public void testConstructor() { - TimeTrackingPolicy timeTrackingPolicy = TimeTrackingPolicy.TRACK_TIME; - TestResourceId testResourceId = TestResourceId.RESOURCE_1; - + // test case: null resource id - ContractException resourceIdContractException = assertThrows(ContractException.class, () -> new ResourceIdAdditionEvent(null, timeTrackingPolicy)); + ContractException resourceIdContractException = assertThrows(ContractException.class, () -> new ResourceIdAdditionEvent(null, true)); assertEquals(resourceIdContractException.getErrorType(), ResourceError.NULL_RESOURCE_ID); - - // test case: null time tracking policy - ContractException timeContractException = assertThrows(ContractException.class, () -> new ResourceIdAdditionEvent(testResourceId, null)); - assertEquals(timeContractException.getErrorType(), PropertyError.NULL_TIME_TRACKING_POLICY); } @Test diff --git a/gcm4/src/test/java/plugins/resources/reports/AT_ResourcePropertyReport.java b/gcm4/src/test/java/plugins/resources/reports/AT_ResourcePropertyReport.java index 24ee978f0..538980039 100644 --- a/gcm4/src/test/java/plugins/resources/reports/AT_ResourcePropertyReport.java +++ b/gcm4/src/test/java/plugins/resources/reports/AT_ResourcePropertyReport.java @@ -191,7 +191,7 @@ public void testInit() { ResourcesPluginData.Builder resourcesBuilder = ResourcesPluginData.builder(); for (TestResourceId testResourceId : TestResourceId.values()) { - resourcesBuilder.addResource(testResourceId); + resourcesBuilder.addResource(testResourceId,0.0); resourcesBuilder.setResourceTimeTracking(testResourceId, testResourceId.getTimeTrackingPolicy()); } diff --git a/gcm4/src/test/java/plugins/resources/testsupport/AT_ResourcesTestPluginFactory.java b/gcm4/src/test/java/plugins/resources/testsupport/AT_ResourcesTestPluginFactory.java index 3856af9ad..90173f142 100644 --- a/gcm4/src/test/java/plugins/resources/testsupport/AT_ResourcesTestPluginFactory.java +++ b/gcm4/src/test/java/plugins/resources/testsupport/AT_ResourcesTestPluginFactory.java @@ -46,7 +46,6 @@ import plugins.stochastics.support.StochasticsError; import plugins.stochastics.support.WellState; import plugins.util.properties.PropertyDefinition; -import plugins.util.properties.TimeTrackingPolicy; import util.annotations.UnitTestMethod; import util.errors.ContractException; import util.random.RandomGeneratorProvider; @@ -318,8 +317,8 @@ public void testGetStandardResourcesPluginData() { assertEquals(expectedResourceIds, actualResourceIds); for (TestResourceId resourceId : TestResourceId.values()) { - TimeTrackingPolicy expectedPolicy = resourceId.getTimeTrackingPolicy(); - TimeTrackingPolicy actualPolicy = resourcesPluginData.getPersonResourceTimeTrackingPolicy(resourceId); + boolean expectedPolicy = resourceId.getTimeTrackingPolicy(); + boolean actualPolicy = resourcesPluginData.getResourceTimeTrackingPolicy(resourceId); assertEquals(expectedPolicy, actualPolicy); } diff --git a/translation/gcm-protobuf-translation/pom.xml b/translation/gcm-protobuf-translation/pom.xml index 5314ced17..af1bd87e2 100644 --- a/translation/gcm-protobuf-translation/pom.xml +++ b/translation/gcm-protobuf-translation/pom.xml @@ -29,7 +29,7 @@ 2.3.0-SNAPSHOT - 1.4.0 + 1.6.0 4.0.0-SNAPSHOT 3.21.12 5.8.2 diff --git a/translation/gcm-protobuf-translation/proto-definitions/pom.xml b/translation/gcm-protobuf-translation/proto-definitions/pom.xml index 3f222bee5..9b2d45db9 100644 --- a/translation/gcm-protobuf-translation/proto-definitions/pom.xml +++ b/translation/gcm-protobuf-translation/proto-definitions/pom.xml @@ -5,7 +5,7 @@ gov.hhs.aspr.gcm.translation.protobuf proto-definitions - 1.4.0 + 1.6.0 gcm.translation :: protobuf :: proto-definitions jar diff --git a/translation/gcm-protobuf-translation/proto-definitions/src/gov/hhs/aspr/gcm/translation/protobuf/resources/resources-plugin.proto b/translation/gcm-protobuf-translation/proto-definitions/src/gov/hhs/aspr/gcm/translation/protobuf/resources/resources-plugin.proto index 0fc900591..f57e30f4c 100644 --- a/translation/gcm-protobuf-translation/proto-definitions/src/gov/hhs/aspr/gcm/translation/protobuf/resources/resources-plugin.proto +++ b/translation/gcm-protobuf-translation/proto-definitions/src/gov/hhs/aspr/gcm/translation/protobuf/resources/resources-plugin.proto @@ -14,29 +14,19 @@ message ResourceIdInput { google.protobuf.Any id = 1; } -enum TestResourceIdInput { - RESOURCE_1 = 0; - RESOURCE_2 = 1; - RESOURCE_3 = 2; - RESOURCE_4 = 3; - RESOURCE_5 = 4; -} - message ResourcePropertyIdInput { google.protobuf.Any id = 1; } -enum TestResourcePropertyIdInput { - ResourceProperty_1_1_BOOLEAN_MUTABLE = 0; - ResourceProperty_1_2_INTEGER_MUTABLE = 1; - ResourceProperty_1_3_DOUBLE_MUTABLE = 2; - ResourceProperty_2_1_BOOLEAN_MUTABLE = 3; - ResourceProperty_2_2_INTEGER_MUTABLE = 4; - ResourceProperty_3_1_BOOLEAN_MUTABLE = 5; - ResourceProperty_3_2_STRING_MUTABLE = 6; - ResourceProperty_4_1_BOOLEAN_MUTABLE = 7; - ResourceProperty_5_1_INTEGER_IMMUTABLE = 8; - ResourceProperty_5_2_DOUBLE_IMMUTABLE = 9; +message ResourceIdMapInput { + ResourceIdInput resourceId = 1; + double resourceTime = 2; + bool resourceTimeTrackingPolicy = 3; +} + +message ResourcePropertyDefinitionMapInput { + ResourceIdInput resourceId = 1; + PropertyDefinitionMapInput resourcePropertyDefinitionMap = 2; } message ResourceInitializationInput { @@ -44,9 +34,15 @@ message ResourceInitializationInput { int64 amount = 2; } -message ResourcePropertyDefinitionMapInput { - ResourceIdInput resourceId = 1; - PropertyDefinitionMapInput resourcePropertyDefinitionMap = 2; +message PersonResourceInput { + int32 personId = 1; + optional int64 amount = 2; + optional double resourceTime = 3; +} + +message RegionResourceInput { + RegionIdInput regionId = 1; + int64 amount = 2; } message ResourcePropertyValueMapInput { @@ -55,27 +51,21 @@ message ResourcePropertyValueMapInput { } message PersonResourceLevelsInput { - PersonIdInput personId = 1; - repeated ResourceInitializationInput resourceLevels = 2; + ResourceIdInput resourceId = 1; + repeated PersonResourceInput personResourceLevels = 2; } message RegionResourceLevelsInput { - RegionIdInput regionId = 1; - repeated ResourceInitializationInput resourceLevels = 2; -} - -message ResourceTimeTrackingPolicyMapInput { ResourceIdInput resourceId = 1; - TimeTrackingPolicyInput timeTrackingPolicy = 2; + repeated RegionResourceInput regionResourceLevels = 2; } message ResourcesPluginDataInput { - repeated ResourceIdInput resourceIds = 1; + repeated ResourceIdMapInput resourceIds = 1; repeated ResourcePropertyDefinitionMapInput resourcePropertyDefinitions = 2; repeated ResourcePropertyValueMapInput resourcePropertyValues = 3; repeated PersonResourceLevelsInput personResourceLevels = 4; repeated RegionResourceLevelsInput regionResourceLevels = 5; - repeated ResourceTimeTrackingPolicyMapInput resourceTimeTrackingPolicies = 6; } message PersonResourceReportPluginDataInput { @@ -97,3 +87,24 @@ message ResourceReportPluginDataInput { repeated ResourceIdInput excludedProperties = 4; bool defaultInclusionPolicy = 5; } + +enum TestResourcePropertyIdInput { + ResourceProperty_1_1_BOOLEAN_MUTABLE = 0; + ResourceProperty_1_2_INTEGER_MUTABLE = 1; + ResourceProperty_1_3_DOUBLE_MUTABLE = 2; + ResourceProperty_2_1_BOOLEAN_MUTABLE = 3; + ResourceProperty_2_2_INTEGER_MUTABLE = 4; + ResourceProperty_3_1_BOOLEAN_MUTABLE = 5; + ResourceProperty_3_2_STRING_MUTABLE = 6; + ResourceProperty_4_1_BOOLEAN_MUTABLE = 7; + ResourceProperty_5_1_INTEGER_IMMUTABLE = 8; + ResourceProperty_5_2_DOUBLE_IMMUTABLE = 9; +} + +enum TestResourceIdInput { + RESOURCE_1 = 0; + RESOURCE_2 = 1; + RESOURCE_3 = 2; + RESOURCE_4 = 3; + RESOURCE_5 = 4; +} \ No newline at end of file diff --git a/translation/gcm-protobuf-translation/resources-plugin-translator/src/main/java/gov/hhs/aspr/gcm/translation/protobuf/plugins/resources/ResourcesTranslator.java b/translation/gcm-protobuf-translation/resources-plugin-translator/src/main/java/gov/hhs/aspr/gcm/translation/protobuf/plugins/resources/ResourcesTranslator.java index 7f0c27cab..759f116e7 100644 --- a/translation/gcm-protobuf-translation/resources-plugin-translator/src/main/java/gov/hhs/aspr/gcm/translation/protobuf/plugins/resources/ResourcesTranslator.java +++ b/translation/gcm-protobuf-translation/resources-plugin-translator/src/main/java/gov/hhs/aspr/gcm/translation/protobuf/plugins/resources/ResourcesTranslator.java @@ -1,7 +1,5 @@ package gov.hhs.aspr.gcm.translation.protobuf.plugins.resources; -import gov.hhs.aspr.translation.core.Translator; -import gov.hhs.aspr.translation.protobuf.core.ProtobufTranslationEngine; import gov.hhs.aspr.gcm.translation.protobuf.plugins.people.PeopleTranslatorId; import gov.hhs.aspr.gcm.translation.protobuf.plugins.properties.PropertiesTranslatorId; import gov.hhs.aspr.gcm.translation.protobuf.plugins.regions.RegionsTranslatorId; @@ -15,6 +13,8 @@ import gov.hhs.aspr.gcm.translation.protobuf.plugins.resources.translationSpecs.ResourcesPluginDataTranslationSpec; import gov.hhs.aspr.gcm.translation.protobuf.plugins.resources.translationSpecs.TestResourceIdTranslationSpec; import gov.hhs.aspr.gcm.translation.protobuf.plugins.resources.translationSpecs.TestResourcePropertyIdTranslationSpec; +import gov.hhs.aspr.translation.core.Translator; +import gov.hhs.aspr.translation.protobuf.core.ProtobufTranslationEngine; public class ResourcesTranslator { diff --git a/translation/gcm-protobuf-translation/resources-plugin-translator/src/main/java/gov/hhs/aspr/gcm/translation/protobuf/plugins/resources/translationSpecs/ResourcesPluginDataTranslationSpec.java b/translation/gcm-protobuf-translation/resources-plugin-translator/src/main/java/gov/hhs/aspr/gcm/translation/protobuf/plugins/resources/translationSpecs/ResourcesPluginDataTranslationSpec.java index 0c238dfe0..a6e347714 100644 --- a/translation/gcm-protobuf-translation/resources-plugin-translator/src/main/java/gov/hhs/aspr/gcm/translation/protobuf/plugins/resources/translationSpecs/ResourcesPluginDataTranslationSpec.java +++ b/translation/gcm-protobuf-translation/resources-plugin-translator/src/main/java/gov/hhs/aspr/gcm/translation/protobuf/plugins/resources/translationSpecs/ResourcesPluginDataTranslationSpec.java @@ -1,20 +1,22 @@ package gov.hhs.aspr.gcm.translation.protobuf.plugins.resources.translationSpecs; +import java.util.ArrayList; import java.util.List; -import gov.hhs.aspr.gcm.translation.protobuf.plugins.people.input.PersonIdInput; +import org.apache.commons.math3.util.FastMath; + import gov.hhs.aspr.gcm.translation.protobuf.plugins.properties.input.PropertyDefinitionInput; import gov.hhs.aspr.gcm.translation.protobuf.plugins.properties.input.PropertyDefinitionMapInput; import gov.hhs.aspr.gcm.translation.protobuf.plugins.properties.input.PropertyValueMapInput; -import gov.hhs.aspr.gcm.translation.protobuf.plugins.properties.input.TimeTrackingPolicyInput; import gov.hhs.aspr.gcm.translation.protobuf.plugins.regions.input.RegionIdInput; +import gov.hhs.aspr.gcm.translation.protobuf.plugins.resources.input.PersonResourceInput; import gov.hhs.aspr.gcm.translation.protobuf.plugins.resources.input.PersonResourceLevelsInput; +import gov.hhs.aspr.gcm.translation.protobuf.plugins.resources.input.RegionResourceInput; import gov.hhs.aspr.gcm.translation.protobuf.plugins.resources.input.RegionResourceLevelsInput; import gov.hhs.aspr.gcm.translation.protobuf.plugins.resources.input.ResourceIdInput; -import gov.hhs.aspr.gcm.translation.protobuf.plugins.resources.input.ResourceInitializationInput; +import gov.hhs.aspr.gcm.translation.protobuf.plugins.resources.input.ResourceIdMapInput; import gov.hhs.aspr.gcm.translation.protobuf.plugins.resources.input.ResourcePropertyDefinitionMapInput; import gov.hhs.aspr.gcm.translation.protobuf.plugins.resources.input.ResourcePropertyValueMapInput; -import gov.hhs.aspr.gcm.translation.protobuf.plugins.resources.input.ResourceTimeTrackingPolicyMapInput; import gov.hhs.aspr.gcm.translation.protobuf.plugins.resources.input.ResourcesPluginDataInput; import gov.hhs.aspr.translation.protobuf.core.ProtobufTranslationSpec; import plugins.people.support.PersonId; @@ -24,7 +26,6 @@ import plugins.resources.support.ResourceInitialization; import plugins.resources.support.ResourcePropertyId; import plugins.util.properties.PropertyDefinition; -import plugins.util.properties.TimeTrackingPolicy; public class ResourcesPluginDataTranslationSpec extends ProtobufTranslationSpec { @@ -33,9 +34,12 @@ public class ResourcesPluginDataTranslationSpec protected ResourcesPluginData convertInputObject(ResourcesPluginDataInput inputObject) { ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); - for (ResourceIdInput resourceIdInput : inputObject.getResourceIdsList()) { - ResourceId resourceId = this.translationEngine.convertObject(resourceIdInput); - builder.addResource(resourceId); + for (ResourceIdMapInput resourceIdInput : inputObject.getResourceIdsList()) { + ResourceId resourceId = this.translationEngine.convertObject(resourceIdInput.getResourceId()); + builder + .addResource(resourceId, resourceIdInput.getResourceTime()) + .setResourceTimeTracking(resourceId, + resourceIdInput.getResourceTimeTrackingPolicy()); } for (ResourcePropertyDefinitionMapInput resourcePropertyDefinitionMapInput : inputObject @@ -70,43 +74,33 @@ protected ResourcesPluginData convertInputObject(ResourcesPluginDataInput inputO } for (PersonResourceLevelsInput personResourceLevelsInput : inputObject.getPersonResourceLevelsList()) { - PersonId personId = this.translationEngine - .convertObject(personResourceLevelsInput.getPersonId()); + ResourceId resourceId = this.translationEngine.convertObject(personResourceLevelsInput.getResourceId()); + + for (PersonResourceInput personResourceInput : personResourceLevelsInput.getPersonResourceLevelsList()) { + PersonId personId = this.translationEngine + .convertObject(personResourceInput.getPersonId()); - for (ResourceInitializationInput resourceInitializationInput : personResourceLevelsInput - .getResourceLevelsList()) { - ResourceId resourceId = this.translationEngine.convertObject( - resourceInitializationInput.getResourceId()); - Long amount = resourceInitializationInput.getAmount(); + if (personResourceInput.hasAmount()) { + builder.setPersonResourceLevel(personId, resourceId, personResourceInput.getAmount()); + } - builder.setPersonResourceLevel(personId, resourceId, amount); + if (personResourceInput.hasResourceTime()) { + builder.setPersonResourceTime(personId, resourceId, personResourceInput.getResourceTime()); + } } } for (RegionResourceLevelsInput regionResourceLevelsInput : inputObject.getRegionResourceLevelsList()) { - RegionId regionId = this.translationEngine - .convertObject(regionResourceLevelsInput.getRegionId()); + ResourceId resourceId = this.translationEngine.convertObject(regionResourceLevelsInput.getResourceId()); - for (ResourceInitializationInput resourceInitializationInput : regionResourceLevelsInput - .getResourceLevelsList()) { - ResourceId resourceId = this.translationEngine.convertObject( - resourceInitializationInput.getResourceId()); - Long amount = resourceInitializationInput.getAmount(); + for (RegionResourceInput regionResourceInput : regionResourceLevelsInput.getRegionResourceLevelsList()) { + RegionId regionId = this.translationEngine + .convertObject(regionResourceInput.getRegionId()); - builder.setRegionResourceLevel(regionId, resourceId, amount); + builder.setRegionResourceLevel(regionId, resourceId, regionResourceInput.getAmount()); } } - for (ResourceTimeTrackingPolicyMapInput resourceTimeTrackingPolicyMapInput : inputObject - .getResourceTimeTrackingPoliciesList()) { - ResourceId resourceId = this.translationEngine.convertObject( - resourceTimeTrackingPolicyMapInput.getResourceId()); - TimeTrackingPolicy timeTrackingPolicy = this.translationEngine - .convertObject(resourceTimeTrackingPolicyMapInput.getTimeTrackingPolicy()); - - builder.setResourceTimeTracking(resourceId, timeTrackingPolicy); - } - return builder.build(); } @@ -150,63 +144,92 @@ protected ResourcesPluginDataInput convertAppObject(ResourcesPluginData appObjec .setResourcePropertyValueMap(propertyValueMapInput) .setResourceId(resourceIdInput); - builder.addResourcePropertyDefinitions(resourcePropDefBuilder.build()); - builder.addResourcePropertyValues(resourcePropValBuilder.build()); + builder + .addResourcePropertyDefinitions(resourcePropDefBuilder.build()) + .addResourcePropertyValues(resourcePropValBuilder.build()); } - TimeTrackingPolicyInput timeTrackingPolicyInput = this.translationEngine - .convertObject(appObject.getPersonResourceTimeTrackingPolicy(resourceId)); - ResourceTimeTrackingPolicyMapInput resourceTimeTrackingPolicyMapInput = ResourceTimeTrackingPolicyMapInput - .newBuilder() + ResourceIdMapInput resourceIdMapInput = ResourceIdMapInput.newBuilder() .setResourceId(resourceIdInput) - .setTimeTrackingPolicy(timeTrackingPolicyInput) + .setResourceTime(appObject.getResourceDefaultTime(resourceId)) + .setResourceTimeTrackingPolicy(appObject.getResourceTimeTrackingPolicy(resourceId)) .build(); + builder.addResourceIds(resourceIdMapInput); - builder.addResourceTimeTrackingPolicies(resourceTimeTrackingPolicyMapInput); + List personResourceInputBuilders = new ArrayList<>(); - builder.addResourceIds(resourceIdInput); - } + List resourceLevels = appObject.getPersonResourceLevels(resourceId); + List resourceTimes = appObject.getPersonResourceTimes(resourceId); + + int maxPersonId = FastMath.max(resourceLevels.size(), resourceTimes.size()); - for (int i = 0; i < appObject.getPersonCount(); i++) { - PersonId personId = new PersonId(i); + // prepopulate nulls based on max personId + for (int i = 0; i < maxPersonId; i++) { + personResourceInputBuilders.add(null); + } + + for (int i = 0; i < resourceLevels.size(); i++) { + if (resourceLevels.get(i) != null) { + PersonResourceInput.Builder personResourceInputBuilder = PersonResourceInput.newBuilder() + .setAmount(resourceLevels.get(i)) + .setPersonId(i); + + personResourceInputBuilders.set(i, personResourceInputBuilder); + } + } - List personResourceLevels = appObject.getPersonResourceLevels(personId); + for (int i = 0; i < resourceTimes.size(); i++) { + if (resourceTimes.get(i) != null) { + PersonResourceInput.Builder personResourceInputBuilder = PersonResourceInput + .newBuilder(); + // check for and use existing builder, if there is one + if (personResourceInputBuilders.get(i) != null) { + personResourceInputBuilder = personResourceInputBuilders.get(i); - if (!personResourceLevels.isEmpty()) { - PersonIdInput personIdInput = this.translationEngine.convertObject(personId); - PersonResourceLevelsInput.Builder personResourceLevelsBuilder = PersonResourceLevelsInput - .newBuilder() - .setPersonId(personIdInput); + personResourceInputBuilder.setResourceTime(resourceTimes.get(i)); - for (ResourceInitialization resourceInitialization : personResourceLevels) { - ResourceInitializationInput resourceInitializationInput = this.translationEngine - .convertObject(resourceInitialization); + } else { + personResourceInputBuilder + .setPersonId(i) + .setResourceTime(resourceTimes.get(i)); + } - personResourceLevelsBuilder.addResourceLevels(resourceInitializationInput); + personResourceInputBuilders.set(i, personResourceInputBuilder); } + } + + PersonResourceLevelsInput.Builder personLevelsInput = PersonResourceLevelsInput.newBuilder() + .setResourceId(resourceIdInput); - builder.addPersonResourceLevels(personResourceLevelsBuilder.build()); + for (PersonResourceInput.Builder personResourceBuilder : personResourceInputBuilders) { + if (personResourceBuilder != null) { + personLevelsInput.addPersonResourceLevels(personResourceBuilder.build()); + } } - } - for (RegionId regionId : appObject.getRegionIds()) { - List regionResourceLevels = appObject.getRegionResourceLevels(regionId); + builder.addPersonResourceLevels(personLevelsInput.build()); + + for (RegionId regionId : appObject.getRegionIds()) { + List regionResourceLevels = appObject.getRegionResourceLevels(regionId); - if (!regionResourceLevels.isEmpty()) { - RegionIdInput regionIdInput = this.translationEngine.convertObjectAsSafeClass(regionId, - RegionId.class); + if (!regionResourceLevels.isEmpty()) { + RegionIdInput regionIdInput = this.translationEngine.convertObjectAsSafeClass(regionId, + RegionId.class); - RegionResourceLevelsInput.Builder regionResourceLevelsBuilder = RegionResourceLevelsInput - .newBuilder() - .setRegionId(regionIdInput); + RegionResourceLevelsInput.Builder regionResourceLevelsBuilder = RegionResourceLevelsInput + .newBuilder() + .setResourceId(resourceIdInput); - for (ResourceInitialization resourceInitialization : regionResourceLevels) { - ResourceInitializationInput resourceInitializationInput = this.translationEngine - .convertObject(resourceInitialization); + for (ResourceInitialization resourceInitialization : regionResourceLevels) { + RegionResourceInput regionResourceInput = RegionResourceInput.newBuilder() + .setRegionId(regionIdInput) + .setAmount(resourceInitialization.getAmount()) + .build(); - regionResourceLevelsBuilder.addResourceLevels(resourceInitializationInput); + regionResourceLevelsBuilder.addRegionResourceLevels(regionResourceInput); + } + builder.addRegionResourceLevels(regionResourceLevelsBuilder.build()); } - builder.addRegionResourceLevels(regionResourceLevelsBuilder.build()); } } diff --git a/tutorials/plugins/gcm4_lesson_18_resources_plugin/src/main/java/lesson/Example_18.java b/tutorials/plugins/gcm4_lesson_18_resources_plugin/src/main/java/lesson/Example_18.java index 3fcb1a4fb..6e892ff80 100644 --- a/tutorials/plugins/gcm4_lesson_18_resources_plugin/src/main/java/lesson/Example_18.java +++ b/tutorials/plugins/gcm4_lesson_18_resources_plugin/src/main/java/lesson/Example_18.java @@ -54,7 +54,7 @@ private Example_18(Path outputDirectory) { private Plugin getResourcesPlugin() { ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); for (ResourceId resourcId : Resource.values()) { - builder.addResource(resourcId); + builder.addResource(resourcId,0.0); } ResourcesPluginData resourcesPluginData = builder.build(); diff --git a/tutorials/plugins/gcm4_lesson_19_materials_plugin/src/main/java/lesson/Example_19.java b/tutorials/plugins/gcm4_lesson_19_materials_plugin/src/main/java/lesson/Example_19.java index 9970f57e9..b08f7244b 100644 --- a/tutorials/plugins/gcm4_lesson_19_materials_plugin/src/main/java/lesson/Example_19.java +++ b/tutorials/plugins/gcm4_lesson_19_materials_plugin/src/main/java/lesson/Example_19.java @@ -280,7 +280,7 @@ private NIOReportItemHandler getNIOReportItemHandler() { private Plugin getResourcesPlugin() { final ResourcesPluginData.Builder builder = ResourcesPluginData.builder(); for (final ResourceId resourcId : Resource.values()) { - builder.addResource(resourcId); + builder.addResource(resourcId,0.0); } final ResourcesPluginData resourcesPluginData = builder.build(); return ResourcesPlugin.builder().setResourcesPluginData(resourcesPluginData).getResourcesPlugin();