public async Task AddMeeting() { // Add a single meeting, and get back that meeting. var c = new MRUDatabaseAccess(); var m = GenerateSimpleMeeting(DateTime.Now); await c.MarkVisitedNow(m); Assert.AreEqual(1, await c.ExecuteScalarAsync <int>("select count(*) from MRU")); }
public async Task AddMeetingTwice() { // When we update the MRU, it shouldn't create a new entry! :-) var c = new MRUDatabaseAccess(); var m = GenerateSimpleMeeting(DateTime.Now); await c.MarkVisitedNow(m); await c.MarkVisitedNow(m); Assert.AreEqual(1, await c.ExecuteScalarAsync <int>("select count(*) from MRU")); }
public async Task Add2Meetings() { // Add two of them. var c = new MRUDatabaseAccess(); var m1 = GenerateSimpleMeeting(DateTime.Now, "meeting 1", 100); var m2 = GenerateSimpleMeeting(DateTime.Now, "meeting 2", 101); await c.MarkVisitedNow(m1); await c.MarkVisitedNow(m2); Assert.AreEqual(2, await c.ExecuteScalarAsync <int>("select count(*) from MRU")); }
public async Task MakeSureEmpty() { // Test that what we use to make sure we have an empty database does, indeed, render an empty database. // Add a single meeting, and get back that meeting. var c = new MRUDatabaseAccess(); var m = GenerateSimpleMeeting(DateTime.Now); await c.MarkVisitedNow(m); await DBTestHelpers.DeleteDB(); Assert.AreEqual(0, await c.ExecuteScalarAsync <int>("select count(*) from MRU")); }
public async Task Add2MeetingsRepeatFirst() { // Add two of them, then re-mark the first. Shouldn't change anything! var c = new MRUDatabaseAccess(); var m1 = GenerateSimpleMeeting(DateTime.Now, "meeting 1", 100); var m2 = GenerateSimpleMeeting(DateTime.Now, "meeting 2", 101); await c.MarkVisitedNow(m1); await c.MarkVisitedNow(m2); await c.MarkVisitedNow(m1); Assert.AreEqual(2, await c.ExecuteScalarAsync <int>("select count(*) from MRU")); }
/// <summary> /// Load our db with a few items /// </summary> /// <param name="nMeetings"></param> private async Task LoadDB(int nMeetings, int indexStart = 0, TimeSpan futureTime = new TimeSpan()) { var mlst = GenerateMeetings(indexStart) .Take(nMeetings); var db = new MRUDatabaseAccess(); var timestamp = DateTime.Now + futureTime; foreach (var m in mlst) { await db.MarkVisitedNow(m, timestamp); } }
public async Task AddMeetingCausesRxFire() { // Add a single meeting, and get back that meeting. var c = new MRUDatabaseAccess(); int fireCount = 0; MRUDatabaseAccess.MRUDBUpdated .Subscribe(_ => fireCount++); var m = GenerateSimpleMeeting(DateTime.Now); await c.MarkVisitedNow(m); await TestUtils.SpinWait(() => fireCount == 1, 1000); }
public async Task UpdateMeetingTitle() { // When we update the MRU, it shouldn't create a new entry! :-) var c = new MRUDatabaseAccess(); var m = GenerateSimpleMeeting(DateTime.Now); await c.MarkVisitedNow(m); (m as dummyMeeting).Title = "new title"; await c.MarkVisitedNow(m); var allMeetings = await(await c.QueryMRUDB()).ToListAsync(); Assert.AreEqual(1, allMeetings.Count); Assert.AreEqual("new title", allMeetings[0].Title); }
public async Task GetBackValidAgenda() { // After adding a meeting, we should get back an expected agneda info object. var c = new MRUDatabaseAccess(); var m = GenerateSimpleMeeting(DateTime.Now); await c.MarkVisitedNow(m); var mru = await(await c.QueryMRUDB()).FirstOrDefaultAsync(); Assert.IsNotNull(m); var ai = mru.ToAgendaInfo(); Assert.AreEqual("indico.cern.ch/^//^/100", ai.AsReferenceString()); }
public async Task GetBackMultipleMeetingsSorted() { var c = new MRUDatabaseAccess(); foreach (var db in Enumerable.Range(0, 10).Select(i => GenerateSimpleMeeting(new DateTime(2000, 12, i + 1), string.Format("meeting {0}", i), 100 + i))) { Debug.WriteLine("Inserting meeting {0}", db.Title); await c.MarkVisitedNow(db); } var allMeetings = await c.QueryMRUDB(); var firstM = await allMeetings.OrderBy(m => m.StartTime).FirstOrDefaultAsync(); var lastM = await allMeetings.OrderByDescending(m => m.StartTime).FirstOrDefaultAsync(); Assert.AreEqual("meeting 0", firstM.Title); Assert.AreEqual("meeting 9", lastM.Title); }
public void CTor() { var c = new MRUDatabaseAccess(); Assert.IsNotNull(c); }
/// <summary> /// Initializes the singleton application object. This is the first line of authored code /// executed, and as such is the logical equivalent of main() or WinMain(). /// </summary> public App() { this.InitializeComponent(); // Register everything so the ReactiveUI view model finder can do the wiring it needs to do. Locator.CurrentMutable.Register(() => new StartPage(), typeof(IViewFor <StartPageViewModel>)); Locator.CurrentMutable.Register(() => new FirstRunView(), typeof(IViewFor <FirstRunViewModel>)); Locator.CurrentMutable.Register(() => new MeetingPage(), typeof(IViewFor <MeetingPageViewModel>)); Locator.CurrentMutable.Register(() => new CategoryPageView(), typeof(IViewFor <CategoryPageViewModel>)); Locator.CurrentMutable.Register(() => new TalkView(), typeof(IViewFor <TalkUserControlViewModel>)); Locator.CurrentMutable.Register(() => new CategoryAllPageView(), typeof(IViewFor <CategoryAllPageViewModel>)); Locator.CurrentMutable.Register(() => new CategoryInfoSimpleView(), typeof(IViewFor <CategoryConfigInfo>)); Locator.CurrentMutable.Register(() => new IndicoApiKeyView(), typeof(IViewFor <IndicoApiKey>)); Locator.CurrentMutable.Register(() => new SessionUserControl(), typeof(IViewFor <SessionUserControlViewModel>)); Locator.CurrentMutable.Register(() => new TalkFileCollectionUserControl(), typeof(IViewFor <TalkFileCollectionUserControlViewModel>)); Locator.CurrentMutable.Register(() => new FileView(), typeof(IViewFor <FileUserControlViewModel>)); #if WINDOWS_APP Locator.CurrentMutable.Register(() => new SlideThumbUserControl(), typeof(IViewFor <SlideThumbViewModel>)); Locator.CurrentMutable.Register(() => new PDFPageUserControl(), typeof(IViewFor <PDFPageViewModel>)); Locator.CurrentMutable.Register(() => new FullTalkAsStripView(), typeof(IViewFor <FullTalkAsStripViewModel>)); Locator.CurrentMutable.Register(() => new SecuritySettingsPage(), typeof(IViewFor <BasicSettingsViewModel>)); #endif #if WINDOWS_PHONE_APP Locator.CurrentMutable.Register(() => new BasicSettingsView(), typeof(IViewFor <BasicSettingsViewModel>)); Locator.CurrentMutable.Register(() => new LoadMeetingView(), typeof(IViewFor <OpenURLControlViewModel>)); #endif // Create the main view model, and register that. var r = new RoutingState(); Locator.CurrentMutable.RegisterConstant(r, typeof(RoutingState)); Locator.CurrentMutable.RegisterConstant(new MainPageViewModel(r), typeof(IScreen)); // A tool to convert URL's to meeting list refs Locator.CurrentMutable.Register(() => new MeetingListGenerator(), typeof(IMeetingListRefFactory)); // Setup suspend and resume. Note we need to do this once // we have routine info. this.Suspending += this.OnSuspending; autoSuspendHelper = new IWalker.Util.AutoSuspendHelper(this); RxApp.SuspensionHost.CreateNewAppState = () => new MainPageViewModel(r); RxApp.SuspensionHost.SetupDefaultSuspendResume(); Locator.CurrentMutable.RegisterConstant(autoSuspendHelper, typeof(IWalker.Util.AutoSuspendHelper)); // The Most Recently Used (MUR) database var mruDB = new MRUDatabaseAccess(); Locator.CurrentMutable.RegisterConstant(mruDB, typeof(IMRUDatabase)); // Make sure the JSON serializer for our cache can deal with interface objects: Locator.CurrentMutable.Register(() => new JsonSerializerSettings() { ObjectCreationHandling = ObjectCreationHandling.Replace, ReferenceLoopHandling = ReferenceLoopHandling.Ignore, TypeNameHandling = TypeNameHandling.All, }, typeof(JsonSerializerSettings), null); #if WINDOWS_PHONE_APP // And the back button on windows phone. Windows.Phone.UI.Input.HardwareButtons.BackPressed += (o, args) => { if (r.NavigateBack.CanExecute(null)) { r.NavigateBack.Execute(null); args.Handled = true; } }; #endif // Setup the internal data cache BlobCache.ApplicationName = "IndicoWalker"; Blobs.Register(); // Get all background tasks setup. IWalker.Util.BackgroundTasks.Register(); }