/// <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); }
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); }
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); }
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); }
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); }
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); }
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); }