From 5e83321991c06b7eefa26acd395bfad522f2bc68 Mon Sep 17 00:00:00 2001 From: Keith Lazuka Date: Wed, 30 Sep 2009 16:35:51 -0400 Subject: [PATCH] images.gif: unit tests now use a PAM reference image to verify decoding --- basis/images/testing/gif/alpha.pam | Bin 0 -> 81 bytes .../testing/gif/astronaut_animation.pam | Bin 0 -> 7139 bytes basis/images/testing/gif/checkmark.pam | Bin 0 -> 3547 bytes basis/images/testing/gif/circle.pam | Bin 0 -> 467 bytes basis/images/testing/gif/monochrome.pam | Bin 0 -> 209 bytes basis/images/testing/gif/noise.pam | Bin 0 -> 65605 bytes basis/images/testing/testing.factor | 21 ++++- extra/images/gif/gif-tests.factor | 86 ++++++------------ 8 files changed, 47 insertions(+), 60 deletions(-) create mode 100644 basis/images/testing/gif/alpha.pam create mode 100644 basis/images/testing/gif/astronaut_animation.pam create mode 100644 basis/images/testing/gif/checkmark.pam create mode 100644 basis/images/testing/gif/circle.pam create mode 100644 basis/images/testing/gif/monochrome.pam create mode 100644 basis/images/testing/gif/noise.pam diff --git a/basis/images/testing/gif/alpha.pam b/basis/images/testing/gif/alpha.pam new file mode 100644 index 0000000000000000000000000000000000000000..cc72a3d33c2fa7cc6c788fb55ddf5b1f7be89b54 GIT binary patch literal 81 zcmWGA=kjp%boU5RFyadLbP4eQ(!P!nVU9iuMy94*F0KJUArr2U&;Xy1$N*P`Aa|#D ZN1p%>M=n=C7Y~;puKx@SKm-9GHUK3N6Y&55 literal 0 HcmV?d00001 diff --git a/basis/images/testing/gif/astronaut_animation.pam b/basis/images/testing/gif/astronaut_animation.pam new file mode 100644 index 0000000000000000000000000000000000000000..8f4e30d8d7f22978b26528257603843102bd23f0 GIT binary patch literal 7139 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 M(_dz?W4tkb0mlXFD*ylh literal 0 HcmV?d00001 diff --git a/basis/images/testing/gif/circle.pam b/basis/images/testing/gif/circle.pam new file mode 100644 index 0000000000000000000000000000000000000000..7c1cf6b7f55af546014935b6b51d340b6a58324c GIT binary patch literal 467 zcmZvXy$ZrG6ov1cr|2W7SR4c)lGs#Ii6#DY@}XQ^otzvTTwPs#pV$+)C6oj{?#VqT zH;G#aqwC7}VmcA0T6qJ}$n#O!Vpf(yY1jAW!XKRVozq2ItuN9#BZb~6qgp}9^7IQS zi8aVQeFJFd6XE?3=mq$h;2h8Aie8Q_y<-*?Z0MPVeca7D dR}H-aK#pf2$M1lK4-Xk$_(u-*$Cb0={vU&fpG*J% literal 0 HcmV?d00001 diff --git a/basis/images/testing/gif/monochrome.pam b/basis/images/testing/gif/monochrome.pam new file mode 100644 index 0000000000000000000000000000000000000000..6a31575f3e3fbbb1c872bb923832fc836c1080c2 GIT binary patch literal 209 zcmWGA=kjp%boU5RFyjjMbP4eQ(!P!nVU9iuMy94*F0KJUArr2U&;Xy1$N*P`Aa|#D sN1p%>M=n=C7Y~;puKzdy0|Ntw3`h)yVUjRDJ{qJJCXddBnFA9C0MqViqW}N^ literal 0 HcmV?d00001 diff --git a/basis/images/testing/gif/noise.pam b/basis/images/testing/gif/noise.pam new file mode 100644 index 0000000000000000000000000000000000000000..03407020cff25c2e3687f002137ff3c37f5043b5 GIT binary patch literal 65605 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 ] with-output-stream B{ } like ] unit-test ; + + + +: decode-test ( path -- ) + [ load-image 1quotation ] [ '[ _ pam-name load-image ] ] bi + unit-test ; diff --git a/extra/images/gif/gif-tests.factor b/extra/images/gif/gif-tests.factor index 1eeb420a04..cf43dffb40 100644 --- a/extra/images/gif/gif-tests.factor +++ b/extra/images/gif/gif-tests.factor @@ -1,50 +1,45 @@ ! Copyright (C) 2009 Keith Lazuka. ! See http://factorcode.org/license.txt for BSD license. -USING: accessors bitstreams compression.lzw images.gif io -io.encodings.binary io.files kernel math math.bitwise -math.parser namespaces prettyprint sequences tools.test images.viewer ; +USING: accessors bitstreams compression.lzw fry images.gif +images.loader images.viewer images.testing io io.encodings.binary io.files +io.pathnames kernel math math.bitwise math.parser namespaces +prettyprint quotations sequences tools.test ; QUALIFIED-WITH: bitstreams bs IN: images.gif.tests -: path>gif ( path -- loading-gif ) +"vocab:images/testing/gif/circle.gif" decode-test +"vocab:images/testing/gif/checkmark.gif" decode-test +"vocab:images/testing/gif/monochrome.gif" decode-test +"vocab:images/testing/gif/alpha.gif" decode-test +! "vocab:images/testing/gif/noise.gif" decode-test +"vocab:images/testing/gif/astronaut_animation.gif" decode-test + +: path>gif ( path -- gif ) binary [ input-stream get load-gif ] with-file-reader ; -: gif-example1 ( -- loading-gif ) - "resource:extra/images/testing/circle.gif" path>gif ; +: circle.gif ( -- gif ) + "vocab:images/testing/gif/circle.gif" path>gif ; -: gif-example2 ( -- loading-gif ) - "resource:extra/images/testing/checkmark.gif" path>gif ; +: checkmark.gif ( -- gif ) + "vocab:images/testing/gif/checkmark.gif" path>gif ; -: gif-example3 ( -- loading-gif ) - "resource:extra/images/testing/monochrome.gif" path>gif ; +: monochrome.gif ( -- gif ) + "vocab:images/testing/gif/monochrome.gif" path>gif ; -: gif-example4 ( -- loading-gif ) - "resource:extra/images/testing/noise.gif" path>gif ; - -: gif-example5 ( -- loading-gif ) - "resource:extra/images/testing/alpha.gif" path>gif ; - -: gif-example6 ( -- loading-gif ) - "resource:extra/images/testing/astronaut_animation.gif" path>gif ; - -: gif-all. ( -- ) - { - gif-example1 gif-example2 gif-example3 gif-example4 gif-example5 - gif-example6 - } - [ execute( -- gif ) gif>image image. ] each ; +: alpha.gif ( -- gif ) + "vocab:images/testing/gif/alpha.gif" path>gif ; : declared-num-colors ( gif -- n ) flags>> 3 bits 1 + 2^ ; : actual-num-colors ( gif -- n ) global-color-table>> length ; -[ 16 ] [ gif-example1 actual-num-colors ] unit-test -[ 16 ] [ gif-example1 declared-num-colors ] unit-test +[ 2 ] [ monochrome.gif actual-num-colors ] unit-test +[ 2 ] [ monochrome.gif declared-num-colors ] unit-test -[ 256 ] [ gif-example2 actual-num-colors ] unit-test -[ 256 ] [ gif-example2 declared-num-colors ] unit-test +[ 16 ] [ circle.gif actual-num-colors ] unit-test +[ 16 ] [ circle.gif declared-num-colors ] unit-test -[ 2 ] [ gif-example3 actual-num-colors ] unit-test -[ 2 ] [ gif-example3 declared-num-colors ] unit-test +[ 256 ] [ checkmark.gif actual-num-colors ] unit-test +[ 256 ] [ checkmark.gif declared-num-colors ] unit-test : >index-stream ( gif -- seq ) [ compressed-bytes>> ] @@ -60,36 +55,11 @@ IN: images.gif.tests 1 0 1 1 0 1 1 0 0 0 0 1 } -] [ gif-example3 >index-stream ] unit-test - -[ - B{ - 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 - 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 255 - 0 0 0 255 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 255 0 0 0 255 - 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 - 0 0 0 255 255 255 255 255 0 0 0 255 0 0 0 255 255 255 255 255 0 0 0 255 - 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 255 - } -] [ gif-example3 gif>image bitmap>> ] unit-test +] [ monochrome.gif >index-stream ] unit-test [ BV{ 0 1 1 0 } -] [ gif-example5 >index-stream ] unit-test - -[ - B{ - 255 000 000 255 000 000 000 000 - 000 000 000 000 255 000 000 255 - } -] [ gif-example5 gif>image bitmap>> ] unit-test - -[ 100 ] [ gif-example1 >index-stream length ] unit-test -[ 870 ] [ gif-example2 >index-stream length ] unit-test -[ 16384 ] [ gif-example4 >index-stream length ] unit-test - -! example6 is a GIF animation and the first frame contains 1768 pixels -[ 1768 ] [ gif-example6 >index-stream length ] unit-test +] [ alpha.gif >index-stream ] unit-test