Exemplo n.º 1
0
        /// <summary>
        /// Ported from journal_t::read_textual(parse_context_stack_t& context_stack)
        /// </summary>
        public int ReadTextual(ParseContextStack contextStack)
        {
            var trace = Logger.Current.TraceContext(TimerName.ParsingTotal, 1)?.Message("Total time spent parsing text:").Start(); // TRACE_START

            TextualParser instance = new TextualParser(contextStack, contextStack.GetCurrent(), null, CheckingStyle == JournalCheckingStyleEnum.CHECK_PERMISSIVE);

            instance.ApplyStack.PushFront("account", contextStack.GetCurrent().Master);
            instance.Parse();

            trace?.Stop(); // TRACE_STOP

            // Apply any deferred postings at this time
            Master.ApplyDeferredPosts();

            // These tracers were started in textual.cc
            Logger.Current.TraceContext(TimerName.XactText, 1)?.Finish();   // TRACE_FINISH
            Logger.Current.TraceContext(TimerName.XactDetails, 1)?.Finish();
            Logger.Current.TraceContext(TimerName.XactPosts, 1)?.Finish();
            Logger.Current.TraceContext(TimerName.Xacts, 1)?.Finish();
            Logger.Current.TraceContext(TimerName.InstanceParse, 1)?.Finish();  // report per-instance timers
            Logger.Current.TraceContext(TimerName.ParsingTotal, 1)?.Finish();

            if (contextStack.GetCurrent().Errors > 0)
            {
                throw new CountError(contextStack.GetCurrent().Errors);
            }

            return(contextStack.GetCurrent().Count);
        }
Exemplo n.º 2
0
        public void TextualParser_ParseXact_CheckingBalanceIntegrationTest()
        {
            string line =
                @"2003/12/01 * Checking balance
  Assets:Checking                   $1,000.00
  Equity:Opening Balances";
            ITextualReader reader = CreateReaderForString(line);
            TextualParser  parser = CreateTextualParser();

            Account account = new Account();
            string  current = reader.ReadLine();
            Xact    xact    = parser.ParseXact(current, reader, account);

            Assert.IsNotNull(xact);
            Assert.AreEqual(new Date(2003, 12, 01), xact.Date);
            Assert.IsNull(xact.DateAux);
            Assert.AreEqual(ItemStateEnum.Cleared, xact.State);
            Assert.AreEqual("Checking balance", xact.Payee);
            Assert.AreEqual(2, xact.Posts.Count);

            Post post1 = xact.Posts.First();

            Assert.AreEqual("Assets:Checking", post1.Account.FullName);
            Assert.AreEqual("$", post1.Amount.Commodity.Symbol);
            Assert.AreEqual(BigInt.Parse("1000", 2), post1.Amount.Quantity);

            Post post2 = xact.Posts.Last();

            Assert.AreEqual("Equity:Opening Balances", post2.Account.FullName);
            Assert.IsNull(post2.Amount);
        }
Exemplo n.º 3
0
        public void TextualParser_ParsePost_ExpensesFoodGroceriesIntegrationTest()
        {
            string        line   = "  Expenses:Food:Groceries             $ 37.50  ; [=2011/03/01]";
            TextualParser parser = CreateTextualParser();

            Account account = new Account();
            Xact    xact    = new Xact();
            Post    post    = parser.ParsePost(line, xact, account);

            Assert.IsNotNull(post);
            Assert.AreEqual("Expenses:Food:Groceries", post.Account.FullName);
            Assert.AreEqual("$", post.Amount.Commodity.Symbol);
            Assert.AreEqual(BigInt.Parse("37.50", 2), post.Amount.Quantity);
            Assert.AreEqual(new Date(2011, 03, 01), post.DateAux);
        }
Exemplo n.º 4
0
        public void TextualParser_ParsePost_AssetsWyshonaItemsIntegrationTest()
        {
            string        line   = "  Assets:Wyshona:Items                \"Plans: Wildthorn Mail\" 1 {1.25G}";
            TextualParser parser = CreateTextualParser();

            Account account = new Account();
            Xact    xact    = new Xact();
            Post    post    = parser.ParsePost(line, xact, account);

            Assert.IsNotNull(post);
            Assert.AreEqual("Assets:Wyshona:Items", post.Account.FullName);
            Assert.AreEqual("\"Plans: Wildthorn Mail\"", post.Amount.Commodity.Symbol);
            Assert.AreEqual(BigInt.Parse("1"), post.Amount.Quantity);
            Assert.AreEqual("G", ((AnnotatedCommodity)post.Amount.Commodity).Details.Price.Commodity.Symbol);
            Assert.AreEqual(BigInt.Parse("1.25", 2), ((AnnotatedCommodity)post.Amount.Commodity).Details.Price.Quantity);
        }
Exemplo n.º 5
0
        public void TextualParser_ParsePost_BrokerageIntegrationTest()
        {
            string        line   = "  Assets:Brokerage                                 50 AAPL @ $30.00";
            TextualParser parser = CreateTextualParser();

            Account account = new Account();
            Xact    xact    = new Xact();
            Post    post    = parser.ParsePost(line, xact, account);

            Assert.IsNotNull(post);
            Assert.AreEqual("Assets:Brokerage", post.Account.FullName);
            Assert.AreEqual("AAPL", post.Amount.Commodity.Symbol);
            Assert.AreEqual(BigInt.Parse("50"), post.Amount.Quantity);
            Assert.AreEqual("$", post.Cost.Commodity.Symbol);
            Assert.AreEqual(BigInt.Parse("1500", 2), post.Cost.Quantity);
            Assert.AreEqual(post.Cost, post.GivenCost);
        }
Exemplo n.º 6
0
        public int ReadTextual(ParseContextStack contextStack)
        {
            TextualParser instance = new TextualParser(contextStack, contextStack.GetCurrent(), null, CheckingStyle == JournalCheckingStyleEnum.CHECK_PERMISSIVE);

            instance.ApplyStack.PushFront("account", contextStack.GetCurrent().Master);
            instance.Parse();

            // Apply any deferred postings at this time
            Master.ApplyDeferredPosts();

            if (contextStack.GetCurrent().Errors > 0)
            {
                throw new CountError(contextStack.GetCurrent().Errors);
            }

            return(contextStack.GetCurrent().Count);
        }
Exemplo n.º 7
0
        public void TextualParser_ParseXact_BankIntegrationTest()
        {
            string line =
                @"2011/01/25=2011/01/28 Bank
  ; Transfer to cover car purchase
  Assets:Checking                  $ 5,500.00
  Assets:Savings
  ; :nobudget:";
            ITextualReader reader = CreateReaderForString(line);
            TextualParser  parser = CreateTextualParser();

            Account account = new Account();
            string  current = reader.ReadLine();
            Xact    xact    = parser.ParseXact(current, reader, account);

            Assert.IsNotNull(xact);
            Assert.AreEqual(new Date(2011, 01, 25), xact.Date);
            Assert.AreEqual(new Date(2011, 01, 28), xact.DateAux);
            Assert.AreEqual(ItemStateEnum.Uncleared, xact.State);
            Assert.AreEqual("Bank", xact.Payee);
            Assert.AreEqual(" Transfer to cover car purchase", xact.Note); // Notice the trailing space.
            Assert.IsTrue(xact.Flags.HasFlag(SupportsFlagsEnum.ITEM_NOTE_ON_NEXT_LINE));
            Assert.AreEqual(2, xact.Posts.Count);

            Post post1 = xact.Posts.First();

            Assert.AreEqual("Assets:Checking", post1.Account.FullName);
            Assert.AreEqual("$", post1.Amount.Commodity.Symbol);
            Assert.AreEqual(BigInt.Parse("5500", 2), post1.Amount.Quantity);

            Post post2 = xact.Posts.Last();

            Assert.AreEqual("Assets:Savings", post2.Account.FullName);
            Assert.AreEqual(" :nobudget:", post2.Note);
            Assert.IsTrue(post2.Flags.HasFlag(SupportsFlagsEnum.ITEM_NOTE_ON_NEXT_LINE));
            Assert.IsTrue(post2.HasTag("nobudget"));
            Assert.IsNull(post2.Amount);
        }