public static void Save(GameSave save)
        {
            //ClearSave();
            var values = save.GetValues();

            using (var re = new RegistryEditor("Software\\Delve Interactive\\CHANGE"))
            {
                foreach (var kvp in values)
                {
                    var key = RegistryKeyMapper.GetKey(kvp.Key);
                    re.SetValue(key, kvp.Value);
                }
                save.Unknown.ForEach(item => re.SetValue(item.Key, item.Value));
                foreach (var kvp in save.Perks)
                {
                    var key = RegistryKeyMapper.GetKey("perk_" + kvp.Key.ToString());
                    re.SetValue(key, kvp.Value ? 1 : 0);
                }
                foreach (var item in save.Inventory.Items)
                {
                    var key = RegistryKeyMapper.GetKey("item_" + item.name);
                    re.SetValue(key, item.amount);
                }
            }
        }
        public static GameSave Load()
        {
            GameSave save = new GameSave();

            save.Unknown   = new Dictionary <string, object>();
            save.Inventory = new Inventory();
            save.Perks     = new Dictionary <Perk, bool>();

            try
            {
                using (RegistryKey rk = Registry.CurrentUser.OpenSubKey("Software\\Delve Interactive\\CHANGE"))
                {
                    string[] keys = rk.GetValueNames();
                    foreach (string key in keys)
                    {
                        string keyName = key.Contains("_") ? key.Substring(0, key.LastIndexOf("_")) : key;
                        keyName = keyName.ToLower();

                        if (keyName.StartsWith("item_"))
                        {
                            int    amount = Convert.ToInt32(rk.GetValue(key));
                            string name   = keyName.Substring(4, keyName.Length - 4);
                            name = name[0].ToString().ToUpper() + name.Substring(1);
                            save.Inventory.CreateItem(name, amount);
                        }
                        else if (keyName.StartsWith("perk_"))
                        {
                            int n = int.Parse(keyName.Substring(4));
                            if (n >= Enum.GetValues(typeof(Perk)).Length)
                            {
                                save.Unknown.Add(key, rk.GetValue(key));
                            }
                            else
                            {
                                Perk perk = (Perk)n;
                                bool val  = Convert.ToBoolean(rk.GetValue(key));
                                save.Perks.Add(perk, val);
                            }
                        }
                        else
                        {
                            var  val      = rk.GetValue(key);
                            bool valueSet = save.SetValue(keyName, val);
                            if (!valueSet)
                            {
                                save.Unknown.Add(key, val);
                            }
                        }
                        RegistryKeyMapper.EnsureKey(key);
                    }
                }
            }
            catch (Exception ex)
            {
                // TODO: Handle errors
                return(null);
            }

            return(save);
        }
        public void WhenValidDataIsStored_SameDataReadOnLoad()
        {
            this.hkcu.DeleteSubKeyTree(TestKeyPath, false);
            var registryKey = hkcu.CreateSubKey(TestKeyPath);

            var original = new KeyWithData()
            {
                String        = "test",
                Dword         = 42,
                NullableDword = 45,
                Qword         = 99999999999999999L,
                NullableQword = null,
                Bool          = true,
                NullableBool  = true
            };

            new RegistryKeyMapper <KeyWithData>().MapObjectToKey(original, registryKey);

            var copy = new RegistryKeyMapper <KeyWithData>().MapKeyToObject(registryKey);

            Assert.AreEqual(original.String, copy.String);
            Assert.AreEqual(original.Dword, copy.Dword);
            Assert.AreEqual(original.NullableDword, copy.NullableDword);
            Assert.AreEqual(original.Qword, copy.Qword);
            Assert.AreEqual(original.NullableQword, copy.NullableQword);
            Assert.AreEqual(original.Bool, copy.Bool);
            Assert.AreEqual(original.NullableBool, copy.NullableBool);
        }
        public void WhenSecureStringIsNull_RemainsNull()
        {
            this.hkcu.DeleteSubKeyTree(TestKeyPath, false);
            var registryKey = hkcu.CreateSubKey(TestKeyPath);

            var original = new KeyWithSecureString()
            {
            };

            new RegistryKeyMapper <KeyWithSecureString>().MapObjectToKey(original, registryKey);

            var copy = new RegistryKeyMapper <KeyWithSecureString>().MapKeyToObject(registryKey);

            Assert.IsNull(copy.Secure);
        }
        public void WhenSecureStringStored_StringCanBeDecrypted()
        {
            this.hkcu.DeleteSubKeyTree(TestKeyPath, false);
            var registryKey = hkcu.CreateSubKey(TestKeyPath);

            var original = new KeyWithSecureString()
            {
                Secure = SecureStringExtensions.FromClearText("secure!!!")
            };

            new RegistryKeyMapper <KeyWithSecureString>().MapObjectToKey(original, registryKey);

            var copy = new RegistryKeyMapper <KeyWithSecureString>().MapKeyToObject(registryKey);

            Assert.AreEqual(
                "secure!!!",
                copy.Secure.AsClearText());
        }
        public void WhenNullDataIsStored_SameDataReadOnLoad()
        {
            hkcu.DeleteSubKeyTree(TestKeyPath, false);
            var registryKey = hkcu.CreateSubKey(TestKeyPath);

            var original = new KeyWithData()
            {
                String        = null,
                NullableDword = null
            };

            new RegistryKeyMapper <KeyWithData>().MapObjectToKey(original, registryKey);

            var copy = new RegistryKeyMapper <KeyWithData>().MapKeyToObject(registryKey);

            Assert.AreEqual(original.String, copy.String);
            Assert.AreEqual(original.Dword, copy.Dword);
            Assert.AreEqual(original.NullableDword, copy.NullableDword);
        }
        public void WhenSecureStringIsDeleted_RemainsNull()
        {
            this.hkcu.DeleteSubKeyTree(TestKeyPath, false);
            var registryKey = hkcu.CreateSubKey(TestKeyPath);

            new RegistryKeyMapper <KeyWithSecureString>().MapObjectToKey(
                new KeyWithSecureString()
            {
                Secure = SecureStringExtensions.FromClearText("secure!!!")
            },
                registryKey);
            new RegistryKeyMapper <KeyWithSecureString>().MapObjectToKey(
                new KeyWithSecureString()
            {
                Secure = null
            },
                registryKey);

            var copy = new RegistryKeyMapper <KeyWithSecureString>().MapKeyToObject(registryKey);

            Assert.IsNull(copy.Secure);
        }