@@ -83,7 +83,7 @@ expect_doppelganger <- function(title, fig, path = NULL, ...,
8383    maybe_collect_case(case )
8484    maybe_print_svgs(case )
8585    msg  <-  paste0(" Figure not generated yet: "  , fig_name , " .svg"  )
86-     exp  <-  expectation_new (msg , case )
86+     exp  <-  new_exp (msg , case )
8787  }
8888
8989  signal_expectation(exp )
@@ -104,18 +104,68 @@ compare_figs <- function(case) {
104104  if  (equal ) {
105105    case  <-  success_case(case )
106106    maybe_collect_case(case )
107-     exp  <-  expectation_match(" TRUE"  , case )
108-   } else  {
109-     case  <-  mismatch_case(case )
110-     maybe_collect_case(case )
107+     return (match_exp(" TRUE"  , case ))
108+   }
109+ 
110+   case  <-  mismatch_case(case )
111+   maybe_collect_case(case )
112+   push_log(case )
113+ 
114+   cases_ver  <-  cases_freetype_version()
115+   system_ver  <-  system_freetype_version()
116+ 
117+   if  (is_null(cases_ver )) {
118+     msg  <-  glue(
119+       " Failed doppelganger but vdiffr can't check its FreeType version.
120+        Please revalidate cases with a more recent vdiffr"  
121+     )
122+     return (skipped_mismatch_exp(msg , case ))
123+   }
124+ 
125+   if  (cases_ver  <  system_ver ) {
126+     msg  <-  glue(
127+       " Failed doppelganger was generated with an older FreeType version.
128+        Please revalidate cases with vdiffr::validate_cases() or vdiffr::manage_cases()"  
129+     )
130+     return (skipped_mismatch_exp(msg , case ))
131+   }
132+ 
133+   if  (cases_ver  >  system_ver ) {
134+     msg  <-  glue(
135+       " Failed doppelganger was generated with a newer FreeType version.
136+        Please install FreeType {cases_ver} on your system"  
137+     )
138+     return (skipped_mismatch_exp(msg , case ))
139+   }
140+ 
141+   msg  <-  paste0(" Figures don't match: "  , case $ name , " .svg\n "  )
142+   mismatch_exp(msg , case )
143+ }
111144
112-     msg  <-  paste0(" Figures don't match: "  , case $ name , " .svg\n "  )
113-     exp  <-  expectation_mismatch(msg , case )
145+ #  Go back up one level by default as we should be in the `testthat`
146+ #  folder
147+ cases_freetype_version  <-  function (path  =  " .."  ) {
148+   deps  <-  readLines(file.path(path , " figs"  , " deps.txt"  ))
149+   ver  <-  purrr :: detect(deps , function (dep ) grepl(" ^FreeType:"  , dep ))
114150
115-     push_log(case )
151+   if  (is_null(ver )) {
152+     return (NULL )
116153  }
117154
118-   exp 
155+   #  Strip "FreeType: " prefix and minor version
156+   ver  <-  substr(ver , 11 , nchar(ver ))
157+   ver  <-  sub(" .[0-9]+$"  , " "  , ver )
158+ 
159+   as_version(ver )
160+ }
161+ system_freetype_version  <-  function () {
162+   ver  <-  sub(" .[0-9]+$"  , " "  , gdtools :: version_freetype())
163+   as_version(ver )
164+ }
165+ as_version  <-  function (ver ) {
166+   ver  <-  strsplit(ver , " ."  , fixed  =  TRUE )[[1 ]]
167+   ver  <-  as.integer(ver )
168+   structure(list (ver ), class  =  c(" package_version"  , " numeric_version"  ))
119169}
120170
121171#  Print only if we're not collecting. The testthat reporter prints
@@ -126,20 +176,22 @@ maybe_print_svgs <- function(case, pkg_path = NULL) {
126176  }
127177}
128178
129- expectation_new  <-  function (msg , case ) {
130-   exp  <-  testthat :: expectation(" skip "  , msg )
131-   classes  <-  c(class(exp ), " vdiffr_new "  )
179+ new_expectation  <-  function (msg , case ,  type ,  vdiffr_type ) {
180+   exp  <-  testthat :: expectation(type , msg )
181+   classes  <-  c(class(exp ), vdiffr_type )
132182  set_attrs(exp , class  =  classes , vdiffr_case  =  case )
133183}
134- expectation_mismatch  <-  function (msg , case ) {
135-   exp  <-  testthat :: expectation(" failure"  , msg )
136-   classes  <-  c(class(exp ), " vdiffr_mismatch"  )
137-   set_attrs(exp , class  =  classes , vdiffr_case  =  case )
184+ new_exp  <-  function (msg , case ) {
185+   new_expectation(msg , case , " skip"  , " vdiffr_new"  )
138186}
139- expectation_match  <-  function (msg , case ) {
140-   exp  <-  testthat :: expectation(" success"  , msg )
141-   classes  <-  c(class(exp ), " vdiffr_match"  )
142-   set_attrs(exp , class  =  classes , vdiffr_case  =  case )
187+ match_exp  <-  function (msg , case ) {
188+   new_expectation(msg , case , " success"  , " vdiffr_match"  )
189+ }
190+ mismatch_exp  <-  function (msg , case ) {
191+   new_expectation(msg , case , " failure"  , " vdiffr_mismatch"  )
192+ }
193+ skipped_mismatch_exp  <-  function (msg , case ) {
194+   new_expectation(msg , case , " skip"  , " vdiffr_mismatch"  )
143195}
144196
145197#  From testthat
0 commit comments