private void TestResultViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { TestResultViewModel item = sender as TestResultViewModel; if (e.PropertyName == nameof(TestResultViewModel.Status)) { Passed.Results.Remove(item); Failed.Results.Remove(item); PassedButSourceWasChanged.Results.Remove(item); New.Results.Remove(item); Leaked.Results.Remove(item); if (item.Status.IsPassingStatus() && item.Status.OriginalMatched) { Passed.Results.Add(item); } else if (item.Status.IsPassingStatus() && !item.Status.OriginalMatched) { PassedButSourceWasChanged.Results.Add(item); } else { Failed.Results.Add(item); } } }
private async Task <TestResultViewModel> TestCard(FileViewModel cardFile, FileViewModel hostConfigFile) { var renderResult = await RenderCard(cardFile, hostConfigFile); var result = await TestResultViewModel.CreateAsync( cardFile : cardFile, hostConfigFile : hostConfigFile, actualError : renderResult.Item1, actualImageFile : renderResult.Item2, expectedFolder : _expectedFolder, sourceHostConfigsFolder : _sourceHostConfigsFolder, sourceCardsFolder : _sourceCardsFolder); OnSingleTestCompleted?.Invoke(this, result.Status); return(result); }
private void TestResultViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { TestResultViewModel item = sender as TestResultViewModel; if (e.PropertyName == nameof(TestResultViewModel.Status)) { Passed.Results.Remove(item); Failed.Results.Remove(item); FailedButSourceWasChanged.Results.Remove(item); New.Results.Remove(item); switch (item.Status) { case TestStatus.Passed: Passed.Results.Add(item); break; } } }
private async Task <TestResultViewModel> TestCard(FileViewModel cardFile, FileViewModel hostConfigFile) { Dictionary <string, IAdaptiveCardResourceResolver> resourceResolvers = new Dictionary <string, IAdaptiveCardResourceResolver>(); resourceResolvers.Add("symbol", new SampleResourceResolver()); var renderResult = await RenderCard(cardFile, hostConfigFile, resourceResolvers); var result = await TestResultViewModel.CreateAsync( cardFile : cardFile, hostConfigFile : hostConfigFile, renderedTestResult : renderResult.Item1, actualImageFile : renderResult.Item2, actualJsonFile : renderResult.Item3, expectedFolder : _expectedFolder, sourceHostConfigsFolder : _sourceHostConfigsFolder, sourceCardsFolder : _sourceCardsFolder); OnSingleTestCompleted?.Invoke(this, result.Status); return(result); }
private async Task <TestResultViewModel> TestCard(FileViewModel cardFile, FileViewModel hostConfigFile) { Dictionary <string, IAdaptiveCardResourceResolver> resourceResolvers = new Dictionary <string, IAdaptiveCardResourceResolver>(); resourceResolvers.Add("symbol", new SampleResourceResolver()); uint reruns = 0; TestResultViewModel result = null; bool retryImage = true; while (retryImage) { var renderResult = await RenderCard(cardFile, hostConfigFile, resourceResolvers); result = await TestResultViewModel.CreateAsync( cardFile : cardFile, hostConfigFile : hostConfigFile, renderedTestResult : renderResult.Item1, actualImageFile : renderResult.Item2, actualJsonFile : renderResult.Item3, expectedFolder : _expectedFolder, sourceHostConfigsFolder : _sourceHostConfigsFolder, sourceCardsFolder : _sourceCardsFolder); if (!result.Status.IsPassingStatus()) { // Retry if we failed on image matching for an unchanged card to allow for // occasional differences in image rendering retryImage = result.Status.OriginalMatched && !result.Status.ImageMatched && (reruns < 3); reruns++; } else { retryImage = false; } } OnSingleTestCompleted?.Invoke(this, result.Status); return(result); }
public static async Task <TestResultViewModel> CreateAsync( FileViewModel cardFile, FileViewModel hostConfigFile, string actualError, StorageFile actualImageFile, StorageFolder expectedFolder, StorageFolder sourceHostConfigsFolder, StorageFolder sourceCardsFolder, UIElement xamlCard) { var answer = new TestResultViewModel() { CardName = cardFile.Name, CardFile = cardFile, XamlCard = xamlCard, HostConfigName = hostConfigFile.Name, HostConfigFile = hostConfigFile, ActualError = actualError, ActualImageFile = actualImageFile, _expectedFolder = expectedFolder, _sourceHostConfigsFolder = sourceHostConfigsFolder, _sourceCardsFolder = sourceCardsFolder, _expectedFileNameWithoutExtension = GetStrippedFileName(hostConfigFile) + "." + GetStrippedFileName(cardFile) }; try { var storedInfo = await StoredTestResultInfo.DeserializeFromFileAsync(expectedFolder, answer._expectedFileNameWithoutExtension); if (storedInfo == null) { answer.Status = TestStatus.New; } else { answer._oldHostConfigHash = storedInfo.HostConfigHash; answer._oldCardHash = storedInfo.CardHash; if (storedInfo.Error != null) { answer.ExpectedError = storedInfo.Error; } else { answer.ExpectedImageFile = await expectedFolder.GetFileAsync(answer._expectedFileNameWithoutExtension + ".png"); } } // If both had error, compare via the error if (answer.ExpectedError != null && answer.ActualError != null) { if (answer.ExpectedError == answer.ActualError) { answer.Status = TestStatus.Passed; } else { answer.Status = TestStatus.Failed; } } // If neither had error, compare via the image else if (answer.ExpectedImageFile != null && answer.ActualImageFile != null) { byte[] oldBytes = await GetPixelDataBytesAsync(answer.ExpectedImageFile); byte[] newBytes = await GetPixelDataBytesAsync(answer.ActualImageFile); if (ImageBytesAreTheSame(oldBytes, newBytes)) { answer.Status = TestStatus.Passed; } else { answer.Status = TestStatus.Failed; } } // Otherwise one had image and one had error, so fail else { answer.Status = TestStatus.Failed; } // See if the source chagned by checking // if the hashes have changed since the stored info if (storedInfo.HostConfigHash != hostConfigFile.Hash || storedInfo.CardHash != cardFile.Hash) { answer.Status = (answer.Status == TestStatus.Failed) ? TestStatus.FailedButSourceWasChanged : TestStatus.PassedButSourceWasChanged; } } catch { // Any exceptions being thrown get reported as "New", typically this results from file // not found of an expected file, which means it genuinely is new answer.Status = TestStatus.New; } return(answer); }