public void DeserializeTest(DistributedPropertySet data, ISettingsSerializer serializer)
        {
            IDistributedPropertySet result = null;
            var config = TestStartup.Configuration;

            try
            {
                result = serializer.Deserialize(serializer.Serialize(data));
            }
            catch (Exception e)
            {
                _output.WriteLine(e.ToString());
                e.Data.Keys.Cast <string>().ToList().ForEach(key => _output.WriteLine(e.Data[key].ToString()));
                throw;
            }

            Assert.NotNull(result);

            foreach (var key in data.Keys)
            {
                Assert.True(result.ContainsKey(key));
                _output.WriteLine($"{key}: {data[key]} {(data[key].Equals(result[key]) ? "==" : "!=")} {result[key]}");
                Assert.Equal(data[key], result[key]);
            }
        }
예제 #2
0
 public void BuildTests(DistributedPropertySet dataSet, ISettingsSerializer serializer)
 {
     Startup = TestStartup.Build(fileType: serializer switch
     {
         BinarySettingsSerializer binary => FileTypes.Binary,
         XmlSettingsSerializer xml => FileTypes.XML,
         YamlSettingsSerializer yaml => FileTypes.Other,
         _ => FileTypes.JSON
     });
        public IDistributedPropertySet Deserialize(byte[] source)
        {
            using var stream    = new MemoryStream(source);
            using var xmlReader = new XmlTextReader(stream);

            var data = new DistributedPropertySet();

            data.ReadXml(xmlReader);

            return(data);
        }
        public void AddOrUpdateTest_AddFactory(string name, object value)
        {
            var flag = false;
            var set  = new DistributedPropertySet();

            set.MapChanged += (sender, args) =>
            {
                Assert.Equal(DistributedCollectionChange.ItemInserted, args.DistributedCollectionChange);
                flag = true;
            };

            Assert.Equal(value, set.AddOrUpdate(name, n => value, null));
            Assert.True(flag);
        }
        public void ClearTest()
        {
            var set = new DistributedPropertySet();

            set.TryAdd("string", "0");
            set.TryAdd("int", int.MaxValue);
            set.TryAdd("uint", uint.MaxValue);
            set.TryAdd("double", double.MaxValue);

            Assert.NotEmpty(set);

            set.Clear();

            Assert.Empty(set);
        }
        public void TryAddTest(string name, object value)
        {
            var flag = false;
            var set  = new DistributedPropertySet();

            set.MapChanged += (sender, args) =>
            {
                if (args.DistributedCollectionChange == DistributedCollectionChange.ItemInserted)
                {
                    flag = true;
                }
            };

            Assert.True(set.TryAdd(name, value));
            Assert.Equal(value, set[name]);
            Assert.True(flag);
        }
        public void GetOrAddTest_AddFactoryWithArgument(string name, object value)
        {
            var flag = false;
            var set  = new DistributedPropertySet();

            set.MapChanged += (sender, args) =>
            {
                if (args.DistributedCollectionChange == DistributedCollectionChange.ItemInserted)
                {
                    flag = true;
                }
            };

            Assert.Equal(value, set.GetOrAdd(name, (n, arg) => arg, value));
            Assert.Equal(value, set.TryGetValue(name, out var outValue) ? outValue : null);
            Assert.True(flag);
        }
        public void AddOrUpdateTest_UpdateFactory(string name, object addValue, object updateValue)
        {
            var flag = false;
            var set  = new DistributedPropertySet();

            set.MapChanged += (sender, args) =>
            {
                if (args.DistributedCollectionChange == DistributedCollectionChange.ItemChanged)
                {
                    flag = true;
                }
            };

            Assert.True(set.TryAdd(name, addValue));
            Assert.Equal(updateValue, set.AddOrUpdate(name, n => addValue, (n, v) => updateValue));
            Assert.True(flag);
        }
        public void TryRemoveTest(string name, object value)
        {
            var flag = false;
            var set  = new DistributedPropertySet();

            set.MapChanged += (sender, args) =>
            {
                if (args.DistributedCollectionChange == DistributedCollectionChange.ItemRemoved)
                {
                    flag = true;
                }
            };

            Assert.True(set.TryAdd(name, value));
            Assert.True(set.TryRemove(name, out var outValue));
            Assert.Equal(value, outValue);
            Assert.False(set.ContainsKey(name));
            Assert.True(flag);
        }
        public IDistributedPropertySet Deserialize(byte[] source)
        {
            var yaml = Encoding.UTF8.GetString(source);
            var valueKindDictionary = new Deserializer().Deserialize <Dictionary <string, Pair> >(yaml);

            if (valueKindDictionary == null)
            {
                return(null);
            }

            var results = new DistributedPropertySet();

            valueKindDictionary.ToList().ForEach(pair =>
            {
                try
                {
                    var toParse = pair.Value.Value.ToString();

                    results.TryAdd(pair.Key, Type.GetType(pair.Value.Key)?.Name switch
                    {
                        nameof(String) => toParse,
                        nameof(Int16) => short.TryParse(toParse, out var parsed) ? parsed : default,
        public void NameNotFoundTryGetTest()
        {
            var set = new DistributedPropertySet();

            Assert.False(set.TryGetValue("string", out _));
        }
        public void NameNotFoundIndexerTest()
        {
            var set = new DistributedPropertySet();

            Assert.Throws <KeyNotFoundException>((Action)(() => _ = set["string"]));
        }
        public void NullNameTest()
        {
            var set = new DistributedPropertySet();

            Assert.Throws <ArgumentNullException>((Action)(() => set.TryAdd(null, null)));
        }
        public FilePersistenceManager(IServiceProvider provider
                                      , IConfiguration configuration
                                      , ISettingsMetadata metadata
                                      , IFilePersistenceProvider persistenceProvider)
        {
            _current = this;

            Configuration       = configuration;
            Metadata            = metadata;
            PersistenceProvider = persistenceProvider;

            LocalPath ??= configuration[SETTINGS_SYNC_DEFAULT_PATH_LOCAL] ??
            Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
                         metadata.AppName);

            if (!File.Exists(Path.Combine(LocalPath, Metadata.AppName + $".{PersistenceProvider.FileExtension}")))
            {
                var fileWriter = PersistenceProvider.FileType switch
                {
                    FileTypes.Binary => (IFilePersistenceProvider)provider.GetService <BinaryPersistenceProvider>(),
                    FileTypes.XML => (IFilePersistenceProvider)provider.GetService <XmlPersistenceProvider>(),
                    FileTypes.Other => (IFilePersistenceProvider)provider.GetService(
                        Assembly
                        .Load(configuration[SETTINGS_SYNC_SETTINGS_FILE_OTHER_PROVIDER_ASSEMBLY])
                        .GetType(configuration[SETTINGS_SYNC_SETTINGS_FILE_OTHER_PROVIDER])),
                    _ => (IFilePersistenceProvider)provider.GetService <JsonPersistenceProvider>()
                };

                var blankFile = new DistributedPropertySet();
                blankFile.SetValues(Metadata.BlankFile[SettingsScopes.Local]);

                fileWriter.WriteFile(Metadata.AppName, LocalPath, SettingsScopes.Local, blankFile);
            }
            var localData = PersistenceProvider.OpenFile(Metadata.AppName, LocalPath, SettingsScopes.Local);

            AddApplicationData(localData, SettingsScopes.Local);

            RoamingPath ??= configuration[SETTINGS_SYNC_DEFAULT_PATH_ROAMING] ??
            Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
                         "One Drive", metadata.AppName);

            if (!File.Exists(Path.Combine(RoamingPath, Metadata.AppName + $".{PersistenceProvider.FileExtension}")))
            {
                var fileWriter = PersistenceProvider.FileType switch
                {
                    FileTypes.Binary => (IFilePersistenceProvider)provider.GetService <BinaryPersistenceProvider>(),
                    FileTypes.XML => (IFilePersistenceProvider)provider.GetService <XmlPersistenceProvider>(),
                    FileTypes.Other => (IFilePersistenceProvider)provider.GetService(
                        Assembly
                        .Load(configuration[SETTINGS_SYNC_SETTINGS_FILE_OTHER_PROVIDER_ASSEMBLY])
                        .GetType(configuration[SETTINGS_SYNC_SETTINGS_FILE_OTHER_PROVIDER])),
                    _ => (IFilePersistenceProvider)provider.GetService <JsonPersistenceProvider>()
                };

                var blankFile = new DistributedPropertySet();
                blankFile.SetValues(Metadata.BlankFile[SettingsScopes.Roaming]);

                fileWriter.WriteFile(Metadata.AppName, RoamingPath, SettingsScopes.Roaming, blankFile);
            }

            var roamingData = PersistenceProvider.OpenFile(Metadata.AppName, RoamingPath, SettingsScopes.Roaming);

            AddApplicationData(localData, SettingsScopes.Roaming);
        }