internal static void PopulateTraitProvider <T>(MARSTraitDataProvider <T> provider,
                                                       Dictionary <int, T> data, string traitNamePrefix = "", int count = 1)
        {
            for (int i = 0; i < count; i++)
            {
                var traitName = string.IsNullOrEmpty(traitNamePrefix)
                    ? TraitNameForIndex <T>(i)
                    : count == 1 ? traitNamePrefix                    // inserts an exact trait name
                        : string.Format("{0}{1}", traitNamePrefix, i);

                foreach (var kvp in data)
                {
                    provider.AddOrUpdateTrait(kvp.Key, traitName, kvp.Value);
                }
            }
        }
        public void AddGetRemove_TraitValue <T>(int id, string traitName, T traitValue)
        {
            var provider = new MARSTraitDataProvider <T>(dataId => { }, m_Db);

            provider.AddOrUpdateTrait(id, traitName, traitValue);

            T retrievedValue;

            provider.TryGetTraitValue(id, traitName, out retrievedValue);
            Assert.AreEqual(traitValue, retrievedValue);

            Assert.True(provider.RemoveTrait(id, traitName));

            T postRemovalValue;

            Assert.False(provider.TryGetTraitValue(id, traitName, out postRemovalValue));
            Assert.AreEqual(default(T), postRemovalValue);
        }