public void GetPositionsTest()
        {
            SQLiteDatabase database = new SQLiteDatabase();

            database.CreateDatabase();

            Position position1 = new Position()
            {
                Symbol   = "ONE",
                Quantity = 100,
                Class    = TransactionClass.stock,
            };

            Position position2 = new Position()
            {
                Symbol   = "TWO",
                Quantity = 150,
                Class    = TransactionClass.bond,
            };

            database.SetPosition(position1);
            database.SetPosition(position2);

            List <Position> expectedPositions = new List <Position>()
            {
                position1, position2
            };

            List <Position> actualPositions = database.GetPositions();

            CollectionAssert.AreEqual(expectedPositions, actualPositions);
        }
        public void NewTransactionTest()
        {
            SQLiteDatabase database = new SQLiteDatabase();

            database.CreateDatabase();

            Transaction transaction = new Transaction()
            {
                TransactionID = 1,
                Date          = new DateTime(2000, 1, 1),
                Action        = TransactionAction.buy,
                Class         = TransactionClass.stock,
                Symbol        = "AMZN",
                Amount        = 1.00M,
                Quantity      = 100,
            };

            database.NewTransaction(transaction);

            using SQLiteConnection connection = new SQLiteConnection("Data Source=database.sqlite");
            connection.Open();
            using SQLiteCommand command   = new SQLiteCommand("select * from Transactions where TransactionID = 1;", connection);
            using SQLiteDataReader reader = command.ExecuteReader();
            reader.Read();

            Assert.AreEqual(1L, reader["TransactionID"]);
            Assert.AreEqual(new DateTime(2000, 1, 1).ToString(CultureInfo.InvariantCulture), reader["Date"]);
            Assert.AreEqual((long)TransactionAction.buy, reader["ActionID"]);
            Assert.AreEqual((long)TransactionClass.stock, reader["ClassID"]);
            Assert.AreEqual("AMZN", reader["Symbol"]);
            Assert.AreEqual(1.00M, reader["Amount"]);
        }
        public void CommitTransactionBuyChangeClassException()
        {
            IDatabase database = new SQLiteDatabase();

            database.CreateDatabase();

            Transaction firstPurchase = new Transaction()
            {
                TransactionID = 1,
                Symbol        = "TEST",
                Class         = TransactionClass.stock,
                Action        = TransactionAction.buy,
                Quantity      = 100,
                Amount        = 100,
            };

            Transaction secondPurchase = new Transaction()
            {
                TransactionID = 2,
                Symbol        = "TEST",
                Class         = TransactionClass.bond,
                Action        = TransactionAction.buy,
                Quantity      = 150,
                Amount        = 200,
            };

            CommitTransaction(database, firstPurchase);
            CommitTransaction(database, secondPurchase);
        }
        public void CommitTransactionSellNotEnoughQuantity()
        {
            IDatabase database = new SQLiteDatabase();

            database.CreateDatabase();

            Transaction purchase = new Transaction()
            {
                TransactionID = 1,
                Symbol        = "TEST",
                Class         = TransactionClass.stock,
                Action        = TransactionAction.buy,
                Quantity      = 100,
                Amount        = 100,
            };

            Transaction sale = new Transaction()
            {
                TransactionID = 2,
                Symbol        = "TEST",
                Class         = TransactionClass.stock,
                Action        = TransactionAction.sell,
                Quantity      = 125,
                Amount        = 100,
            };

            CommitTransaction(database, purchase);
            CommitTransaction(database, sale);
        }
        public void CreateDatabaseTest()
        {
            SQLiteDatabase database = new SQLiteDatabase();

            database.CreateDatabase();

            using SQLiteConnection connection = new SQLiteConnection("Data Source=database.sqlite");
            connection.Open();

            CheckTableNames(connection);

            CheckActionsTable(connection);
            CheckClassesTable(connection);
            CheckLastPriceTable(connection);
            CheckPositionsTable(connection);
            CheckTransactionsTable(connection);
        }
        public void GetPriceTest()
        {
            SQLiteDatabase database = new SQLiteDatabase();

            database.CreateDatabase();

            Quote expectedQuote = new Quote()
            {
                Symbol = "TEST",
                Date   = new DateTime(2000, 1, 1),
                Price  = 100.00m,
            };

            database.SaveQuote(expectedQuote);

            Quote actualQuote = database.GetLastQuote(expectedQuote.Symbol);

            Assert.AreEqual(expectedQuote.Price, actualQuote.Price);
        }
        public void GetPositionTest()
        {
            SQLiteDatabase database = new SQLiteDatabase();

            database.CreateDatabase();

            Position expectedPosition = new Position()
            {
                Symbol   = "TEST",
                Class    = TransactionClass.stock,
                Quantity = 100.55m,
            };

            database.SetPosition(expectedPosition);

            Position actualPosition = database.GetPosition(expectedPosition.Symbol);

            Assert.AreEqual(expectedPosition.Symbol, actualPosition.Symbol);
            Assert.AreEqual(expectedPosition.Class, actualPosition.Class);
            Assert.AreEqual(expectedPosition.Quantity, actualPosition.Quantity);
        }
        public void CommitTransactionSellHasEnoughQuantity()
        {
            IDatabase database = new SQLiteDatabase();

            database.CreateDatabase();

            Transaction purchase = new Transaction()
            {
                TransactionID = 1,
                Symbol        = "TEST",
                Class         = TransactionClass.stock,
                Action        = TransactionAction.buy,
                Quantity      = 100,
                Amount        = 100,
            };

            Transaction sale = new Transaction()
            {
                TransactionID = 2,
                Symbol        = "TEST",
                Class         = TransactionClass.stock,
                Action        = TransactionAction.sell,
                Quantity      = 25,
                Amount        = 100,
            };

            Position expectedPosition = new Position()
            {
                Symbol   = "TEST",
                Class    = TransactionClass.stock,
                Quantity = 75,
            };

            CommitTransaction(database, purchase);
            CommitTransaction(database, sale);

            VerifyPosition(database, expectedPosition);
        }
        public void CommitTransactionBuy()
        {
            IDatabase database = new SQLiteDatabase();

            database.CreateDatabase();

            Transaction firstPurchase = new Transaction()
            {
                TransactionID = 1,
                Symbol        = "TEST",
                Class         = TransactionClass.stock,
                Action        = TransactionAction.buy,
                Quantity      = 100,
            };

            Transaction secondPurchase = new Transaction()
            {
                TransactionID = 2,
                Symbol        = "TEST",
                Class         = TransactionClass.stock,
                Action        = TransactionAction.buy,
                Quantity      = 150,
            };

            Position expectedPosition = new Position()
            {
                Symbol   = "TEST",
                Class    = TransactionClass.stock,
                Quantity = 250,
            };

            CommitTransaction(database, firstPurchase);
            CommitTransaction(database, secondPurchase);

            VerifyPosition(database, expectedPosition);
        }
        private void _buttonNewDatabase_Click(object sender, RoutedEventArgs e)
        {
            OpenControls.Wpf.Serialisation.RegistryItemSerialiser        registryItemSerialiser = new OpenControls.Wpf.Serialisation.RegistryItemSerialiser(_keyPath);
            OpenControls.Wpf.DatabaseDialogs.Model.DatabaseConfiguration databaseConfiguration  = new OpenControls.Wpf.DatabaseDialogs.Model.DatabaseConfiguration(registryItemSerialiser);
            if (registryItemSerialiser.OpenKey())
            {
                databaseConfiguration.Load();
            }

            OpenControls.Wpf.DatabaseDialogs.ViewModel.NewDatabaseViewModel newDatabaseViewModel = new OpenControls.Wpf.DatabaseDialogs.ViewModel.NewDatabaseViewModel(databaseConfiguration);
            OpenControls.Wpf.DatabaseDialogs.View.NewDatabaseView           newDatabaseView      =
                new OpenControls.Wpf.DatabaseDialogs.View.NewDatabaseView(new OpenControls.Wpf.DatabaseDialogs.Model.Encryption());
            newDatabaseView.DataContext = newDatabaseViewModel;
            if (newDatabaseView.ShowDialog() != true)
            {
                return;
            }
            if (!registryItemSerialiser.IsOpen)
            {
                registryItemSerialiser.CreateKey();
            }
            databaseConfiguration.Save();
            registryItemSerialiser.Close();

            try
            {
                OpenControls.Wpf.DatabaseDialogs.Model.DatabaseProvider databaseProvider = (OpenControls.Wpf.DatabaseDialogs.Model.DatabaseProvider)newDatabaseViewModel.SelectedDatabaseProvider;
                if (databaseProvider == OpenControls.Wpf.DatabaseDialogs.Model.DatabaseProvider.SQLite)
                {
                    SQLiteDatabase.CreateDatabase(this, newDatabaseViewModel.SQLite_Folder, newDatabaseViewModel.SQLite_DatabaseName);
                    IDatabaseHost.IConfigurationStore = new DBStore.SQLiteConfigurationStore(IDatabaseHost.Database);
                    IDatabaseHost.ISpeciesStore       = new DBStore.SQLiteSpeciesStore(IDatabaseHost.Database);
                    IDatabaseHost.IImagePathsStore    = new DBStore.SQLiteImagePathsStore(IDatabaseHost.Database);
                    IDatabaseHost.IImageStore         = new DBStore.SQLiteImageStore(IDatabaseHost.Database);
                }
                else if (databaseProvider == OpenControls.Wpf.DatabaseDialogs.Model.DatabaseProvider.MicrosoftSQLServer)
                {
                    string server =
                        (newDatabaseViewModel.SqlServerInstances.Count > 0) ?
                        newDatabaseViewModel.SqlServerInstances[newDatabaseViewModel.SelectedSqlServerInstance] :
                        null;
                    SQLServerDatabase.CreateDatabase(
                        this,
                        server,
                        newDatabaseViewModel.SQLServer_UseWindowsAuthentication,
                        newDatabaseViewModel.SQLServer_UserName,
                        newDatabaseViewModel.SQLServer_Password,
                        newDatabaseViewModel.SQLServer_Folder,
                        newDatabaseViewModel.SQLServer_Filename);
                    IDatabaseHost.IConfigurationStore = new DBStore.SQLServerConfigurationStore(IDatabaseHost.Database);
                    IDatabaseHost.ISpeciesStore       = new DBStore.SQLServerSpeciesStore(IDatabaseHost.Database);
                    IDatabaseHost.IImagePathsStore    = new DBStore.SQLServerImagePathsStore(IDatabaseHost.Database);
                    IDatabaseHost.IImageStore         = new DBStore.SQLServerImageStore(IDatabaseHost.Database);
                }
                else if (databaseProvider == OpenControls.Wpf.DatabaseDialogs.Model.DatabaseProvider.PostGreSQL)
                {
                    PostgreSQLDatabase.CreateDatabase(this, newDatabaseViewModel.PostgreSQL_IPAddress, newDatabaseViewModel.PostgreSQL_Port, newDatabaseViewModel.PostgreSQL_UseWindowsAuthentication, newDatabaseViewModel.PostgreSQL_UserName, newDatabaseViewModel.PostgreSQL_Password, newDatabaseViewModel.PostgreSQL_DatabaseName);
                    IDatabaseHost.IConfigurationStore = new DBStore.PostgreSQLConfigurationStore(IDatabaseHost.Database);
                    IDatabaseHost.ISpeciesStore       = new DBStore.PostgreSQLSpeciesStore(IDatabaseHost.Database);
                    IDatabaseHost.IImagePathsStore    = new DBStore.PostgreSQLImagePathsStore(IDatabaseHost.Database);
                    IDatabaseHost.IImageStore         = new DBStore.PostgreSQLImageStore(IDatabaseHost.Database);
                }
                else if (databaseProvider == OpenControls.Wpf.DatabaseDialogs.Model.DatabaseProvider.MySQL)
                {
                    MySQLDatabase.CreateDatabase(this, newDatabaseViewModel.MySQL_IPAddress, newDatabaseViewModel.MySQL_Port, newDatabaseViewModel.MySQL_UseWindowsAuthentication, newDatabaseViewModel.MySQL_UserName, newDatabaseViewModel.MySQL_Password, newDatabaseViewModel.MySQL_DatabaseName);
                    IDatabaseHost.IConfigurationStore = new DBStore.MySQLConfigurationStore(IDatabaseHost.Database);
                    IDatabaseHost.ISpeciesStore       = new DBStore.MySQLSpeciesStore(IDatabaseHost.Database);
                    IDatabaseHost.IImagePathsStore    = new DBStore.MySQLImagePathsStore(IDatabaseHost.Database);
                    IDatabaseHost.IImageStore         = new DBStore.MySQLImageStore(IDatabaseHost.Database);
                }
                else
                {
                    throw new Exception("Unsupported database type");
                }

                IDatabaseHost.IConfigurationStore.CreateTable();
                IDatabaseHost.IConfigurationStore.Initialise();
                IDatabaseHost.ISpeciesStore.CreateTable();
                IDatabaseHost.IImagePathsStore.CreateTable();
                IDatabaseHost.IImageStore.CreateTable();
            }
            catch (Exception exception)
            {
                System.Windows.Forms.MessageBox.Show(exception.Message);
                return;
            }

            ShowSpeciesListView(IDatabaseHost.Database);
        }