public void TestSaveLoadTimelineEvent() { IDReferenceResolver resolver = new IDReferenceResolver (); Player p = new Player (); AnalysisEventType evtType = new AnalysisEventType (); TimelineEvent evt = new TimelineEvent (); resolver.AddReference (null, p.ID.ToString (), p); resolver.AddReference (null, evtType.ID.ToString (), evtType); evt.Players.Add (p); evt.EventType = evtType; Document doc = db.GetDocument (evt.ID.ToString ()); doc.Update ((UnsavedRevision rev) => { JObject jo = DocumentsSerializer.SerializeObject (evt, rev, db, resolver); Assert.AreEqual (p.ID, jo ["Players"] [0].Value<Guid> ()); Assert.AreEqual (evtType.ID, jo ["EventType"].Value<Guid> ()); IDictionary<string, object> props = jo.ToObject<IDictionary<string, object>> (); rev.SetProperties (props); return true; }); /* Player has not been added to the db, as it was already referenced * by the IDReferenceResolver */ Assert.AreEqual (1, db.DocumentCount); TimelineEvent evt2 = storage.Retrieve <TimelineEvent> (evt.ID); Assert.IsNotNull (evt2.EventType); }
/// <summary> /// Adds the default tags to a button /// </summary> /// <param name="ev">The event type where the tags will be added</param> public void AddDefaultTags(AnalysisEventType ev) { ev.Tags.Add(new Tag(Catalog.GetString("Success"), Catalog.GetString("Outcome"))); ev.Tags.Add(new Tag(Catalog.GetString("Failure"), Catalog.GetString("Outcome"))); }
/// <summary> /// Create a new <see cref="AnalysisEventButton"/> with the default values /// </summary> /// <returns>A new button.</returns> /// <param name="index">Index of this button used to name it</param> public override AnalysisEventButton CreateDefaultItem(int index) { AnalysisEventButton button; AnalysisEventType evtype; Color c = Colors.ButtonEventColor; HotKey h = new HotKey(); evtype = new AnalysisEventType { Name = "Event Type " + index, SortMethod = SortMethodType.SortByStartTime, Color = c }; AddDefaultTags(evtype); button = new AnalysisEventButton { EventType = evtype, Start = new Time { TotalSeconds = 10 }, Stop = new Time { TotalSeconds = 10 }, HotKey = h, /* Leave the first row for the timers and score */ Position = new Point(10 + (index % 7) * (CAT_WIDTH + 10), 10 + (index / 7 + 1) * (CAT_HEIGHT + 10)), Width = CAT_WIDTH, Height = CAT_HEIGHT, ShowIcon = true, }; return(button); }
public void SetUp() { // load model EventType e = new AnalysisEventType { Tags = new RangeObservableCollection <Tag> { new Tag("Success", "Test") } }; A = new AnalysisEventButton { Name = "A", EventType = e }; B = new AnalysisEventButton { Name = "B", EventType = e }; C = new AnalysisEventButton { Name = "C", EventType = e }; model = new RangeObservableCollection <DashboardButton> (); model.AddRange(new List <DashboardButton> { A, B, C }); CreateLink(A, B); CreateLink(B, C); }
public void TagsModification_NoTags_PropertyChangedEmitted() { bool collectionChanged = false; bool propertyChanged = false; string propertyName = ""; var model = new AnalysisEventType { Name = "Test1", Color = Color.Red }; var viewModel = new EventTypeVM { Model = model, }; model.Tags.CollectionChanged += (sender, e) => collectionChanged = true; viewModel.PropertyChanged += (sender, e) => { propertyChanged = true; propertyName = e.PropertyName; }; model.Tags.Add(new Tag("tag", "group")); Assert.IsTrue(collectionChanged); Assert.IsTrue(propertyChanged); Assert.AreEqual("Collection_" + nameof(model.Tags), propertyName); }
public void TestRaiseCollectionPropertyChanged() { int evtCount = 0; AnalysisEventType evt = new AnalysisEventType(); evt.PropertyChanged += (sender, e) => evtCount++; evt.Tags = new RangeObservableCollection <Tag> (); Assert.AreEqual(1, evtCount); }
void HandleEditEventSubcategories(DashboardButton dashboardButton) { AnalysisEventButton button = (dashboardButton as AnalysisEventButton); AnalysisEventType evt = button.AnalysisEventType; EventTypeTagsEditor dialog = new EventTypeTagsEditor(this.Toplevel as Window); dialog.EventType = evt; dialog.Run(); dialog.Destroy(); ViewModel.Model.RemoveDeadLinks(button); }
public void TestQueryEventsByEventType() { AnalysisEventType evtType1 = new AnalysisEventType { Name = "Ball lost" }; AnalysisEventType evtType2 = new AnalysisEventType { Name = "PC" }; AnalysisEventType evtType3 = new AnalysisEventType { Name = "Recovery" }; AnalysisEventType evtType4 = new AnalysisEventType { Name = "Throw-in" }; AnalysisEventType evtType5 = new AnalysisEventType { Name = "Unused" }; ScoreEventType score = new ScoreEventType { Name = "Goal" }; var eventTypes = new List <EventType> { evtType1, evtType2, evtType3, evtType4, score }; foreach (EventType evtType in eventTypes) { LMTimelineEvent evt = new LMTimelineEvent(); evt.EventType = evtType; storage.Store(evt); } QueryFilter filter = new QueryFilter(); filter.Add("EventType", evtType1); Assert.AreEqual(1, storage.Retrieve <LMTimelineEvent> (filter).Count()); filter.Add("EventType", evtType4); Assert.AreEqual(1, storage.Retrieve <LMTimelineEvent> (filter).Count()); filter.Add("EventType", evtType2, evtType3); Assert.AreEqual(2, storage.Retrieve <LMTimelineEvent> (filter).Count()); filter.Add("EventType", eventTypes); Assert.AreEqual(5, storage.Retrieve <LMTimelineEvent> (filter).Count()); filter.Add("EventType", evtType5); Assert.AreEqual(0, storage.Retrieve <LMTimelineEvent> (filter).Count()); filter.Add("EventType", score); Assert.AreEqual(1, storage.Retrieve <LMTimelineEvent> (filter).Count()); }
void EditEventSubcategories(DashboardButton dashboardButton) { AnalysisEventButton button = (dashboardButton as AnalysisEventButton); AnalysisEventType evt = button.AnalysisEventType; EventTypeTagsEditor dialog = new EventTypeTagsEditor(this.Toplevel as Window); dialog.EventType = evt; dialog.Run(); dialog.Destroy(); template.RemoveDeadLinks(button); Edited = true; Refresh(); }
public void TestRaiseInCollectionChildren() { int evtCount = 0; AnalysisEventType evt = new AnalysisEventType(); evt.Tags = new RangeObservableCollection <Tag> (); evt.Tags.Add(new Tag("test")); evt.PropertyChanged += (sender, e) => evtCount++; evt.Tags [0].Value = "TT"; Assert.AreEqual(1, evtCount); }
void LoadEventType(AnalysisEventType eventType) { Button newGroupButton; var tagsByGroup = eventType.Tags.GroupBy(t => t.Group); foreach (var tagsGroup in tagsByGroup) { AddNewGroup(tagsGroup.Key, tagsGroup.ToList()); } newGroupButton = CreateAddGroupButton(); mainvbox.PackEnd(newGroupButton, false, true, 0); mainvbox.ShowAll(); }
public void TestIsChangedSetBeforeRaising() { bool isChanged = false; AnalysisEventType evt = new AnalysisEventType(); evt.IsChanged = false; evt.PropertyChanged += (sender, e) => { isChanged = evt.IsChanged; }; evt.Name = "RRR"; Assert.IsTrue(evt.IsChanged); Assert.IsTrue(isChanged); }
public void TestDoNotRaiseAfterRemovingCollectionChildren() { int evtCount = 0; Tag tag = new Tag("test"); AnalysisEventType evt = new AnalysisEventType(); evt.Tags = new RangeObservableCollection <Tag> (); evt.Tags.Add(tag); evt.Tags.Remove(tag); evt.PropertyChanged += (sender, e) => evtCount++; tag.Value = "TT"; Assert.AreEqual(0, evtCount); }
public void TestRaiseCollectionChanged() { int evtCount = 0; string name = null; AnalysisEventType evt = new AnalysisEventType(); evt.Tags = new RangeObservableCollection <Tag> (); evt.PropertyChanged += (sender, e) => { evtCount++; name = e.PropertyName; }; evt.Tags.Add(new Tag("test")); Assert.AreEqual(1, evtCount); Assert.AreEqual("Collection_Tags", name); }
public void Update () { events = filter.VisiblePlays.Where (e => e.Players.Contains (player) && e.EventType.Equals (EventType)).ToList (); SubcategoriesStats = new List<SubCategoryStat> (); if (EventType is ScoreEventType) { // Total number of points TotalCount = events.Sum (e => (e as ScoreEvent).Score.Points); int eventsCount = events.Count (); SubCategoryStat substat = new SubCategoryStat (Catalog.GetString ("Score")); // Create percentual stats for each score subtype. The count here is the number of events not points. foreach (Score score in project.Scores) { var scores = events.Where (e => (e as ScoreEvent).Score == score); PercentualStat pStat = new PercentualStat (score.Name, scores.Count (), 0, 0, eventsCount); substat.OptionStats.Add (pStat); } SubcategoriesStats.Add (substat); } else if (EventType is PenaltyCardEventType) { TotalCount = events.Count; SubCategoryStat substat = new SubCategoryStat (Catalog.GetString ("Penalties")); foreach (PenaltyCard penalty in project.PenaltyCards) { var penalties = events.Where (e => (e as PenaltyCardEvent).PenaltyCard == penalty); PercentualStat pStat = new PercentualStat (penalty.Name, penalties.Count (), 0, 0, TotalCount); substat.OptionStats.Add (pStat); } SubcategoriesStats.Add (substat); } else { AnalysisEventType evType = EventType as AnalysisEventType; TotalCount = events.Count; SubcategoriesStats = new List<SubCategoryStat> (); var tagsByGroup = evType.TagsByGroup; foreach (string grp in tagsByGroup.Keys) { SubCategoryStat substat = new SubCategoryStat (grp); foreach (Tag t in tagsByGroup[grp]) { int count; count = events.Count (e => e.Tags.Contains (t)); PercentualStat pStat = new PercentualStat (t.Value, count, 0, 0, events.Count); substat.OptionStats.Add (pStat); } SubcategoriesStats.Add (substat); } } }
public void TestAnalysisEventType() { AnalysisEventType at = new AnalysisEventType(); Utils.CheckSerialization(at); Assert.IsNotNull(at.Tags); Assert.AreEqual(at.TagsByGroup.Count, 0); at.Tags.Add(new Tag("test1", "grp1")); at.Tags.Add(new Tag("test2", "grp1")); at.Tags.Add(new Tag("test3", "grp2")); var tbg = at.TagsByGroup; Assert.AreEqual(tbg.Count, 2); Assert.AreEqual(tbg ["grp1"].Count, 2); Assert.AreEqual(tbg ["grp2"].Count, 1); }
public void TestIsChanged() { EventType et = new EventType(); Assert.IsTrue(et.IsChanged); et.IsChanged = false; et.Color = Color.Green; Assert.IsTrue(et.IsChanged); et.IsChanged = false; et.FieldPositionIsDistance = true; Assert.IsTrue(et.IsChanged); et.IsChanged = false; et.HalfFieldPositionIsDistance = true; Assert.IsTrue(et.IsChanged); et.IsChanged = false; et.Name = "name"; Assert.IsTrue(et.IsChanged); et.IsChanged = false; et.SortMethod = SortMethodType.SortByStartTime; Assert.IsTrue(et.IsChanged); et.IsChanged = false; et.TagFieldPosition = true; Assert.IsTrue(et.IsChanged); et.IsChanged = false; et.TagGoalPosition = true; Assert.IsTrue(et.IsChanged); et.IsChanged = false; et.TagHalfFieldPosition = true; Assert.IsTrue(et.IsChanged); et.IsChanged = false; AnalysisEventType at = new AnalysisEventType(); Assert.IsTrue(at.IsChanged); at.IsChanged = false; at.Tags.Add(new Tag("")); Assert.IsTrue(at.IsChanged); at.IsChanged = false; at.Tags = null; Assert.IsTrue(at.IsChanged); at.IsChanged = false; }
public void TestTimelineEvent() { LMPlayer p = new LMPlayer(); AnalysisEventType evtType = new AnalysisEventType(); LMTimelineEvent evt = new LMTimelineEvent(); Document doc = db.GetDocument(evt.ID.ToString()); SerializationContext context = new SerializationContext(db, evt.GetType()); context.Cache.AddReference(p); evt.Players.Add(p); evt.EventType = evtType; doc.Update((UnsavedRevision rev) => { JObject jo = DocumentsSerializer.SerializeObject(evt, rev, context); Assert.AreEqual(p.ID.ToString(), jo ["Players"] [0].Value <String> ()); Assert.AreEqual(evtType.ID.ToString(), jo ["EventType"].Value <String> ()); IDictionary <string, object> props = jo.ToObject <IDictionary <string, object> > (); rev.SetProperties(props); return(true); }); /* LMPlayer has not been added to the db, as it was already referenced * by the IDReferenceResolver */ Assert.AreEqual(2, db.DocumentCount); DocumentsSerializer.SaveObject(p, db); Assert.AreEqual(3, db.DocumentCount); LMTimelineEvent evt2 = storage.Retrieve <LMTimelineEvent> (evt.ID); Assert.IsNotNull(evt2.EventType); Assert.IsNotNull(evt2.DocumentID); storage.Delete(evt); Assert.AreEqual(3, db.DocumentCount); storage.Delete(p); Assert.AreEqual(2, db.DocumentCount); storage.Delete(evtType); Assert.AreEqual(1, db.DocumentCount); }
public void Update() { events = filter.VisiblePlays.Where(e => ((LMTimelineEvent)e).Players.Contains(player) && e.EventType.Equals(EventType)).Cast <LMTimelineEvent> ().ToList(); SubcategoriesStats = new List <SubCategoryStat> (); if (EventType is ScoreEventType) { ScoreEventType scoreEventType = EventType as ScoreEventType; // Total number of points TotalCount = events.Count * scoreEventType.Score.Points; int eventsCount = events.Count(); } else if (EventType is PenaltyCardEventType) { TotalCount = events.Count; } else { AnalysisEventType evType = EventType as AnalysisEventType; TotalCount = events.Count; SubcategoriesStats = new List <SubCategoryStat> (); var tagsByGroup = evType.TagsByGroup; foreach (string grp in tagsByGroup.Keys) { SubCategoryStat substat = new SubCategoryStat(grp); foreach (Tag t in tagsByGroup[grp]) { int count; count = events.Count(e => e.Tags.Contains(t)); PercentualStat pStat = new PercentualStat(t.Value, count, 0, 0, events.Count); substat.OptionStats.Add(pStat); } SubcategoriesStats.Add(substat); } } }
void LoadEventType(AnalysisEventType eventType) { Button newGroupButton; var tagsByGroup = eventType.Tags.GroupBy (t => t.Group); foreach (var tagsGroup in tagsByGroup) { AddNewGroup (tagsGroup.Key, tagsGroup.ToList ()); } newGroupButton = CreateAddGroupButton (); mainvbox.PackEnd (newGroupButton, false, true, 0); mainvbox.ShowAll (); }
void CreateEvents() { AnalysisEventType firstEventType = ((AnalysisEventType)eventsFilterController.Project.Dashboard.ViewModels.OfType <EventButtonVM> ().First().EventType.Model); AnalysisEventType secondEventType = ((AnalysisEventType)eventsFilterController.Project.Dashboard.ViewModels.OfType <EventButtonVM> ().ElementAt(1).EventType.Model); AnalysisEventType thirdEventType = ((AnalysisEventType)eventsFilterController.Project.Dashboard.ViewModels.OfType <EventButtonVM> ().ElementAt(2).EventType.Model); AnalysisEventType fourthEventType = ((AnalysisEventType)eventsFilterController.Project.Dashboard.ViewModels.OfType <EventButtonVM> ().ElementAt(3).EventType.Model); AnalysisEventType fiftEventType = ((AnalysisEventType)eventsFilterController.Project.Dashboard.ViewModels.OfType <EventButtonVM> ().ElementAt(4).EventType.Model); Dictionary <string, List <Tag> > commonTagsByGroup = eventsFilterController.Project.Dashboard.Model.CommonTagsByGroup; Tag goodTag = firstEventType.TagsByGroup ["Outcome"].ElementAt(0); Tag badTag = firstEventType.TagsByGroup ["Outcome"].ElementAt(1); Tag leftTag = new Tag("Left", "Position"); Tag centerTag = new Tag("Center", "Position"); Tag rightTag = new Tag("Right", "Position"); firstEventType.Tags.Add(leftTag); firstEventType.Tags.Add(centerTag); firstEventType.Tags.Add(rightTag); Tag otherTag = new Tag("tag value", "Other group"); eventsFilterController.Project.Dashboard.SubViewModel.Model.Add(new TagButton { Name = "Other tag", Tag = otherTag, }); eventsFilterController.Project.Timers.First().Model.Nodes.Add(new TimeNode { Start = new Time(0), Stop = new Time(10), }); eventsFilterController.Project.Timers.First().Model.Nodes.Add(new TimeNode { Start = new Time(31), Stop = new Time(60), }); eventsFilterController.Project.Timers.First().Model.Nodes.Add(new TimeNode { Start = new Time(80), Stop = new Time(100), }); eventsFilterController.Project.Timers.Model.Add(new VAS.Core.Store.Timer { Name = "timer 2", Nodes = new RangeObservableCollection <TimeNode> { new TimeNode { Start = new Time(0), Stop = new Time(50), }, } }); timelineVM.FullTimeline.Model.Replace(new List <TimelineEvent> { new TimelineEvent { Name = "event 1, type 1, without player tags, first period left", EventType = firstEventType, Start = new Time(0), // it starts outside the period Stop = new Time(20), // it ends inside the period }, new TimelineEvent { Name = "event 2, type 1 + Bad + Attack, first team tagged, first period", EventType = firstEventType, Start = new Time(11), // it starts inside the first period, but not the first timer Stop = new Time(30), // it ends inside the first period, but not in the second timer }, new TimelineEvent { Name = "event 3, type 1 + Good + Defense, second team tagged, between first and second period", EventType = firstEventType, Start = new Time(40), // it starts inside the 1st period Stop = new Time(60), // it ends inside the 2nd period }, new TimelineEvent { Name = "event 4, type 1 + Bad + Left + Attack + Defense, first player from first team tagged, second period", EventType = firstEventType, Start = new Time(60), // it starts inside the 2nd period Stop = new Time(80), // it ends inside the 2nd period }, new TimelineEvent { Name = "event 5, type 2 + Good + Other Tag, first player from second team tagged, second period right", EventType = secondEventType, Start = new Time(80), // it starts inside the 2nd period Stop = new Time(100), // it ends outside the 2nd period }, new TimelineEvent { Name = "event 6, type 3 + Bad, first team and first player from first team tagged, no periods", EventType = thirdEventType, Start = new Time(900), // It starts outside all periods Stop = new Time(1000), // It ends outside all periods, without touching them }, new TimelineEvent { Name = "event 7, first team and first player from second team tagged, fill all periods", EventType = fourthEventType, Start = new Time(0), // It starts outside all periods Stop = new Time(100), // It ends outside all periods, touching them all }, new TimelineEvent { Name = "event 8, type 3 + Other Tag, without player tags, first period left", EventType = fiftEventType, Start = new Time(0), // it starts outside the period Stop = new Time(20), // it ends inside the period } }); // Subcats & Tags timelineVM.FullTimeline.ElementAt(1).Model.Tags.Add(badTag); timelineVM.FullTimeline.ElementAt(1).Model.Tags.Add(commonTagsByGroup [""].First()); timelineVM.FullTimeline.ElementAt(2).Model.Tags.Add(goodTag); timelineVM.FullTimeline.ElementAt(2).Model.Tags.Add(commonTagsByGroup [""].ElementAt(1)); timelineVM.FullTimeline.ElementAt(3).Model.Tags.Add(badTag); timelineVM.FullTimeline.ElementAt(3).Model.Tags.Add(leftTag); timelineVM.FullTimeline.ElementAt(3).Model.Tags.Add(commonTagsByGroup [""].First()); timelineVM.FullTimeline.ElementAt(3).Model.Tags.Add(commonTagsByGroup [""].ElementAt(1)); timelineVM.FullTimeline.ElementAt(4).Model.Tags.Add(goodTag); timelineVM.FullTimeline.ElementAt(4).Model.Tags.Add(otherTag); timelineVM.FullTimeline.ElementAt(5).Model.Tags.Add(badTag); timelineVM.FullTimeline.ElementAt(7).Model.Tags.Add(otherTag); }