public void RateConditionMatches_TraitCacheUnfulfilled_ReturnsFalse()
        {
            m_GameObject.AddSemanticTagCondition("tagTrait");
            SetupObject(m_GameObject);

            Assert.False(MatchRatingDataTransform.RateConditionMatches(m_Conditions, m_TraitCache, m_ConditionRatings));
        }
        public void MatchRatingDataTransform_SingleEntry()
        {
            DatabaseTestData.PopulateDatabase(m_Db, 3);
            m_GameObject.AddTestFloatCondition();
            m_GameObject.AddTestVector2Condition(0.9f);
            SetupObject(m_GameObject);

            // TODO - better test for this stage now that it filters indices
            MatchRatingDataTransform.RateConditionMatches(m_Conditions, m_TraitCache, m_ConditionRatings);
            Assert.AreEqual(7, m_ConditionRatings[typeof(float)][0].Count);
            Assert.AreEqual(7, m_ConditionRatings[typeof(Vector2)][0].Count);
        }
        public void RateConditionMatches_NoConditionsMet_ReturnsFalse_WithEmptyRatingSets()
        {
            // all our test trait values are far below 90 / 100, so both should have no matches
            m_GameObject.AddTestFloatCondition(0, 90f);
            m_GameObject.AddTestVector2Condition(100f);
            m_GameObject.AddSemanticTagCondition("traitNotFound");

            SetupObject(m_GameObject);
            Assert.False(MatchRatingDataTransform.RateConditionMatches(m_Conditions, m_TraitCache, m_ConditionRatings));
            Assert.AreEqual(0, m_ConditionRatings[typeof(float)][0].Count);
            Assert.AreEqual(0, m_ConditionRatings[typeof(Vector2)][0].Count);
            Assert.AreEqual(0, m_ConditionRatings[typeof(bool)][0].Count);
        }
        public void RateConditionMatches_SomeConditionsMet_ReturnsFalse()
        {
            m_GameObject.AddTestFloatCondition();
            m_GameObject.AddTestFloatCondition(1, 100f);        // this one will not match
            m_GameObject.AddTestVector2Condition(0.9f);
            SetupObject(m_GameObject);

            Assert.False(MatchRatingDataTransform.RateConditionMatches(m_Conditions, m_TraitCache, m_ConditionRatings));
            Assert.AreEqual(7, m_ConditionRatings[typeof(float)][0].Count);
            Assert.AreEqual(0, m_ConditionRatings[typeof(float)][1].Count);

            // even though this condition would receive some valid ratings based on our data,
            // because a previous condition had 0 matches, we early-out and don't generate ratings for the rest.
            Assert.AreEqual(0, m_ConditionRatings[typeof(Vector2)][0].Count);
        }
        public void RateConditionMatchesGeneric_AllConditionsMetReturnsTrue_WithFilledRatingSets()
        {
            var floatCondition1 = m_GameObject.AddTestFloatCondition();
            var floatCondition2 = m_GameObject.AddTestFloatCondition(1, 0.2f);

            var conditions = new ICondition <float>[] { floatCondition1, floatCondition2 };
            var ratings    = NewRatingsCollection(2);

            var traitValues1 = m_FloatTraits.dictionary[floatCondition1.traitName];
            var traitValues2 = m_FloatTraits.dictionary[floatCondition2.traitName];
            var traitRefs    = new List <Dictionary <int, float> > {
                traitValues1, traitValues2
            };

            Assert.True(MatchRatingDataTransform.RateConditionMatches(conditions, traitRefs, ratings));
            Assert.AreEqual(7, ratings[0].Count);
            Assert.AreEqual(6, ratings[1].Count);
        }
        public void RateConditionMatchesGeneric_NoConditionsMet_ReturnsFalse()
        {
            var floatCondition1 = m_GameObject.AddTestFloatCondition(0, 90f);
            // all our test trait values are far below 100, so this should have no matches
            var floatCondition2 = m_GameObject.AddTestFloatCondition(1, 100f);

            var conditions = new ICondition <float>[] { floatCondition1, floatCondition2 };
            var ratings    = NewRatingsCollection(2);

            var traitValues1 = m_FloatTraits.dictionary[floatCondition1.traitName];
            var traitValues2 = m_FloatTraits.dictionary[floatCondition2.traitName];
            var traitRefs    = new List <Dictionary <int, float> > {
                traitValues1, traitValues2
            };

            Assert.False(MatchRatingDataTransform.RateConditionMatches(conditions, traitRefs, ratings));
            Assert.AreEqual(0, ratings[0].Count);
            Assert.AreEqual(0, ratings[1].Count);
        }
        public void RateConditionMatches_AllConditionsMet_ReturnsTrueWithAllProposals()
        {
            m_GameObject.AddTestFloatCondition();
            m_GameObject.AddTestVector2Condition(0.9f);
            var matchingTagCondition = m_GameObject.AddSemanticTagCondition("tagTrait");

            m_Db.GetTraitProvider(out MARSTraitDataProvider <bool> semanticTagProvider);
            foreach (var kvp in DatabaseTestData.FloatTraits)
            {
                semanticTagProvider.AddOrUpdateTrait(kvp.Key, matchingTagCondition.traitName, true);
            }

            SetupObject(m_GameObject);

            Assert.True(MatchRatingDataTransform.RateConditionMatches(m_Conditions, m_TraitCache, m_ConditionRatings));
            Assert.AreEqual(7, m_ConditionRatings[typeof(float)][0].Count);
            Assert.AreEqual(7, m_ConditionRatings[typeof(Vector2)][0].Count);
            Assert.AreEqual(10, m_ConditionRatings[typeof(bool)][0].Count);
        }
        public void MatchRatingDataTransform_NonWorkingIndicesNotProcessed()
        {
            DatabaseTestData.PopulateDatabase(m_Db, 3);
            m_GameObject.AddTestFloatCondition();
            m_GameObject.AddTestVector2Condition(0.9f);
            SetupObject(m_GameObject);

            var dataTransform = new MatchRatingDataTransform
            {
                WorkingIndices = new List <int> {
                    1
                },
                Input1 = new [] { m_Conditions, m_Conditions },
                Input2 = new [] { m_TraitCache, m_TraitCache },
                Output = new [] { m_ConditionRatings, new ConditionRatingsData(m_Conditions) },
            };

            dataTransform.Complete();
            Assert.Zero(dataTransform.Output[0][typeof(float)][0].Count);          // index 0 wasn't processed, so no matches
            Assert.Zero(dataTransform.Output[0][typeof(Vector2)][0].Count);
            // index 1 was processed, so has matches.  That we expect 7 is calculated by hand from the test data.
            Assert.AreEqual(7, dataTransform.Output[1][typeof(float)][0].Count);
            Assert.AreEqual(7, dataTransform.Output[1][typeof(Vector2)][0].Count);
        }