diff --git a/source/uwp/AdaptiveCardTestApp/Pages/RunningTestsPage.xaml b/source/uwp/AdaptiveCardTestApp/Pages/RunningTestsPage.xaml index ca6b05bb2d..e9d7739285 100644 --- a/source/uwp/AdaptiveCardTestApp/Pages/RunningTestsPage.xaml +++ b/source/uwp/AdaptiveCardTestApp/Pages/RunningTestsPage.xaml @@ -12,24 +12,24 @@ - - - - - - - - - + + + + + + + + + TestCard(FileViewModel cardFile, FileVie Dictionary resourceResolvers = new Dictionary(); 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); + 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; diff --git a/source/uwp/UWPUnitTests/UnitTest.cs b/source/uwp/UWPUnitTests/UnitTest.cs index 4b01efbf41..113fea90e9 100644 --- a/source/uwp/UWPUnitTests/UnitTest.cs +++ b/source/uwp/UWPUnitTests/UnitTest.cs @@ -115,49 +115,71 @@ await dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => async public Task TestCard(FileViewModel hostConfigFile, FileViewModel cardFile) { - var renderResult = await UWPTestLibrary.RenderTestHelpers.RenderCard(cardFile, hostConfigFile, new Dictionary()); + uint reruns = 0; + TestResultViewModel result = null; + bool retryImage = true; + bool testPass = false; - if (renderResult.Tree != null) + while (retryImage) { - UWPTestLibrary.ImageWaiter imageWaiter = new ImageWaiter(renderResult.Tree); + var renderResult = await UWPTestLibrary.RenderTestHelpers.RenderCard(cardFile, hostConfigFile, new Dictionary()); - StackPanel stackPanel = new StackPanel(); - stackPanel.Children.Add(renderResult.Tree); + if (renderResult.Tree != null) + { + UWPTestLibrary.ImageWaiter imageWaiter = new ImageWaiter(renderResult.Tree); - Border border = new Border(); - border.Width = renderResult.CardWidth; - border.Child = stackPanel; - (Window.Current.Content as Frame).Content = border; + StackPanel stackPanel = new StackPanel(); + stackPanel.Children.Add(renderResult.Tree); - await imageWaiter.WaitOnAllImagesAsync(); + Border border = new Border(); + border.Width = renderResult.CardWidth; + border.Child = stackPanel; - } + ScrollViewer scrollViewer = new ScrollViewer(); + scrollViewer.Content = border; - StorageFile imageResultFile = null; - StorageFile jsonResultFile = null; - if (renderResult.Error == null) - { - imageResultFile = await _tempResultsFolder.CreateFileAsync("Result.png", CreationCollisionOption.GenerateUniqueName); - jsonResultFile = await _tempResultsFolder.CreateFileAsync("Result.json", CreationCollisionOption.GenerateUniqueName); + (Window.Current.Content as Frame).Content = scrollViewer; - await UWPTestLibrary.RenderTestHelpers.ResultsToFile(imageResultFile, jsonResultFile, renderResult.RoundTrippedJSON, renderResult.Tree); - } + await imageWaiter.WaitOnAllImagesAsync(); + + } + + StorageFile imageResultFile = null; + StorageFile jsonResultFile = null; + if (renderResult.Error == null) + { + imageResultFile = await _tempResultsFolder.CreateFileAsync("Result.png", CreationCollisionOption.GenerateUniqueName); + jsonResultFile = await _tempResultsFolder.CreateFileAsync("Result.json", CreationCollisionOption.GenerateUniqueName); + + await UWPTestLibrary.RenderTestHelpers.ResultsToFile(imageResultFile, jsonResultFile, renderResult.RoundTrippedJSON, renderResult.Tree); + } + + await Task.Delay(10); + + result = await TestResultViewModel.CreateAsync( + cardFile: cardFile, + hostConfigFile: hostConfigFile, + renderedTestResult: renderResult, + actualImageFile: imageResultFile, + actualJsonFile: jsonResultFile, + expectedFolder: _expectedFolder, + sourceHostConfigsFolder: _sourceHostConfigsFolder, + sourceCardsFolder: _sourceCardsFolder); - await Task.Delay(10); - - var result = await TestResultViewModel.CreateAsync( - cardFile: cardFile, - hostConfigFile: hostConfigFile, - renderedTestResult: renderResult, - actualImageFile: imageResultFile, - actualJsonFile: jsonResultFile, - expectedFolder: _expectedFolder, - sourceHostConfigsFolder: _sourceHostConfigsFolder, - sourceCardsFolder: _sourceCardsFolder); - - // We pass if it's not a new or changed card, and if either the image and json match or they match via error - bool testPass = !result.Status.NewCard && !result.Status.OriginalMatched && - ((result.Status.ImageMatched && result.Status.JsonRoundTripMatched) || result.Status.MatchedViaError); + testPass = result.Status.IsPassingStatus() && result.Status.OriginalMatched; + + if(!testPass) + { + // 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; + } + } if (!testPass) {