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();
    }
Beispiel #5
0
 public TranslationSearchCriteria(PhraseEdit phrase,
                                  string targetLanguageText,
                                  bool searchOnlineIfNotFoundInDB = false,
                                  string contextText = "")
 {
     Phrase                     = phrase;
     TargetLanguageText         = targetLanguageText;
     SearchOnlineIfNotFoundInDB = searchOnlineIfNotFoundInDB;
 }
        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();
        }
        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);
 }
    /// <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;

    }
 public SinglePhraseEventBase(PhraseEdit phrase, params KeyValuePair <string, object>[] details)
     : base(TimeSpan.MinValue, details)
 {
     AddPhraseDetails(phrase);
 }
 public SinglePhraseEventBase(PhraseEdit phrase)
     : base(TimeSpan.MinValue)
 {
     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();
              }
        }
Beispiel #21
0
 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));
      //}
    }
Beispiel #34
0
    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;
            }
        }
 protected virtual void AddPhraseDetails(PhraseEdit phrase)
 {
     AddPhraseId(phrase.Id);
       AddPhraseText(phrase.Text);
       AddLanguageId(phrase.LanguageId);
       AddLanguageText(phrase.Language.Text);
 }
        /// <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 SinglePhraseEventBase(PhraseEdit phrase, TimeSpan duration)
     : base(duration)
 {
     AddPhraseDetails(phrase);
 }
Beispiel #43
0
        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);
 }
Beispiel #47
0
 public ViewingPhrasePartOfLineOnScreenEvent(PhraseEdit phrase, LineEdit line)
     : base(phrase)
 {
     AddLineDetails(line);
 }
 public QuestionAnswerArgs(PhraseEdit question, PhraseEdit answer)
 {
     Question = question;
     Answer   = answer;
     Error    = null;
 }
Beispiel #49
0
 public ViewingPhrasePartOfLineOnScreenEvent(PhraseEdit phrase, LineEdit line, TimeSpan duration)
     : base(phrase, duration)
 {
     AddLineDetails(line);
 }
        /// <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;
            }
        }
 public PhraseCreatedFromScratchEvent(PhraseEdit phrase)
     : base(phrase)
 {
 }
        /// <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 ReviewingPhraseEvent(PhraseEdit phrase, Guid reviewMethodId)
     : base(phrase)
 {
     AddReviewMethodId(reviewMethodId);
 }
 public ParentPhraseSpawnedChildPhraseEvent(PhraseEdit parent, PhraseEdit child)
     : base(parent, child)
 {
 }