public async Task GET() { Guid testId = Guid.Empty; PhraseEdit gottenPhraseEdit = null; var isAsyncComplete = false; var hasError = false; EnqueueConditional(() => isAsyncComplete); await Setup(); try { var allPhrases = await PhraseList.GetAllAsync(); testId = allPhrases.First().Id; gottenPhraseEdit = await PhraseEdit.GetPhraseEditAsync(testId); } catch { hasError = true; } finally { EnqueueCallback( () => Assert.IsFalse(hasError), () => Assert.IsNotNull(gottenPhraseEdit), () => Assert.AreEqual(testId, gottenPhraseEdit.Id) ); EnqueueTestComplete(); Teardown(); isAsyncComplete = true; } }
public async Task CREATE_NEW() { PhraseEdit newPhraseEdit = null; var isAsyncComplete = false; var hasError = false; EnqueueConditional(() => isAsyncComplete); await Setup(); try { newPhraseEdit = await PhraseEdit.NewPhraseEditAsync(); } catch { hasError = true; } finally { EnqueueCallback( () => Assert.IsFalse(hasError), () => Assert.IsNotNull(newPhraseEdit), () => Assert.AreEqual(SeedData.Ton.EnglishId, newPhraseEdit.LanguageId), () => Assert.IsNotNull(newPhraseEdit.Language) ); EnqueueTestComplete(); Teardown(); isAsyncComplete = true; } }
protected virtual void AddPhraseDetails(PhraseEdit phrase) { AddPhraseId(phrase.Id); AddPhraseText(phrase.Text); AddLanguageId(phrase.LanguageId); AddLanguageText(phrase.Language.Text); }
public override async System.Threading.Tasks.Task Setup() { //MUST AUTHENTICATE FIRST, SO CALL BASE.SETUP() await base.Setup(); var allPhrases = await PhraseList.GetAllAsync(); _TestPhraseEdit = allPhrases.First(); }
public TranslationSearchCriteria(PhraseEdit phrase, string targetLanguageText, bool searchOnlineIfNotFoundInDB = false, string contextText = "") { Phrase = phrase; TargetLanguageText = targetLanguageText; SearchOnlineIfNotFoundInDB = searchOnlineIfNotFoundInDB; }
protected override async Task <StudyItemViewModelBase> GetNextStudyItemViewModelAsync() { StudyItemViewModelBase qaViewModel = null; PhraseEdit phraseToStudy = null; DisableNavigationRequestedEventMessage.Publish(); try { ///THINGS THAT MUST HAPPEN: ///CHOOSE A PHRASE/LINE TO STUDY FROM THE TARGET ///GET A VIEWMODEL FOR THAT PHRASE/LINE #region Thinking (try..) var targetId = Guid.NewGuid(); History.Events.ThinkingAboutTargetEvent.Publish(targetId); try { #endregion ///SO, THE SIMPLEST FORM OF CHOOSING A PHRASE/LINE TO STUDY IS JUST GETTING ///CHOOSING FROM THE MLT LIST AT RANDOM. //PhraseEdit phraseToStudy = GetRandomPhrase(GetCurrentTarget()); phraseToStudy = await GetRandomUnknownPhrase(GetCurrentTarget()); #region (...finally) Thinked } finally { History.Events.ThinkedAboutTargetEvent.Publish(targetId); } #endregion if (phraseToStudy == null) { phraseToStudy = GetRandomPhrase(GetCurrentTarget()); } History.Events.ThinkingAboutTargetEvent.Publish(System.Guid.Empty); { qaViewModel = await StudyItemViewModelFactory.Ton.ProcureAsync(phraseToStudy, _CurrentUserNativeLanguageText); } History.Events.ThinkingAboutTargetEvent.Publish(System.Guid.Empty); //PUBLISH A REVIEWING PHRASE EVENT MESSAGE. History.Events.ReviewingPhraseEvent reviewingEvent = new ReviewingPhraseEvent(phraseToStudy, qaViewModel.ReviewMethodId); History.HistoryPublisher.Ton.PublishEvent(reviewingEvent); } finally { EnableNavigationRequestedEventMessage.Publish(); } return(qaViewModel); }
public void Initialize(PhraseEdit question, PhraseEdit answer) { _InitialQuestionText = question.Text; _ModifiedQuestionText = ""; _InitialAnswerText = answer.Text; _ModifiedAnswerText = ""; Question = question; Answer = answer; //FINISH UP var words = Question.Text.ParseIntoWords(); var durationMilliseconds = words.Count * (int.Parse(StudyResources.DefaultMillisecondsTimePerWordInQuestion)); QuestionDurationInMilliseconds = durationMilliseconds; HideAnswer(); //if (!question.IsValid) // callback(new ArgumentException("question is not a valid phrase", "question")); //if (!answer.IsValid) // callback(new ArgumentException("answer is not a valid phrase", "answer")); ////THE POINT OF THIS METHOD IS TO ASSIGN QUESTION, ANSWER, AND CALCULATE TIMING ////WE GET THE ACTUAL PHRASEEDITS FROM THE DB ////get these anew from database, so we know that we are NOT dealing ////with any children, to make things smoother when we are editing/saving them. //var criteria = new Business.Criteria.ListOfPhrasesCriteria(question, answer); //Business.PhrasesByTextAndLanguageRetriever.CreateNew(criteria, (s, r) => // { // if (r.Error != null) // { // callback(r.Error); // return; // } // var retriever = r.Object; // Question = retriever.RetrievedPhrases[question.Id]; // Answer = retriever.RetrievedPhrases[answer.Id]; // if (Question == null) // callback(new ArgumentException("phrase not found in DB", "question")); // if (Answer == null) // callback(new ArgumentException("phrase not found in DB", "answer")); // //FINISH UP // var words = Question.Text.ParseIntoWords(); // var durationMilliseconds = words.Count * (int.Parse(StudyResources.DefaultMillisecondsTimePerWordInQuestion)); // QuestionDurationInMilliseconds = durationMilliseconds; // HideAnswer(); // callback(null); // }); }
public async Task MAKE_PHRASE_WITH_REALLY_LONG_VARIED_TEXT() { #region var reallyLongText var reallyLongText = @"asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`asd;flkjghweqrey8iuweqpoiuqtw[eoizsdfslknjvzxcknvl;/,asdmf;lkasdfj asldkf a/sldkf jwoieuofvahsdkj;fa;weio:KJSLDJIOWEJLKSJDFLWIUQOWUQ}R|)(_)(*+_)(*&^%$#@!~~!@#$%^&*()_+|}{POIUYTREWQASDFGHJKL: ZXCVBNM<>? "" wijwfekjsdkfj sdfj zxcvbnm,./';lljhgfdsqwertyuiop[]\=-0987654321`"; #endregion PhraseEdit newPhraseEdit = null; PhraseEdit savedPhraseEdit = null; PhraseEdit gottenPhraseEdit = null; var isAsyncComplete = false; var hasError = false; EnqueueConditional(() => isAsyncComplete); await Setup(); try { //NEW newPhraseEdit = await PhraseEdit.NewPhraseEditAsync(); //EDIT newPhraseEdit.Text = reallyLongText; newPhraseEdit.UserId = SeedData.Ton.GetTestValidUserDto().Id; newPhraseEdit.Username = SeedData.Ton.TestValidUsername; Assert.AreEqual(SeedData.Ton.EnglishId, newPhraseEdit.LanguageId); //SAVE savedPhraseEdit = await newPhraseEdit.SaveAsync(); //GET (CONFIRM SAVE) gottenPhraseEdit = await PhraseEdit.GetPhraseEditAsync(savedPhraseEdit.Id); } catch { hasError = true; } finally { EnqueueCallback( () => Assert.IsFalse(hasError), () => Assert.IsNotNull(newPhraseEdit), () => Assert.IsNotNull(savedPhraseEdit), () => Assert.IsNotNull(gottenPhraseEdit), () => Assert.AreEqual(savedPhraseEdit.Id, gottenPhraseEdit.Id), () => Assert.AreEqual(savedPhraseEdit.Text, gottenPhraseEdit.Text) ); EnqueueTestComplete(); Teardown(); isAsyncComplete = true; } }
/// <summary> /// Executes callback when answer is shown, or when exception is thrown. /// </summary> /// <param name="question">Question PhraseEdit</param> /// <param name="answer">Answer PhraseEdit</param> /// <param name="questionDurationInMilliseconds"></param> /// <param name="callback"></param> protected async Task AskQuestionAsync(PhraseEdit question, PhraseEdit answer, int questionDurationInMilliseconds) { HideAnswer(); Question = question; Answer = answer; //WAIT IN THE BACKGROUND SO WE DON'T BLOCK OUR MAIN EXECUTION THREAD await CommonHelper.WaitAsync(questionDurationInMilliseconds); //Task waitTask = new Task(() => System.Threading.Thread.Sleep(questionDurationInMilliseconds)); //waitTask.Start(); //await waitTask; }
///// <summary> ///// Creates a study item using the line and MLT. ///// This prepares the view model so that all that is necessary for the caller is to call ///// viewmodel.Show(...); ///// </summary> //public async Task<ResultArgs<StudyItemViewModelBase>> Procure(LineEdit line, // MultiLineTextEdit multiLineText) //{ // //FOR NOW, THIS WILL JUST CREATE ONE OF TWO STUDY ITEM VIEW MODELS: // //STUDY LINE ORDER VIEWMODEL (TIMED OR MANUAL). // //IT WILL SHOW THE QUESTION AND HIDE THE ANSWER FOR VARIOUS AMOUNTS OF TIME, DEPENDING ON QUESTION // //LENGTH, AND OTHER FACTORS. // //IN THE FUTURE, THIS WILL BE EXTENSIBILITY POINT WHERE WE CAN SELECT DIFFERENT VARIETIES OF Q AND A // //TRANSLATION VIEW MODELS BASED ON HOW SUCCESSFUL THEY ARE. WE CAN ALSO HAVE DIFFERENT CONFIGURATIONS // //OF VARIETIES BE SELECTED HERE. // var manualViewModel = new StudyLineOrderManualQuestionAnswerViewModel(); // var timedViewModel = new StudyLineOrderTimedQuestionAnswerViewModel(); // StudyItemViewModelBase dummy = null; // var viewModel = RandomPicker.Ton.PickOne<StudyItemViewModelBase>(manualViewModel, timedViewModel, out dummy); // if (viewModel is StudyLineOrderManualQuestionAnswerViewModel) // manualViewModel.Initialize(line, multiLineText); // else // timedViewModel.Initialize(line, multiLineText); // return await new Task<ResultArgs<StudyItemViewModelBase>>( // () => // { // var result = new ResultArgs<StudyItemViewModelBase>(viewModel); // return result; // }); //} /// <summary> /// Uses auto translation service (as of writing, this is BingTranslatorService) to translate phrase /// into another phrase, which is returned in the callback. /// </summary> private async Task <PhraseEdit> AutoTranslate(PhraseEdit untranslatedPhrase, string targetLanguageText) { throw new NotImplementedException(); //todo: implement this using common.translation.translator //BingTranslatorService.LanguageServiceClient client = new BingTranslatorService.LanguageServiceClient(); //client.TranslateCompleted += (s, r) => //{ // if (r.Error != null) // { // callback(this, new ResultArgs<PhraseEdit>(r.Error)); // return; // } // var translatedText = r.Result; // PhraseEdit.NewPhraseEdit(targetLanguageText, (s2, r2) => // { // if (r2.Error != null) // { // callback(this, new ResultArgs<PhraseEdit>(r.Error)); // return; // } // var translatedPhrase = r2.Object; // translatedPhrase.Text = translatedText; // callback(this, new ResultArgs<PhraseEdit>(translatedPhrase)); // return; // }); //}; //var untranslatedPhraseLanguageCode = BingTranslateHelper.GetLanguageCode(untranslatedPhrase.Language.Text); //var targetLanguageCode = BingTranslateHelper.GetLanguageCode(targetLanguageText); //try //{ // client.TranslateAsync(StudyResources.BingAppId, // untranslatedPhrase.Text, // untranslatedPhraseLanguageCode, // targetLanguageCode, // @"text/plain", //this as opposed to "text/html" // "general"); //only supported category is "general" // //GOTO ABOVE TRANSLATECOMPLETED HANDLER //} //catch (Exception ex) //{ // callback(this, new ResultArgs<PhraseEdit>(ex)); //} }
public async Task NEW_EDIT_BEGINSAVE_GET() { PhraseEdit newPhraseEdit = null; PhraseEdit savedPhraseEdit = null; PhraseEdit gottenPhraseEdit = null; var isAsyncComplete = false; var hasError = false; EnqueueConditional(() => isAsyncComplete); await Setup(); try { //NEW newPhraseEdit = await PhraseEdit.NewPhraseEditAsync(); //EDIT newPhraseEdit.Text = "TestPhrase NEW_EDIT_BEGINSAVE_GET"; newPhraseEdit.UserId = SeedData.Ton.GetTestValidUserDto().Id; newPhraseEdit.Username = SeedData.Ton.TestValidUsername; //SAVE savedPhraseEdit = await newPhraseEdit.SaveAsync(); //GET (CONFIRM SAVE) gottenPhraseEdit = await PhraseEdit.GetPhraseEditAsync(savedPhraseEdit.Id); } catch { hasError = true; } finally { EnqueueCallback( () => Assert.IsFalse(hasError), () => Assert.IsNotNull(newPhraseEdit), () => Assert.IsNotNull(savedPhraseEdit), () => Assert.IsNotNull(gottenPhraseEdit), () => Assert.AreEqual(savedPhraseEdit.Id, gottenPhraseEdit.Id), () => Assert.AreEqual(savedPhraseEdit.Text, gottenPhraseEdit.Text) ); EnqueueTestComplete(); Teardown(); isAsyncComplete = true; } }
private async Task <ResultArgs <double> > GetPercentKnownAsync(PhraseEdit phrase) { #region CHECK CACHE var results = from entry in Cache where entry.Key.PhraseText == phrase.Text && entry.Key.LanguageText == phrase.Language.Text select entry; if (results.Count() == 1) { #region GIVE ANSWER FROM CACHE var entry = results.First(); var percentKnown = entry.Value; return(await new Task <ResultArgs <double> >(() => { return new ResultArgs <double>(percentKnown); })); #endregion } #endregion #region CHECK BELIEFS IN DB var beliefs = await PhraseBeliefList.GetBeliefsAboutPhraseAsync(phrase.Id); if (beliefs.Count <= 0) { //WE HAVE NO PRIOR BELIEFS ABOUT THIS PHRASE var percentKnownTask = GetPercentKnownAboutPhraseWithNoPriorBeliefsAsync(phrase); return(await percentKnownTask); } else { //WE HAVE BELIEFS ABOUT THIS PHRASE var percentKnownTask = GetPercentKnownAboutPhraseWithBeliefs(phrase, beliefs); return(await percentKnownTask); } #endregion }
/// <summary> /// Executes callback when answer is shown, or when exception is thrown. /// </summary> /// <param name="question">Question PhraseEdit</param> /// <param name="answer">Answer PhraseEdit</param> /// <param name="questionDurationInMilliseconds"></param> /// <param name="callback"></param> public void AskQuestion(PhraseEdit question, PhraseEdit answer, int questionDurationInMilliseconds, ExceptionCheckCallback callback) { try { //BingTranslatorService.LanguageServiceClient client = new BingTranslatorService.LanguageServiceClient(); //client.SpeakCompleted += client_SpeakCompleted; //client.SpeakAsync(AppResources.BingAppId, question.Text, BingTranslateHelper.GetLanguageCode(question.Language.Text), string.Empty, string.Empty); HideAnswer(); Question = question; Answer = answer; //QuestionDurationInMilliseconds = questionDurationInMilliseconds; BackgroundWorker timer = new BackgroundWorker(); timer.DoWork += (s, e) => { try { System.Threading.Thread.Sleep(questionDurationInMilliseconds); if (AnswerVisibility == Visibility.Collapsed) { ShowAnswer(); } callback(null); } catch (Exception ex) { callback(ex); } }; timer.RunWorkerAsync(); } catch (Exception ex) { callback(ex); } }
public SinglePhraseEventBase(PhraseEdit phrase) : base(TimeSpan.MinValue) { AddPhraseDetails(phrase); }
public SinglePhraseEventBase(PhraseEdit phrase, params KeyValuePair <string, object>[] details) : base(TimeSpan.MinValue, details) { AddPhraseDetails(phrase); }
public ParentPhraseChildPhraseEventBase(PhraseEdit parent, PhraseEdit child, TimeSpan duration) : base(duration, new KeyValuePair<string, object>(HistoryResources.Key_ChildId, child.Id), new KeyValuePair<string, object>(HistoryResources.Key_ParentId, parent.Id)) { }
/// <summary> /// Creates a study item using the phrase and nativeLanguageText. If the phrase.Language /// is the same as the native language, then this will be a study item related to studying /// the meaning of the phrase, all in the native language. If these two languages are /// different, then it will procure a translation study item. /// This prepares the view model so that all that is necessary for the caller is to call /// viewmodel.Show(...); /// </summary> public void Procure(PhraseEdit phrase, string nativeLanguageText, AsyncCallback<StudyItemViewModelBase> callback) { //FOR NOW, THIS WILL JUST CREATE ONE TYPE OF STUDY ITEM VIEW MODEL: STUDY QUESTION ANSWER VIEWMODEL. //IT WILL SHOW THE QUESTION AND HIDE THE ANSWER FOR VARIOUS AMOUNTS OF TIME, DEPENDING ON QUESTION //LENGTH, AND OTHER FACTORS. //IN THE FUTURE, THIS WILL BE EXTENSIBILITY POINT WHERE WE CAN SELECT DIFFERENT VARIETIES OF Q AND A //TRANSLATION VIEW MODELS BASED ON HOW SUCCESSFUL THEY ARE. WE CAN ALSO HAVE DIFFERENT CONFIGURATIONS //OF VARIETIES BE SELECTED HERE. //ViewModels.StudyTimedQuestionAnswerViewModel viewModel = new ViewModels.StudyTimedQuestionAnswerViewModel(); var languageText = phrase.Language.Text; //IF THE TARGET LANGUAGE IS DIFFERENT FROM THE PHRASE LANGUAGE, THEN WE CREATE A TRANSLATION Q & A. //IF THE TWO LANGUAGES ARE THE SAME, THEN WE CREATE A STUDY NATIVE LANGUAGE PHRASE Q & A. bool phraseIsInForeignLanguage = (languageText != nativeLanguageText); if (phraseIsInForeignLanguage) { //DO A TRANSLATION Q & A //WE NEED TO FIND A TRANSLATION FOR THIS FOREIGN LANGUAGE PHRASE. PhraseEdit translatedPhrase = null; GetTranslatedPhrase(phrase, nativeLanguageText, (s, r) => { if (r.Error != null) { callback(this, new ResultArgs<StudyItemViewModelBase>(r.Error)); return; } translatedPhrase = r.Object; try { //RIGHT NOW, WE HAVE A MANUAL AND A TIMED QA. var timedQA = new ViewModels.StudyPhraseTimedQuestionAnswerViewModel(); var manualQA = new ViewModels.StudyPhraseManualQuestionAnswerViewModel(); //PICK A RANDOM VIEW MODEL, EITHER TIMED OR MANUAL StudyItemViewModelBase dummy = null; var qaViewModel = RandomPicker.Ton.PickOne<StudyItemViewModelBase>(timedQA, manualQA, out dummy); //ASSIGN QUESTION/ANSWER RANDOMLY FROM PHRASE AND TRANSLATED PHRASE PhraseEdit answer = null; var question = RandomPicker.Ton.PickOne(phrase, translatedPhrase, out answer); //INITIALIZE VIEWMODEL WITH Q & A if (qaViewModel is ViewModels.StudyPhraseTimedQuestionAnswerViewModel) ((ViewModels.StudyPhraseTimedQuestionAnswerViewModel)qaViewModel).Initialize(question, answer, (e1) => { //error callback if (e1 != null) callback(this, new ResultArgs<StudyItemViewModelBase>(e1)); //success callback callback(this, new ResultArgs<StudyItemViewModelBase>(qaViewModel)); }); else ((ViewModels.StudyPhraseManualQuestionAnswerViewModel)qaViewModel).Initialize(question, answer, (e2) => { //error callback if (e2 != null) callback(this, new ResultArgs<StudyItemViewModelBase>(e2)); //success callback callback(this, new ResultArgs<StudyItemViewModelBase>(qaViewModel)); }); ////INITIATE THE CALLBACK TO LET IT KNOW WE HAVE OUR VIEWMODEL! WHEW THAT'S A LOT OF ASYNC. //callback(this, new ResultArgs<StudyItemViewModelBase>(qaViewModel)); } catch (Exception ex) { callback(this, new ResultArgs<StudyItemViewModelBase>(ex)); } }); } else { //DO A NATIVE LANGUAGE Q & A throw new NotImplementedException(); } }
public void SetQuestionAnswer(PhraseEdit questionPhrase, PhraseEdit answerPhrase) { }
/// <summary> /// Creates a study item using the phrase and nativeLanguageText. If the phrase.Language /// is the same as the native language, then this will be a study item related to studying /// the meaning of the phrase, all in the native language. If these two languages are /// different, then it will procure a translation study item. /// This prepares the view model so that all that is necessary for the caller is to call /// viewmodel.Show(...); /// </summary> public async Task<StudyItemViewModelBase> ProcureAsync(PhraseEdit phrase, string nativeLanguageText) //public async Task<ResultArgs<StudyItemViewModelBase>> ProcureAsync(PhraseEdit phrase, { //FOR NOW, THIS WILL JUST CREATE ONE TYPE OF STUDY ITEM VIEW MODEL: STUDY QUESTION ANSWER VIEWMODEL. //IT WILL SHOW THE QUESTION AND HIDE THE ANSWER FOR VARIOUS AMOUNTS OF TIME, DEPENDING ON QUESTION //LENGTH, AND OTHER FACTORS. //IN THE FUTURE, THIS WILL BE EXTENSIBILITY POINT WHERE WE CAN SELECT DIFFERENT VARIETIES OF Q AND A //TRANSLATION VIEW MODELS BASED ON HOW SUCCESSFUL THEY ARE. WE CAN ALSO HAVE DIFFERENT CONFIGURATIONS //OF VARIETIES BE SELECTED HERE. //ViewModels.StudyTimedQuestionAnswerViewModel viewModel = new ViewModels.StudyTimedQuestionAnswerViewModel(); var languageText = phrase.Language.Text; //IF THE TARGET LANGUAGE IS DIFFERENT FROM THE PHRASE LANGUAGE, THEN WE CREATE A TRANSLATION Q & A. //IF THE TWO LANGUAGES ARE THE SAME, THEN WE CREATE A STUDY NATIVE LANGUAGE PHRASE Q & A. bool phraseIsInForeignLanguage = (languageText != nativeLanguageText); if (phraseIsInForeignLanguage) { //DO A TRANSLATION Q & A //WE NEED TO FIND A TRANSLATION FOR THIS FOREIGN LANGUAGE PHRASE. PhraseEdit translatedPhrase = null; #region Thinking (try..) var targetId = Guid.NewGuid(); History.Events.ThinkingAboutTargetEvent.Publish(targetId); try { #endregion var result = await GetTranslatedPhrase(phrase, nativeLanguageText); translatedPhrase = result.Object; #region (...finally) Thinked } finally { History.Events.ThinkedAboutTargetEvent.Publish(targetId); } #endregion //RIGHT NOW, WE HAVE A MANUAL AND A TIMED QA. var timedQA = new ViewModels.StudyPhraseTimedQuestionAnswerViewModel(); var manualQA = new ViewModels.StudyPhraseTimedQuestionAnswerViewModel(); //hack: I'm just setting these both to timed, because that is what I've corrected //for the async stuff and I want to make sure that it works. //var manualQA = new ViewModels.StudyPhraseManualQuestionAnswerViewModel(); //PICK A RANDOM VIEW MODEL, EITHER TIMED OR MANUAL StudyItemViewModelBase dummy = null; var qaViewModel = RandomPicker.Ton.PickOne<StudyItemViewModelBase>(timedQA, manualQA, out dummy); //ASSIGN QUESTION/ANSWER RANDOMLY FROM PHRASE AND TRANSLATED PHRASE PhraseEdit answer = null; var question = RandomPicker.Ton.PickOne(phrase, translatedPhrase, out answer); //INITIALIZE VIEWMODEL WITH Q & A if (qaViewModel is ViewModels.StudyPhraseTimedQuestionAnswerViewModel) ((ViewModels.StudyPhraseTimedQuestionAnswerViewModel)qaViewModel).Initialize(question, answer);//, (e1) => else ((ViewModels.StudyPhraseTimedQuestionAnswerViewModel)qaViewModel).Initialize(question, answer); //((ViewModels.StudyPhraseManualQuestionAnswerViewModel)qaViewModel).Initialize(question, answer); return qaViewModel; //var resultQAViewModel = new ResultArgs<StudyItemViewModelBase>(qaViewModel); //return await StudyHelper.WrapInTask<ResultArgs<StudyItemViewModelBase>>(resultQAViewModel); } else { //DO A NATIVE LANGUAGE Q & A throw new NotImplementedException(); } }
public QuestionAnswerArgs(PhraseEdit question, PhraseEdit answer) { Question = question; Answer = answer; Error = null; }
public ViewedPhraseOnScreenEvent(PhraseEdit phrase, TimeSpan duration) : base(phrase, duration) { }
public ViewedPhraseOnScreenEvent(PhraseEdit phrase) : base(phrase) { }
public void Initialize(PhraseEdit question, PhraseEdit answer) { _InitialQuestionText = question.Text; _ModifiedQuestionText = ""; _InitialAnswerText = answer.Text; _ModifiedAnswerText = ""; Question = question; Answer = answer; HideAnswer(); //if (!question.IsValid) // callback(new ArgumentException("question is not a valid phrase", "question")); //if (!answer.IsValid) // callback(new ArgumentException("answer is not a valid phrase", "answer")); ////THE POINT OF THIS METHOD IS TO ASSIGN QUESTION, ANSWER, AND CALCULATE TIMING ////WE GET THE ACTUAL PHRASEEDITS FROM THE DB ////get these anew from database, so we know that we are NOT dealing ////with any children, to make things smoother when we are editing/saving them. //var criteria = new Business.Criteria.ListOfPhrasesCriteria(question, answer); //Business.PhrasesByTextAndLanguageRetriever.CreateNew(criteria, (s, r) => //{ // if (r.Error != null) // { // callback(r.Error); // return; // } // var retriever = r.Object; // Question = retriever.RetrievedPhrases[question.Id]; // Answer = retriever.RetrievedPhrases[answer.Id]; // if (Question == null) // callback(new ArgumentException("phrase not found in DB", "question")); // if (Answer == null) // callback(new ArgumentException("phrase not found in DB", "answer")); // //FINISH UP // HideAnswer(); // callback(null); //}); }
public SinglePhraseEventBase(PhraseEdit phrase, params KeyValuePair<string, object>[] details) : base(TimeSpan.MinValue, details) { AddPhraseDetails(phrase); }
public TranslationPairSearchCriteria(PhraseEdit phraseA, PhraseEdit phraseB, string contextText = "") { PhraseA = phraseA; PhraseB = phraseB; ContextText = contextText; }
public void NEW_EDIT_BEGINSAVE_GET_DELETE_GET() { //INITIALIZE ERRORS TO EXCEPTION, BECAUSE EXPECT THEM TO BE NULL LATER Exception newError = new Exception(); Exception savedError = new Exception(); Exception gottenError = new Exception(); Exception deletedError = new Exception(); //INITIALIZE CONFIRM TO NULL, BECAUSE WE EXPECT THIS TO BE AN ERROR LATER Exception deleteConfirmedError = null; PhraseEdit newPhraseEdit = null; PhraseEdit savedPhraseEdit = null; PhraseEdit gottenPhraseEdit = null; PhraseEdit deletedPhraseEdit = null; //INITIALIZE TO EMPTY Phrase EDIT, BECAUSE WE EXPECT THIS TO BE NULL LATER PhraseEdit deleteConfirmedPhraseEdit = new PhraseEdit(); var isNewed = false; var isSaved = false; var isGotten = false; var isDeleted = false; var isDeleteConfirmed = false; //NEW PhraseEdit.NewPhraseEdit((s, r) => { newError = r.Error; if (newError != null) throw newError; newPhraseEdit = r.Object; isNewed = true; //EDIT newPhraseEdit.Text = "TestPhrase NEW_EDIT_BEGINSAVE_GET_DELETE_GET"; newPhraseEdit.UserId = SeedData.Ton.GetTestValidUserDto().Id; newPhraseEdit.Username = SeedData.Ton.TestValidUsername; //SAVE newPhraseEdit.BeginSave((s2, r2) => { savedError = r2.Error; if (savedError != null) throw savedError; savedPhraseEdit = r2.NewObject as PhraseEdit; isSaved = true; //GET (CONFIRM SAVE) PhraseEdit.GetPhraseEdit(savedPhraseEdit.Id, (s3, r3) => { gottenError = r3.Error; if (gottenError != null) throw gottenError; gottenPhraseEdit = r3.Object; isGotten = true; //DELETE (MARKS DELETE. SAVE INITIATES ACTUAL DELETE IN DB) gottenPhraseEdit.Delete(); gottenPhraseEdit.BeginSave((s4, r4) => { deletedError = r4.Error; if (deletedError != null) throw deletedError; deletedPhraseEdit = r4.NewObject as PhraseEdit; //TODO: Figure out why PhraseEditTests final callback gets thrown twice. When server throws an exception (expected because we are trying to fetch a deleted phrase that shouldn't exist), the callback is executed twice. PhraseEdit.GetPhraseEdit(deletedPhraseEdit.Id, (s5, r5) => { var debugExecutionLocation = Csla.ApplicationContext.ExecutionLocation; var debugLogicalExecutionLocation = Csla.ApplicationContext.LogicalExecutionLocation; deleteConfirmedError = r5.Error; if (deleteConfirmedError != null) { isDeleteConfirmed = true; throw new ExpectedException(deleteConfirmedError); } deleteConfirmedPhraseEdit = r5.Object; }); }); }); }); }); EnqueueConditional(() => isNewed); EnqueueConditional(() => isSaved); EnqueueConditional(() => isGotten); EnqueueConditional(() => isDeleted); EnqueueConditional(() => isDeleteConfirmed); EnqueueCallback( () => { Assert.IsNull(newError); }, () => { Assert.IsNull(savedError); }, () => { Assert.IsNull(gottenError); }, () => { Assert.IsNull(deletedError); }, //WE EXPECT AN ERROR, AS WE TRIED A GET ON AN ID THAT SHOULD HAVE BEEN DELETED () => { Assert.IsNotNull(deleteConfirmedError); }, () => { Assert.IsNotNull(newPhraseEdit); }, () => { Assert.IsNotNull(savedPhraseEdit); }, () => { Assert.IsNotNull(gottenPhraseEdit); }, () => { Assert.IsNotNull(deletedPhraseEdit); }, () => { Assert.IsNull(deleteConfirmedPhraseEdit); }); EnqueueTestComplete(); }
/// <summary> /// Uses auto translation service (as of writing, this is BingTranslatorService) to translate phrase /// into another phrase, which is returned in the callback. /// </summary> private void AutoTranslate(PhraseEdit untranslatedPhrase, string targetLanguageText, AsyncCallback<PhraseEdit> callback) { BingTranslatorService.LanguageServiceClient client = new BingTranslatorService.LanguageServiceClient(); client.TranslateCompleted += (s, r) => { if (r.Error != null) { callback(this, new ResultArgs<PhraseEdit>(r.Error)); return; } var translatedText = r.Result; PhraseEdit.NewPhraseEdit(targetLanguageText, (s2, r2) => { if (r2.Error != null) { callback(this, new ResultArgs<PhraseEdit>(r.Error)); return; } var translatedPhrase = r2.Object; translatedPhrase.Text = translatedText; callback(this, new ResultArgs<PhraseEdit>(translatedPhrase)); return; }); }; var untranslatedPhraseLanguageCode = BingTranslateHelper.GetLanguageCode(untranslatedPhrase.Language.Text); var targetLanguageCode = BingTranslateHelper.GetLanguageCode(targetLanguageText); try { client.TranslateAsync(StudyResources.BingAppId, untranslatedPhrase.Text, untranslatedPhraseLanguageCode, targetLanguageCode, @"text/plain", //this as opposed to "text/html" "general"); //only supported category is "general" //GOTO ABOVE TRANSLATECOMPLETED HANDLER } catch (Exception ex) { callback(this, new ResultArgs<PhraseEdit>(ex)); } }
/// <summary> /// First searches DB for translated phrase. If not found there, uses AutoTranslate. /// </summary> private async Task<ResultArgs<PhraseEdit>> GetTranslatedPhrase(PhraseEdit phrase, string targetLanguageText) { var criteria = new Business.Criteria.TranslationSearchCriteria(phrase, targetLanguageText, true); var retriever = await TranslationSearchRetriever.CreateNewAsync(criteria); if (retriever.Translation != null) { var translatedPhrase = BusinessHelper.ExtractPhrase(retriever.Translation, targetLanguageText); return new ResultArgs<PhraseEdit>(translatedPhrase); } else { return null; } //////THIS IS THE PHRASE WE'RE LOOKING FOR //PhraseEdit translatedPhrase = null; ////FIRST LOOK IN DB. IF NOT, THEN AUTO TRANSLATE. //#region Thinking (try..) //var targetId = Guid.NewGuid(); //History.Events.ThinkingAboutTargetEvent.Publish(targetId); //try //{ //#endregion // var searchCriteria = new Business.Criteria.TranslationSearchCriteria(phrase, targetLanguageText); // var retriever = await TranslationSearchRetriever.CreateNewAsync(searchCriteria); //#region (...finally) Thinked //} //finally //{ // History.Events.ThinkedAboutTargetEvent.Publish(targetId); //} // #endregion //// callback(this, new ResultArgs<PhraseEdit>(r.Error)); //// return; //// } //// var retriever = r.Object; //// var foundTranslation = retriever.Translation; //// if (foundTranslation != null) //// { //// //FOUND TRANSLATED PHRASE IN DATABASE. //// translatedPhrase = (from p in foundTranslation.Phrases //// where p.Language.Text == targetLanguageText //// select p).First(); //// callback(this, new ResultArgs<PhraseEdit>(translatedPhrase)); //// return; //// } //// else //// { // //NO TRANSLATION FOUND IN DB, WILL NEED TO AUTO TRANSLATE // var translatedPhrase = await AutoTranslate(phrase, targetLanguageText);//, (s2, r2) => // //{ // // if (r2.Error != null) // // { // // callback(this, new ResultArgs<PhraseEdit>(r2.Error)); // // return; // // } // // //GOT TRANSLATED PHRASE VIA AUTOTRANSLATE. NEED TO CHECK IF WE ALREADY HAVE THIS // // //PHRASE IN OUR DB, AND USE THAT OBJECT INSTEAD IF WE DO. // // translatedPhrase = r2.Object; // // var translatedPhraseLanguageText = translatedPhrase.Language.Text; // // var criteriaPhrase = new Business.Criteria.ListOfPhrasesCriteria(translatedPhrase); // // Business.PhrasesByTextAndLanguageRetriever.CreateNew(criteriaPhrase, (s3, r3) => // // { // // if (r3.Error != null) // // { // // callback(this, new ResultArgs<PhraseEdit>(r2.Error)); // // return; // // } // // //CHECK OUR RETRIEVER IF IT SUCCESSFULLY FOUND A PHRASE EDIT IN THE DB. // // //IF IT DID FIND ONE (NOT NULL), THEN ASSIGN OUR TRANSLATEDPHRASE VAR TO THE DB VERSION. // // //THIS WAY, WE WON'T DUPLICATE PHRASES IN OUR DB. // // var translatedPhraseRetriever = r3.Object; // // var dbPhraseEdit = translatedPhraseRetriever.RetrievedPhrases[translatedPhrase.Id]; // // if (dbPhraseEdit != null) // // translatedPhrase = dbPhraseEdit; // // //FIRE EVENT THAT WE HAVE AUTOTRANSLATED A PHRASE // // var autoTranslatedEvent = // // new History.Events.PhraseAutoTranslatedEvent(phrase, translatedPhrase); // // History.HistoryPublisher.Ton.PublishEvent(autoTranslatedEvent); // // //CALLBACK // // callback(this, new ResultArgs<PhraseEdit>(translatedPhrase)); // // return; // // }); // //}); //// } ////}); }
public PhraseCreatedFromScratchEvent(PhraseEdit phrase) : base(phrase) { }
///// <summary> ///// Creates a study item using the line and MLT. ///// This prepares the view model so that all that is necessary for the caller is to call ///// viewmodel.Show(...); ///// </summary> //public async Task<ResultArgs<StudyItemViewModelBase>> Procure(LineEdit line, // MultiLineTextEdit multiLineText) //{ // //FOR NOW, THIS WILL JUST CREATE ONE OF TWO STUDY ITEM VIEW MODELS: // //STUDY LINE ORDER VIEWMODEL (TIMED OR MANUAL). // //IT WILL SHOW THE QUESTION AND HIDE THE ANSWER FOR VARIOUS AMOUNTS OF TIME, DEPENDING ON QUESTION // //LENGTH, AND OTHER FACTORS. // //IN THE FUTURE, THIS WILL BE EXTENSIBILITY POINT WHERE WE CAN SELECT DIFFERENT VARIETIES OF Q AND A // //TRANSLATION VIEW MODELS BASED ON HOW SUCCESSFUL THEY ARE. WE CAN ALSO HAVE DIFFERENT CONFIGURATIONS // //OF VARIETIES BE SELECTED HERE. // var manualViewModel = new StudyLineOrderManualQuestionAnswerViewModel(); // var timedViewModel = new StudyLineOrderTimedQuestionAnswerViewModel(); // StudyItemViewModelBase dummy = null; // var viewModel = RandomPicker.Ton.PickOne<StudyItemViewModelBase>(manualViewModel, timedViewModel, out dummy); // if (viewModel is StudyLineOrderManualQuestionAnswerViewModel) // manualViewModel.Initialize(line, multiLineText); // else // timedViewModel.Initialize(line, multiLineText); // return await new Task<ResultArgs<StudyItemViewModelBase>>( // () => // { // var result = new ResultArgs<StudyItemViewModelBase>(viewModel); // return result; // }); //} /// <summary> /// Uses auto translation service (as of writing, this is BingTranslatorService) to translate phrase /// into another phrase, which is returned in the callback. /// </summary> private async Task<PhraseEdit> AutoTranslate(PhraseEdit untranslatedPhrase, string targetLanguageText) { throw new NotImplementedException(); //todo: implement this using common.translation.translator //BingTranslatorService.LanguageServiceClient client = new BingTranslatorService.LanguageServiceClient(); //client.TranslateCompleted += (s, r) => //{ // if (r.Error != null) // { // callback(this, new ResultArgs<PhraseEdit>(r.Error)); // return; // } // var translatedText = r.Result; // PhraseEdit.NewPhraseEdit(targetLanguageText, (s2, r2) => // { // if (r2.Error != null) // { // callback(this, new ResultArgs<PhraseEdit>(r.Error)); // return; // } // var translatedPhrase = r2.Object; // translatedPhrase.Text = translatedText; // callback(this, new ResultArgs<PhraseEdit>(translatedPhrase)); // return; // }); //}; //var untranslatedPhraseLanguageCode = BingTranslateHelper.GetLanguageCode(untranslatedPhrase.Language.Text); //var targetLanguageCode = BingTranslateHelper.GetLanguageCode(targetLanguageText); //try //{ // client.TranslateAsync(StudyResources.BingAppId, // untranslatedPhrase.Text, // untranslatedPhraseLanguageCode, // targetLanguageCode, // @"text/plain", //this as opposed to "text/html" // "general"); //only supported category is "general" // //GOTO ABOVE TRANSLATECOMPLETED HANDLER //} //catch (Exception ex) //{ // callback(this, new ResultArgs<PhraseEdit>(ex)); //} }
public async Task NEW_EDIT_BEGINSAVE_GET_DELETE_GET() { PhraseEdit newPhraseEdit = null; PhraseEdit savedPhraseEdit = null; PhraseEdit gottenPhraseEdit = null; PhraseEdit deletedPhraseEdit = null; //INITIALIZE TO EMPTY Phrase EDIT, BECAUSE WE EXPECT THIS TO BE NULL LATER PhraseEdit deleteConfirmedPhraseEdit = new PhraseEdit(); var isAsyncComplete = false; var hasError = false; EnqueueConditional(() => isAsyncComplete); await Setup(); try { //NEW newPhraseEdit = await PhraseEdit.NewPhraseEditAsync(); //EDIT newPhraseEdit.Text = "TestPhrase NEW_EDIT_BEGINSAVE_GET_DELETE_GET"; newPhraseEdit.UserId = SeedData.Ton.GetTestValidUserDto().Id; newPhraseEdit.Username = SeedData.Ton.TestValidUsername; //SAVE savedPhraseEdit = await newPhraseEdit.SaveAsync(); //GET (CONFIRM SAVE) gottenPhraseEdit = await PhraseEdit.GetPhraseEditAsync(savedPhraseEdit.Id); //DELETE (MARKS DELETE. SAVE INITIATES ACTUAL DELETE IN DB) gottenPhraseEdit.Delete(); deletedPhraseEdit = await gottenPhraseEdit.SaveAsync(); try { deleteConfirmedPhraseEdit = await PhraseEdit.GetPhraseEditAsync(deletedPhraseEdit.Id); } catch (Csla.DataPortalException dpex) { var debugExecutionLocation = Csla.ApplicationContext.ExecutionLocation; var debugLogicalExecutionLocation = Csla.ApplicationContext.LogicalExecutionLocation; //WE EXPECT AN ID NOT FOUND EXCEPTION. IF SOMETHING ELSE, RETHROW IT. if (!TestsHelper.IsIdNotFoundException(dpex)) throw dpex; } } catch { hasError = true; } finally { EnqueueCallback( () => Assert.IsFalse(hasError), () => Assert.IsNotNull(newPhraseEdit), () => Assert.IsNotNull(savedPhraseEdit), () => Assert.IsNotNull(gottenPhraseEdit), () => Assert.IsNotNull(deletedPhraseEdit), () => Assert.AreEqual(Guid.Empty, deleteConfirmedPhraseEdit.Id), () => Assert.AreEqual(Guid.Empty, deleteConfirmedPhraseEdit.LanguageId), () => Assert.AreEqual(Guid.Empty, deleteConfirmedPhraseEdit.UserId), () => Assert.AreEqual(string.Empty, deleteConfirmedPhraseEdit.Username) ); EnqueueTestComplete(); Teardown(); isAsyncComplete = true; } }
public ViewingPhrasePartOfLineOnScreenEvent(PhraseEdit phrase, LineEdit line, TimeSpan duration) : base(phrase, duration) { AddLineDetails(line); }
public SinglePhraseEventBase(PhraseEdit phrase, TimeSpan duration) : base(duration) { AddPhraseDetails(phrase); }
public ViewingPhrasePartOfLineOnScreenEvent(PhraseEdit phrase, LineEdit line) : base(phrase) { AddLineDetails(line); }
public SinglePhraseEventBase(PhraseEdit phrase, TimeSpan duration, params KeyValuePair <string, object>[] details) : base(duration, details) { AddPhraseDetails(phrase); }
public async Task MAKE_PHRASE_WITH_REALLY_REALLY_LONG_NUMERICAL_TEXT() { var maxLength = 300000; //worked maxLength = 100000; //worked maxLength = 30000; //just for a big number, to lessen time to do test. var i = 0; string reallyReallyLongText = ""; while (reallyReallyLongText.Length < maxLength) { reallyReallyLongText += i.ToString(); i++; if (i == maxLength) //shouldn't happen, but no big deal if it does. It's just a reallyraeallyreallyreally long text. { break; } } if (reallyReallyLongText.Length > maxLength) { reallyReallyLongText = reallyReallyLongText.Substring(0, maxLength); } PhraseEdit newPhraseEdit = null; PhraseEdit savedPhraseEdit = null; PhraseEdit gottenPhraseEdit = null; var isAsyncComplete = false; var hasError = false; EnqueueConditional(() => isAsyncComplete); await Setup(); try { //NEW newPhraseEdit = await PhraseEdit.NewPhraseEditAsync(); //EDIT newPhraseEdit.Text = reallyReallyLongText; newPhraseEdit.UserId = SeedData.Ton.GetTestValidUserDto().Id; newPhraseEdit.Username = SeedData.Ton.TestValidUsername; //SAVE savedPhraseEdit = await newPhraseEdit.SaveAsync(); //GET (CONFIRM SAVE) gottenPhraseEdit = await PhraseEdit.GetPhraseEditAsync(savedPhraseEdit.Id); } catch { hasError = true; } finally { EnqueueCallback( () => Assert.IsFalse(hasError), () => Assert.IsNotNull(newPhraseEdit), () => Assert.IsNotNull(savedPhraseEdit), () => Assert.IsNotNull(gottenPhraseEdit), () => Assert.AreEqual(savedPhraseEdit.Id, gottenPhraseEdit.Id), () => Assert.AreEqual(reallyReallyLongText.Length, gottenPhraseEdit.Text.Length), () => Assert.AreEqual(savedPhraseEdit.Text, gottenPhraseEdit.Text) ); EnqueueTestComplete(); Teardown(); isAsyncComplete = true; } }
/// <summary> /// First searches DB for translated phrase. If not found there, uses AutoTranslate. /// </summary> private async Task <ResultArgs <PhraseEdit> > GetTranslatedPhrase(PhraseEdit phrase, string targetLanguageText) { var criteria = new Business.Criteria.TranslationSearchCriteria(phrase, targetLanguageText, true); var retriever = await TranslationSearchRetriever.CreateNewAsync(criteria); if (retriever.Translation != null) { var translatedPhrase = BusinessHelper.ExtractPhrase(retriever.Translation, targetLanguageText); return(new ResultArgs <PhraseEdit>(translatedPhrase)); } else { return(null); } //////THIS IS THE PHRASE WE'RE LOOKING FOR //PhraseEdit translatedPhrase = null; ////FIRST LOOK IN DB. IF NOT, THEN AUTO TRANSLATE. //#region Thinking (try..) //var targetId = Guid.NewGuid(); //History.Events.ThinkingAboutTargetEvent.Publish(targetId); //try //{ //#endregion // var searchCriteria = new Business.Criteria.TranslationSearchCriteria(phrase, targetLanguageText); // var retriever = await TranslationSearchRetriever.CreateNewAsync(searchCriteria); //#region (...finally) Thinked //} //finally //{ // History.Events.ThinkedAboutTargetEvent.Publish(targetId); //} // #endregion //// callback(this, new ResultArgs<PhraseEdit>(r.Error)); //// return; //// } //// var retriever = r.Object; //// var foundTranslation = retriever.Translation; //// if (foundTranslation != null) //// { //// //FOUND TRANSLATED PHRASE IN DATABASE. //// translatedPhrase = (from p in foundTranslation.Phrases //// where p.Language.Text == targetLanguageText //// select p).First(); //// callback(this, new ResultArgs<PhraseEdit>(translatedPhrase)); //// return; //// } //// else //// { // //NO TRANSLATION FOUND IN DB, WILL NEED TO AUTO TRANSLATE // var translatedPhrase = await AutoTranslate(phrase, targetLanguageText);//, (s2, r2) => // //{ // // if (r2.Error != null) // // { // // callback(this, new ResultArgs<PhraseEdit>(r2.Error)); // // return; // // } // // //GOT TRANSLATED PHRASE VIA AUTOTRANSLATE. NEED TO CHECK IF WE ALREADY HAVE THIS // // //PHRASE IN OUR DB, AND USE THAT OBJECT INSTEAD IF WE DO. // // translatedPhrase = r2.Object; // // var translatedPhraseLanguageText = translatedPhrase.Language.Text; // // var criteriaPhrase = new Business.Criteria.ListOfPhrasesCriteria(translatedPhrase); // // Business.PhrasesByTextAndLanguageRetriever.CreateNew(criteriaPhrase, (s3, r3) => // // { // // if (r3.Error != null) // // { // // callback(this, new ResultArgs<PhraseEdit>(r2.Error)); // // return; // // } // // //CHECK OUR RETRIEVER IF IT SUCCESSFULLY FOUND A PHRASE EDIT IN THE DB. // // //IF IT DID FIND ONE (NOT NULL), THEN ASSIGN OUR TRANSLATEDPHRASE VAR TO THE DB VERSION. // // //THIS WAY, WE WON'T DUPLICATE PHRASES IN OUR DB. // // var translatedPhraseRetriever = r3.Object; // // var dbPhraseEdit = translatedPhraseRetriever.RetrievedPhrases[translatedPhrase.Id]; // // if (dbPhraseEdit != null) // // translatedPhrase = dbPhraseEdit; // // //FIRE EVENT THAT WE HAVE AUTOTRANSLATED A PHRASE // // var autoTranslatedEvent = // // new History.Events.PhraseAutoTranslatedEvent(phrase, translatedPhrase); // // History.HistoryPublisher.Ton.PublishEvent(autoTranslatedEvent); // // //CALLBACK // // callback(this, new ResultArgs<PhraseEdit>(translatedPhrase)); // // return; // // }); // //}); //// } ////}); }
public virtual async Task InitializeClientSeedDataSingleton() { if (ClientSeedDataIsInitialized) { return; } //UPDATE THE CLIENT SEEDDATA LANGUAGE IDS SeedData.Ton.EnglishLanguageDto.Id = _ServerEnglishLang.Id; SeedData.Ton.SpanishLanguageDto.Id = _ServerSpanishLang.Id; //UPDATE THE CLIENT SEEDDATA PHRASES if (_InitialAllPhrases == null) { _InitialAllPhrases = await PhraseList.GetAllAsync(); } PhraseList allPhrases = null; allPhrases = _InitialAllPhrases; var serverHelloPhraseQuery = (from phrase in allPhrases where phrase.Text == SeedData.Ton.HelloText && phrase.Language.Text == SeedData.Ton.EnglishText select phrase); PhraseEdit serverHelloPhrase = null; if (serverHelloPhraseQuery.Count() == 0) //we don't have the hello phrase in the db, so put it there { var phrase = allPhrases[0]; phrase.BeginEdit(); phrase.Text = SeedData.Ton.HelloText; phrase.Language = _ServerEnglishLang; phrase.ApplyEdit(); serverHelloPhrase = phrase; } else { serverHelloPhrase = serverHelloPhraseQuery.First(); } var serverHolaPhraseQuery = (from phrase in allPhrases where phrase.Text == SeedData.Ton.HolaText && phrase.Language.Text == SeedData.Ton.EnglishText select phrase); PhraseEdit serverHolaPhrase = null; if (serverHolaPhraseQuery.Count() == 0) //we don't have the Hola phrase in the db, so put it there { var phrase = allPhrases[1]; phrase.BeginEdit(); phrase.Text = SeedData.Ton.HolaText; phrase.Language = _ServerSpanishLang; phrase.ApplyEdit(); serverHolaPhrase = phrase; } else { serverHolaPhrase = serverHolaPhraseQuery.First(); } var serverLongPhraseQuery = (from phrase in allPhrases where phrase.Text == SeedData.Ton.LongText && phrase.Language.Text == SeedData.Ton.EnglishText select phrase); PhraseEdit serverLongPhrase = null; if (serverLongPhraseQuery.Count() == 0) //we don't have the Long phrase in the db, so put it there { var phrase = allPhrases[2]; phrase.BeginEdit(); phrase.Text = SeedData.Ton.LongText; phrase.Language = _ServerEnglishLang; phrase.ApplyEdit(); serverLongPhrase = phrase; } else { serverLongPhrase = serverLongPhraseQuery.First(); } var serverDogPhraseQuery = (from phrase in allPhrases where phrase.Text == SeedData.Ton.DogText && phrase.Language.Text == SeedData.Ton.EnglishText select phrase); PhraseEdit serverDogPhrase = null; if (serverDogPhraseQuery.Count() == 0) //we don't have the Dog phrase in the db, so put it there { var phrase = allPhrases[3]; phrase.BeginEdit(); phrase.Text = SeedData.Ton.DogText; phrase.Language = _ServerSpanishLang; phrase.ApplyEdit(); serverDogPhrase = phrase; } else { serverDogPhrase = serverDogPhraseQuery.First(); } var validUserId = serverHelloPhrase.UserId; SeedData.Ton.GetTestValidUserDto().Id = validUserId; SeedData.Ton.HelloPhraseDto.Id = serverHelloPhrase.Id; SeedData.Ton.HolaPhraseDto.Id = serverHolaPhrase.Id; SeedData.Ton.LongPhraseDto.Id = serverLongPhrase.Id; SeedData.Ton.DogPhraseDto.Id = serverDogPhrase.Id; SeedData.Ton.HelloPhraseDto.UserId = serverHelloPhrase.UserId; SeedData.Ton.HolaPhraseDto.UserId = serverHolaPhrase.UserId; SeedData.Ton.LongPhraseDto.UserId = serverLongPhrase.UserId; SeedData.Ton.DogPhraseDto.UserId = serverDogPhrase.UserId; ClientSeedDataIsInitialized = true; }
public SinglePhraseEventBase(PhraseEdit phrase, TimeSpan duration, params KeyValuePair<string, object>[] details) : base(duration, details) { AddPhraseDetails(phrase); }
public static void Pub(PhraseEdit parent, PhraseEdit child) { HistoryPublisher.Ton.PublishEvent(new ParentPhraseSpawnedChildPhraseEvent(parent, child)); }
public ReviewingPhraseEvent(PhraseEdit phrase, Guid reviewMethodId) : base(phrase) { AddReviewMethodId(reviewMethodId); }
/// <summary> /// First searches DB for translated phrase. If not found there, uses AutoTranslate. /// </summary> private void GetTranslatedPhrase(PhraseEdit phrase, string targetLanguageText, AsyncCallback<PhraseEdit> callback) { //THIS IS THE PHRASE WE'RE LOOKING FOR PhraseEdit translatedPhrase = null; //FIRST LOOK IN DB. IF NOT, THEN AUTO TRANSLATE. var searchCriteria = new Business.Criteria.TranslationSearchCriteria(phrase, targetLanguageText); TranslationSearchRetriever.CreateNew(searchCriteria, (s, r) => { if (r.Error != null) { callback(this, new ResultArgs<PhraseEdit>(r.Error)); return; } var retriever = r.Object; var foundTranslation = retriever.Translation; if (foundTranslation != null) { //FOUND TRANSLATED PHRASE IN DATABASE. translatedPhrase = (from p in foundTranslation.Phrases where p.Language.Text == targetLanguageText select p).First(); callback(this, new ResultArgs<PhraseEdit>(translatedPhrase)); return; } else { //NO TRANSLATION FOUND IN DB, WILL NEED TO AUTO TRANSLATE AutoTranslate(phrase, targetLanguageText, (s2, r2) => { if (r2.Error != null) { callback(this, new ResultArgs<PhraseEdit>(r2.Error)); return; } //GOT TRANSLATED PHRASE VIA AUTOTRANSLATE. NEED TO CHECK IF WE ALREADY HAVE THIS //PHRASE IN OUR DB, AND USE THAT OBJECT INSTEAD IF WE DO. translatedPhrase = r2.Object; var translatedPhraseLanguageText = translatedPhrase.Language.Text; var criteriaPhrase = new Business.Criteria.ListOfPhrasesCriteria(translatedPhrase); Business.PhrasesByTextAndLanguageRetriever.CreateNew(criteriaPhrase, (s3, r3) => { if (r3.Error != null) { callback(this, new ResultArgs<PhraseEdit>(r2.Error)); return; } //CHECK OUR RETRIEVER IF IT SUCCESSFULLY FOUND A PHRASE EDIT IN THE DB. //IF IT DID FIND ONE (NOT NULL), THEN ASSIGN OUR TRANSLATEDPHRASE VAR TO THE DB VERSION. //THIS WAY, WE WON'T DUPLICATE PHRASES IN OUR DB. var translatedPhraseRetriever = r3.Object; var dbPhraseEdit = translatedPhraseRetriever.RetrievedPhrases[translatedPhrase.Id]; if (dbPhraseEdit != null) translatedPhrase = dbPhraseEdit; //FIRE EVENT THAT WE HAVE AUTOTRANSLATED A PHRASE var autoTranslatedEvent = new History.Events.PhraseAutoTranslatedEvent(phrase, translatedPhrase); History.HistoryPublisher.Ton.PublishEvent(autoTranslatedEvent); //CALLBACK callback(this, new ResultArgs<PhraseEdit>(translatedPhrase)); return; }); }); } }); }
public ReviewedPhraseEvent(PhraseEdit phrase, Guid reviewMethodId, TimeSpan duration) : base(phrase, duration) { AddReviewMethodId(reviewMethodId); }
/// <summary> /// Executes callback when answer is shown, or when exception is thrown. /// </summary> /// <param name="question">Question PhraseEdit</param> /// <param name="answer">Answer PhraseEdit</param> /// <param name="questionDurationInMilliseconds"></param> /// <param name="callback"></param> public void AskQuestion(PhraseEdit question, PhraseEdit answer, int questionDurationInMilliseconds, ExceptionCheckCallback callback) { try { //BingTranslatorService.LanguageServiceClient client = new BingTranslatorService.LanguageServiceClient(); //client.SpeakCompleted += client_SpeakCompleted; //client.SpeakAsync(AppResources.BingAppId, question.Text, BingTranslateHelper.GetLanguageCode(question.Language.Text), string.Empty, string.Empty); HideAnswer(); Question = question; Answer = answer; //QuestionDurationInMilliseconds = questionDurationInMilliseconds; BackgroundWorker timer = new BackgroundWorker(); timer.DoWork += (s, e) => { try { System.Threading.Thread.Sleep(questionDurationInMilliseconds); if (AnswerVisibility == Visibility.Collapsed) ShowAnswer(); callback(null); } catch (Exception ex) { callback(ex); } }; timer.RunWorkerAsync(); } catch (Exception ex) { callback(ex); } }
public PhraseAutoTranslatedEvent(PhraseEdit sourcePhrase, PhraseEdit translatedPhrase) : base(TimeSpan.Zero) { SourcePhrase = sourcePhrase; TranslatedPhrase = translatedPhrase; }
public async Task GET_ALL_PHRASES_THAT_CONTAIN_THE_LETTER_H_IN_ALL_LANGUAGES() { Guid testId = Guid.Empty; PhraseEdit testPhrase = null; //THE SEARCH TEXT WE ARE LOOKING FOR string textToLookFor = "h"; //ASSUME TRUE bool allRetrievedPhrasesContainTheCorrectText = true; var isAsyncComplete = false; var hasError = false; EnqueueConditional(() => isAsyncComplete); await Setup(); try { var phrases = await PhraseList.GetAllContainingTextAsyncCaseInsensitive(textToLookFor); testId = phrases.First().Id; //CHECK TO SEE IF ALL THE PHRASES CONTAIN THE TEXT TO LOOK FOR, LIKE THEY ARE SUPPOSED TO for (int i = 0; i < phrases.Count; i++) { var phrase = phrases[i]; //LOWERCASE THE TEXTS FOR THE CHECK, BECAUSE THE RESULTS ARE CASE-INSENSITIVE, //BUT THE STRING.CONTAINS(TEXT) METHOD IS CASE-SENSITIVE var lowercasePhraseText = phrase.Text.ToLower(); var lowercaseTextToLookFor = textToLookFor.ToLower(); if (!lowercasePhraseText.Contains(lowercaseTextToLookFor)) { //THIS SHOULDN'T HAPPEN allRetrievedPhrasesContainTheCorrectText = false; } } //JUST TO CHECK TO SEE THAT OUR RESULTS WERE AT LEAST ONE, AND THAT IT'S A VALID PHRASE testPhrase = await PhraseEdit.GetPhraseEditAsync(testId); } catch { hasError = true; } finally { EnqueueCallback( () => Assert.IsFalse(hasError), () => Assert.IsTrue(allRetrievedPhrasesContainTheCorrectText), () => Assert.IsNotNull(testPhrase), () => Assert.AreEqual(testId, testPhrase.Id) ); EnqueueTestComplete(); Teardown(); isAsyncComplete = true; } }
/// <summary> /// Creates a study item using the phrase and nativeLanguageText. If the phrase.Language /// is the same as the native language, then this will be a study item related to studying /// the meaning of the phrase, all in the native language. If these two languages are /// different, then it will procure a translation study item. /// This prepares the view model so that all that is necessary for the caller is to call /// viewmodel.Show(...); /// </summary> public async Task <StudyItemViewModelBase> ProcureAsync(PhraseEdit phrase, string nativeLanguageText) //public async Task<ResultArgs<StudyItemViewModelBase>> ProcureAsync(PhraseEdit phrase, { //FOR NOW, THIS WILL JUST CREATE ONE TYPE OF STUDY ITEM VIEW MODEL: STUDY QUESTION ANSWER VIEWMODEL. //IT WILL SHOW THE QUESTION AND HIDE THE ANSWER FOR VARIOUS AMOUNTS OF TIME, DEPENDING ON QUESTION //LENGTH, AND OTHER FACTORS. //IN THE FUTURE, THIS WILL BE EXTENSIBILITY POINT WHERE WE CAN SELECT DIFFERENT VARIETIES OF Q AND A //TRANSLATION VIEW MODELS BASED ON HOW SUCCESSFUL THEY ARE. WE CAN ALSO HAVE DIFFERENT CONFIGURATIONS //OF VARIETIES BE SELECTED HERE. //ViewModels.StudyTimedQuestionAnswerViewModel viewModel = new ViewModels.StudyTimedQuestionAnswerViewModel(); var languageText = phrase.Language.Text; //IF THE TARGET LANGUAGE IS DIFFERENT FROM THE PHRASE LANGUAGE, THEN WE CREATE A TRANSLATION Q & A. //IF THE TWO LANGUAGES ARE THE SAME, THEN WE CREATE A STUDY NATIVE LANGUAGE PHRASE Q & A. bool phraseIsInForeignLanguage = (languageText != nativeLanguageText); if (phraseIsInForeignLanguage) { //DO A TRANSLATION Q & A //WE NEED TO FIND A TRANSLATION FOR THIS FOREIGN LANGUAGE PHRASE. PhraseEdit translatedPhrase = null; #region Thinking (try..) var targetId = Guid.NewGuid(); History.Events.ThinkingAboutTargetEvent.Publish(targetId); try { #endregion var result = await GetTranslatedPhrase(phrase, nativeLanguageText); translatedPhrase = result.Object; #region (...finally) Thinked } finally { History.Events.ThinkedAboutTargetEvent.Publish(targetId); } #endregion //RIGHT NOW, WE HAVE A MANUAL AND A TIMED QA. var timedQA = new ViewModels.StudyPhraseTimedQuestionAnswerViewModel(); var manualQA = new ViewModels.StudyPhraseTimedQuestionAnswerViewModel(); //hack: I'm just setting these both to timed, because that is what I've corrected //for the async stuff and I want to make sure that it works. //var manualQA = new ViewModels.StudyPhraseManualQuestionAnswerViewModel(); //PICK A RANDOM VIEW MODEL, EITHER TIMED OR MANUAL StudyItemViewModelBase dummy = null; var qaViewModel = RandomPicker.Ton.PickOne <StudyItemViewModelBase>(timedQA, manualQA, out dummy); //ASSIGN QUESTION/ANSWER RANDOMLY FROM PHRASE AND TRANSLATED PHRASE PhraseEdit answer = null; var question = RandomPicker.Ton.PickOne(phrase, translatedPhrase, out answer); //INITIALIZE VIEWMODEL WITH Q & A if (qaViewModel is ViewModels.StudyPhraseTimedQuestionAnswerViewModel) { ((ViewModels.StudyPhraseTimedQuestionAnswerViewModel)qaViewModel).Initialize(question, answer);//, (e1) => } else { ((ViewModels.StudyPhraseTimedQuestionAnswerViewModel)qaViewModel).Initialize(question, answer); } //((ViewModels.StudyPhraseManualQuestionAnswerViewModel)qaViewModel).Initialize(question, answer); return(qaViewModel); //var resultQAViewModel = new ResultArgs<StudyItemViewModelBase>(qaViewModel); //return await StudyHelper.WrapInTask<ResultArgs<StudyItemViewModelBase>>(resultQAViewModel); } else { //DO A NATIVE LANGUAGE Q & A throw new NotImplementedException(); } }
public void AddPhrase(PhraseEdit phrase) { ModelList.Add(phrase); }
public ParentPhraseSpawnedChildPhraseEvent(PhraseEdit parent, PhraseEdit child) : base(parent, child) { }