diff --git a/Makefile.am b/Makefile.am index 40eec91..666d516 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2,7 +2,11 @@ AUTOMAKE_OPTIONS = foreign ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = src data doc +if BUILD_TEST +SUBDIRS_TEST = test +endif + +SUBDIRS = src data doc $(SUBDIRS_TEST) CLEANFILES = $(PACKAGE).spec diff --git a/configure.ac b/configure.ac index 58972ec..8c8b0b1 100644 --- a/configure.ac +++ b/configure.ac @@ -4,7 +4,7 @@ AC_CONFIG_MACRO_DIR([m4]) AC_CANONICAL_BUILD AC_CANONICAL_HOST -AM_INIT_AUTOMAKE(1.6 dist-xz) +AM_INIT_AUTOMAKE(1.6 dist-xz -Wno-portability) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) AM_CONDITIONAL(SRC_IS_GIT, test -d $srcdir/.git) @@ -12,6 +12,7 @@ AM_CONDITIONAL(SRC_IS_GIT, test -d $srcdir/.git) AC_C_BIGENDIAN AC_PROG_CC AM_PROG_AS +AC_PROG_CXX AC_C_CONST @@ -388,6 +389,7 @@ else fi AM_CONDITIONAL(BUILD_ID3_LOADER, test "$id3_ok" = yes) +AM_CONDITIONAL(BUILD_TEST, false) EC_C_WARNINGS() EC_C_VISIBILITY(yes) @@ -407,6 +409,7 @@ data/Makefile data/fonts/Makefile data/images/Makefile doc/Makefile +test/Makefile README ]) AC_OUTPUT diff --git a/test/.gitignore b/test/.gitignore new file mode 100644 index 0000000..375cb30 --- /dev/null +++ b/test/.gitignore @@ -0,0 +1,4 @@ +/*.d +/images/empty.* +/images/nonex.* +/images/icon-64.*.* diff --git a/test/Makefile.am b/test/Makefile.am new file mode 100644 index 0000000..f804f39 --- /dev/null +++ b/test/Makefile.am @@ -0,0 +1,53 @@ +# Unit test makefile +# +noinst_PROGRAMS = $(GTESTS) + + GTEST_LIBS = -lgtest -lstdc++ + + GTESTS = test_file + GTESTS += test_load + GTESTS += test_save + + AM_CFLAGS = -Wall -Wextra -Werror -Wno-unused-parameter + AM_CFLAGS += $(CFLAGS_ASAN) + + AM_CXXFLAGS = $(AM_CFLAGS) + + AM_CPPFLAGS = -I $(top_builddir) -I $(top_srcdir)/src/lib + AM_CPPFLAGS += -D SRC_DIR='"$(top_srcdir)"' + AM_CPPFLAGS += -D BUILD_TEST=1 + +# Must have proper -lImlib2 on all progs + LIBS = -L$(top_builddir)/src/lib -lImlib2 + LIBS += $(GTEST_LIBS) + +vpath %.c $(top_srcdir)/src/lib + +test_file_SOURCES = test_file.cpp file.c +test_file_LDADD = $(LIBS) + +test_load_SOURCES = test_load.cpp +test_load_LDADD = $(LIBS) + +test_save_SOURCES = test_save.cpp +test_save_LDADD = $(LIBS) + + TESTS_RUN = $(addprefix run-, $(GTESTS)) + + TEST_ENV = IMLIB2_LOADER_PATH=$(top_builddir)/src/modules/loaders/.libs + + VG_PROG = valgrind --leak-check=full + +all-local: run + +.PHONY: run $(TESTS_RUN) +run: $(TESTS_RUN) +$(TESTS_RUN): run-%: % + $(TEST_ENV) ./$* $(RUN_OPTS) + + TESTS_RUN_VG = $(addprefix run-vg-, $(GTESTS)) + +.PHONY: run-vg $(TESTS_RUN_VG) +run-vg: $(TESTS_RUN_VG) +$(TESTS_RUN_VG): run-vg-%: % + $(TEST_ENV) $(VG_PROG) ./$* $(RUN_OPTS) diff --git a/test/images/icon-64.argb b/test/images/icon-64.argb new file mode 100644 index 0000000..6d87c8c --- /dev/null +++ b/test/images/icon-64.argb @@ -0,0 +1,2 @@ +ARGB 64 64 0 +^ntPbtPbsPasOaqN_~yRdb0Gi5Mk6Oh4Mf4Mb3K`3J`2I^0G[,DW(@R";L4G/Y1DjxyRd|Nc]s\r\s`vezmtyxrngz^r|ShrG]g:Q\.ER":I1@(xZhyxPcqsu|ȲƵ{dwwNcg:QX)AL4B*S-?xYkƬɹr|TihVe6N\-ET$[r;Xo7Tk3Qf/La*G\%BW '<%9"6 5 5 7!пħӸ˪czHal6Pm5Pm4Po4Qp4Rq6Tu9Xy=[|?_~BbEd{B`{Ca}Dc~EdFeGfHgHgHhHgHgGfGfFe~Ed}Cb{Bay?^w=\t;Zq8Wn4Sj1Of-Kb)G]$BX =S8M3E,B+@(=&:$8!5 6 Q.>вǣh{Oe~E_m6Pn4Pn3Po2Qp2Qq4Tu8Wx:Z|=]~?`Ab~Ab{?_|Aa~BbCcDdDeDeEeEeDeDeCdBc~Ab|@`{>_y<]v:[t8Xq5Un2Rk/Ng+Kc(G^$BZ!>U:M3J1G.D,B*?'<%9#6 9#׽έĝrVkOe{D]o6Qn4Po2Po1Pp1Qr3Tv6Vy8Y|;\~=_?aAc|=_|>`~?a@bAcBdBdBdBdBdAdAc@b~?a}=`{<^y:\w8Zt6Wr3Uo1Rk.Nh+Kd(G`%C\"@U:P6N4K2H0F-C+@)=&:#9#yγո˨_tVlOg|E]n7Qq5Rq3Rq2Rq1Rt4Uw6Wz9Z}:]=_>b@d@c~=`>a?b@cAdAdAdAdAd@d@c?b>a~=`|;_z9]x8[v5Xt3Vq1Sm.Pj,Mg)Ic&F\$@X#=V!;S9P6N4K2H/E-B*>';$_?Mìӳ›vjcz^vVoLeJeIfIgIhLjNmPpRrTtUvVwXyUvUvVwVwVxWxWxWxVxVxVwUwUvTuSsQrPpNnLlJjHgEd|Bav@\r>Xo(ֹ~{tttuvxz}~~}|zxvspnkh}dyav^s[pXl|SguMalCWa8LU+>E0µζҿϻ̸ʵDzįjxrN_U0Aһӵ{xvonnnoqrtuvwxyyzzwxxxxxwğşŠĠĠtqpomkhf~c{`x]uZrXoUl~QgxLbqEZg;P\/EM"6{`lվۿÝwmd~`{^zVrSpRpQpRpSrUtVvWwXyY{Z}Z[\][Y~Y~Y~Y~Y~[jStRsQqPoNmLkJhHf~Ec|DaEbxA]rN)9ؿջѸҸԺԻӻԾ׾սӺѹϵ̲ɯƬĨǩħ£r[nkAVI#4Ʈ׼ԷѱͫʦšġšƢŸġŢǤɦʩͫάϭЮѮѮүүүӰӰҰϭϬϫϫұӲӲӲҲҲѲ̨ɥǣƢĠžumTjh:QI"3ǰˬίȣ˜xrmkjdbbceghijklmnooppqolllmrttttmhgedb`^~\|ZyWvTsXwXwVtSpOlMjRmYrd1JE/ٿǧέȡuphhfc__abdfghijklmmnnookjkjjkjjhfedba_^[}Y{VxTuQrUuUuSsPoMkPmYuc|TkE.ΰ׼ӴϬˤƜ֓”ÕŗŘƙǙǚțțȜȜȜȝȝȜśśŚŚřęĘĘ×֕}~}{vsz{S->Ա|_lʩֹӳϪʢǛԑÓÓĕŕŖƖƗƘƘƙƙƙƘÖÕՕ””ĕ“~{x|Ċ̏͑ϕŒfsϷš̩˥ƙztqlhhhiegikmnpqrstuuvvwwwusrrqpsqlkigeb`][X}VzaxvzƁʊæɨ˧ϫʠŖ}{zsttvxvwy{}{zxuspmjgdanȁȁʆ͍їȘpƺʹֻҳܿڽٹصֲײسش״ٷںݽۿټ׹շӴѯϫ̧ʣǞƜѤݭݮݯ߲ӯȨ{Zhήغٺ׵ձԫѧѥҥӦФЦҩԬկײֲճֵ׷عڻ۽ܾܿ۽׸ַնطض׵ԱЭϫͨ˥ɢǞśØÔџۨܫݮ߳ұɮ~`mϴƟȞͣəŏzyyxtvy|~ϨձŽŽ|zwurolifh{·яԙ٦޵̨̰Ȣ˞Ɠ{qjhiiddgilptvtvxz||y||zwtjfda^\YV|SzWu΁ҍלܭ̫bqЯ”ŔȔÈ{qihhhiegkoswz}}|~~{xnhea^[X~U|T|ZӉחܨ޾ǫ{[iƥؾ×ɕŊ~skjiikmkotx{†È‹ÌÍÍÎÍ͌Š‰}vnida^[W~Ze҇הܣټ|ѵʣŠƌ€umkjkmqutx|…ĈƋǎɑɒǑƑƓǓǔǔǔǓƒɖ̛˙ɕŏˆ‡snid`]Z_uՑ۠дqL\ǣշʼnĂwollmouz}|ÆŊǎɑ˔͗ΙΚ͛˙˚˚̚̚˚Ϣݹٴױ֮իѢɓxsmhc__ḋٜެּնȞ~Ńyqmmnsx}ŃņćƋȏ˓̗ΙϜОѡҢӤңϡϡϡРӦƒ}xrleaenؙިҷ|Zi™ӱ~z{snnpv{āLJʍ̐ɑ̕ΙϛџҢӤԧթ֪׫׬ժԩ֪ܸɘ|vohfkÂݥsÕ~vwtoorx~ƅɋ̐ЗϘΚОҡԥը֫حٯڰ۲۲ݴ޶ܴ޹˛zslmr՚lzؿfdipoorx~Ãʼnȏ̕ӟգ֦ը֫خڰܴܲ޶Ș}vrrcsѱT{V~[bhmu|„Ƌ˓ΙҠةۮݱݴ޶߹ǗÐywyԞzΫU{[`cju}ÆȎ͖НӤثݲ޶߹شʜƔ{ĉҲW~_dhpyǎ͘ѠըدܵѨ̠ǘŽ۫׹[bhoxŌ˗РԪر۷߽ڸӬϣəƑ‰ќħ̧ddmvċʖС֬۵޽ڹհХ˛Ȓˆʓؼteo|ȓϟի۶ܼײѦ͛ŎȐip}Ë̙Ӧڳݿֱѣɔɒطػ{s~ʙҨ۸۹Ө˘͙ݵàЭ}ȘЦٶܹԨ˙ԡ۬ΨմƔ͡կܽرѢ͚ե̥ѭƕȗ͡ӫٵݾڷխҤ̢͞ϹطԮѨЦѨӫӪҩӬԯЪǟƤйֽӺ \ No newline at end of file diff --git a/test/images/icon-64.bmp b/test/images/icon-64.bmp new file mode 100644 index 0000000..916cf94 Binary files /dev/null and b/test/images/icon-64.bmp differ diff --git a/test/images/icon-64.ff b/test/images/icon-64.ff new file mode 100644 index 0000000..d0e3514 Binary files /dev/null and b/test/images/icon-64.ff differ diff --git a/test/images/icon-64.ff.bz2 b/test/images/icon-64.ff.bz2 new file mode 100644 index 0000000..69d8668 Binary files /dev/null and b/test/images/icon-64.ff.bz2 differ diff --git a/test/images/icon-64.ff.gz b/test/images/icon-64.ff.gz new file mode 100644 index 0000000..d66bbf3 Binary files /dev/null and b/test/images/icon-64.ff.gz differ diff --git a/test/images/icon-64.gif b/test/images/icon-64.gif new file mode 100644 index 0000000..40448c3 Binary files /dev/null and b/test/images/icon-64.gif differ diff --git a/test/images/icon-64.ico b/test/images/icon-64.ico new file mode 100644 index 0000000..91a30e3 Binary files /dev/null and b/test/images/icon-64.ico differ diff --git a/test/images/icon-64.ilbm b/test/images/icon-64.ilbm new file mode 100644 index 0000000..30a1160 Binary files /dev/null and b/test/images/icon-64.ilbm differ diff --git a/test/images/icon-64.jpeg b/test/images/icon-64.jpeg new file mode 100644 index 0000000..5bcfc3e Binary files /dev/null and b/test/images/icon-64.jpeg differ diff --git a/test/images/icon-64.jpg b/test/images/icon-64.jpg new file mode 100644 index 0000000..5bcfc3e Binary files /dev/null and b/test/images/icon-64.jpg differ diff --git a/test/images/icon-64.jpg.mp3 b/test/images/icon-64.jpg.mp3 new file mode 100755 index 0000000..537cee1 Binary files /dev/null and b/test/images/icon-64.jpg.mp3 differ diff --git a/test/images/icon-64.png b/test/images/icon-64.png new file mode 100644 index 0000000..82e60b7 Binary files /dev/null and b/test/images/icon-64.png differ diff --git a/test/images/icon-64.ppm b/test/images/icon-64.ppm new file mode 100644 index 0000000..e316685 --- /dev/null +++ b/test/images/icon-64.ppm @@ -0,0 +1,4 @@ +P6 +64 64 +255 +Тn^bPtbPtaPsaOs_Nq܋~dRyG0bM5iO6kM4hM4fK3bJ3`I2`G0^D,[@(W;"R4L/GD1YxjdRycN|s]r\s\v`zemtyxrnzgr^hS|]GrQ:gE.\:"R1I(@hZxycPxqsu|Ͼư{wdcNwQ:gA)X4L*B?-SxkYɡriT|SlN6eE-\<$T4L-F'@! 7 5 5 5!7ŽĹԶɫ~~hv_kR_Fy^EwcJ|gOkSmUkSmVpXqZs[t\t]u^u^v^u^u]u]t\s\r[qYoWmUjRgO}cJy^EuY@pS9jL2cD*\<#T4L,E'? 6 5 5 5 5/D{jǾֽϮãot\^E{VuX;rT7oQ3kL/fG*aB%\< W7Q1K*C'>%<"9 6 5 5!7ǿг¸Ӷ˨zcaHP6lP5mP4mQ4oR4pT6qX9u[=y_?|bB~dE`B{aC{cD}dE~eFfGgHgHhHgHgHfGfGeFdE~bC}aB{^?y\=wZ;tW8qS4nO1jK-fG)bB$]= X8S3M,E+B(@&=$:!8 5 6>.QٽбǢ{heO_E~P6mP4nP3nQ2oQ2pT4qW8uZ:x]=|`?~bAbA~_?{aA|bB~cCdDeDeDeEeEeDeDdCcBbA~`@|_>{]!Z:U3M1J.G,D*B'?%<#9 6#9訛ǽ׺έĆrkVeO]D{Q6oP4nP2oP1oQ1pT3rV6vY8y\;|_=~a?cA_=|`>|a?~b@cAdBdBdBdBdBdAcAb@a?~`=}^<{\:yZ8wW6tU3rR1oN.kK+hG(dC%`@"\:U6P4N2K0H-F+C)@&=#:#9yپøն˖t_lVgO]E|Q7nR5qR3qR2qR1qU4tW6wZ9z]:}_=b>d@c@`=~a>b?c@dAdAdAdAdAd@c@b?a>`=~_;|]9z[8xX5vV3tS1qP.mM,jI)gF&c@$\=#X;!V9S6P4N2K/H-E*B'>$;M?_ӫŠvjzcv^oVeLeJfIgIhIjLmNpPrRtTvUwVyXvUvUwVwVxVxWxWxWxVxVwVwUvUuTsSrQpPnNlLjJgHdEaB|\@vX>rVŹ֨~{tttuvxz}~~}|zxvspnk}hydvas^p[lXgS|aMuWClL8a>+U0EȿŻ¸̿ʼǹĶxj_NrA0UŻõӭ¥{xvonnnoqrtuvwxyyzzwxxxxxwĴŴŴĴĬtqpomkh~f{cx`u]rZoXlUgQ~bLxZEqP;gE/\6"Ml`{Ⱦ˿ۭâwm~d{`z^rVpSpRpQpRrStUvVwWyX{Y}ZZ[\][~Y~Y~Y~Y~Y[jtSsRqQoPmNkLhJfHcE~aD|bE]AxX(V9)NʿȻĸŸǺǻǻɾ˾ɽȺŹµ̽ɺƶĸǵIJ­rn[VAk4#IȼķԿѺͶʲŲijŴƱ²ĴŶǸɻʽ;οϿ¯°°°ҿϿϾϾ±IJIJIJòòòѻ̸ɶǵƳı®umjTQ:h3"Iߺ˽δȫ¢xrmkjdbbceghijklmnooppqolllmrttttmhgedb`~^|\yZvWsTwXwXtVpSlOjMmRrYJ1d/E˿ٶǼγȪuphhfc__abdfghijklmmnnookjkjjkjjhfedba_^}[{YxVuTrQuUuUsSoPkMmPuY|ckT.Eٽȼ´Ӽ϶˰ƬꦮïŰűƱDzdzȳȳȴȴȴȴȳȱűűűŰŰİįįîí¬}~}{vsz{>-SԬl_|ڸǹ³ӻϵʰǫè¬íîįůůưưưƱƱƱƱƮîîî­­®Ĭª~{x|ī̭ͯϪŞsf·ڲź̷ˮƦztqlhhhiegikmnpqrstuuvvwwwusrrqpsqlkigeb`][}XzVaxĚvœzáƨʦŸݸɸ˼ϴʭť}{zsttvxvwy{}{zxuspmjgdanȢȦʫͲѯȩpǻ³Ϳ˽ɹƵIJŲƳƴƴɷ˺νο˼ɹǷŴѾϻ̷ʴDzƺĭĮůDzɷӷhZ{ٽȺɺƵ±տԼѻѼҽӻмоïŲIJijƵȷɹ˻̽;ο̽ɸǷƶȷȶƵıоϼͺ˷ɴDzůìø«Ůȳ̺һm`~ٲƳȸͱɪţzyyxtvy|~ıժ©©©|zwurolifh{êίѶԾȵ޺̠۵Ȩˬƣ{qjhiiddgilptvtvxz|娋|y||zwtjfda^\Y|VzSWuƧίҹĭͼ໫qbھЪ¬ŭȥÝ{qihhhiegkoswz}}|~~{xnhea^[~X|U|TZέӷ¨ͺξ޹i[{ɾجåɧŞ~skjiikmkotx{¨æ©êêëêê駧¥}vnida^[~WZeҴ׿˵˼ي|ڶʦ©ơšumkjkmqutx|¨īƭǮɯɮǮƮƯǯǯǯǮǮƱɵ̴˰ɬŧ¦žsnid`]Z_uսȰ´\Lqķէţěwollmouz}|éŬǮɰ˳ʹεεʹ˴˴˵̵̴˺̹ȴűîջѯɦxsmhc__d̺Ŭн㐁Ǽöղȣ~ŝyqmmnsx}¥ŧŧĪƭȰ˲̵ηϹкѼҽӼҺϺϺϺᾦӮƝ}xrleaen¨θŷiZ|Ӥ~z{snnpv{ĩǭʯ̯ɱ̴ηϹѼҾӿª«¬ª˸ܳɡ|vohfk˵sꤑß~vwtoorx~§Ƭɯ̴еϵθлҾ«ĭůưDzDzɴ˶ɴ͹޵˥zslmrȱzlʿءfdipoorx~éŭȲ̺ӾտëĮưDzɴ˶͹ϼѾҿⲘȩ}vrrƭмscѠ{T~V[bhmu|«ư˵κ©Ůȱɴ˶͹ϻѾᲗǬæywyιzΞ{U[`cju}íȲ͸нëɲ˶ιмѿȴصʰƨ{̶죔Ҡ~W_dhpydzͺůɵϻѾ辨ѹ̲Ǫ¦ë챣ƹת[bhoxŲ˺Ʊ˷Ͻ˸ӻϳɭƧ¢ѿ뵧Ġ۹̇ddmvIJʻ¬ɵϽ˹İսе˯Ȧ¯ϻ诡ɼؓteo|ȸ«ʶμƲ׽Ѷͫŭ̷㢒᫒ip}ô̾ȳпűֻѰɮʵǷؠɻؙ{s~ʿ˸̹ۿӳ˴ɴɵݰò迭Л}Ƚɶ̹ܿԳ˻ìۺάŴէƹïνƱػѵͽո̩ѯƱȹȵϾɷ­ռҶͷ̪ùɷ®ԾѼоӾ¯ԽвǴùȽź \ No newline at end of file diff --git a/test/images/icon-64.tga b/test/images/icon-64.tga new file mode 100644 index 0000000..751f955 Binary files /dev/null and b/test/images/icon-64.tga differ diff --git a/test/images/icon-64.tiff b/test/images/icon-64.tiff new file mode 100644 index 0000000..4cf8b25 Binary files /dev/null and b/test/images/icon-64.tiff differ diff --git a/test/images/icon-64.webp b/test/images/icon-64.webp new file mode 100644 index 0000000..ee988d8 Binary files /dev/null and b/test/images/icon-64.webp differ diff --git a/test/images/icon-64.xbm b/test/images/icon-64.xbm new file mode 100644 index 0000000..15c9652 --- /dev/null +++ b/test/images/icon-64.xbm @@ -0,0 +1,46 @@ +#define icon-64_width 64 +#define icon-64_height 64 +static char icon-64_bits[] = { + 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, + 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x5F, 0xFF, 0x0F, 0x00, 0x00, + 0x00, 0x00, 0xB8, 0x05, 0xE1, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, + 0x00, 0xFE, 0x00, 0x00, 0x00, 0x80, 0x05, 0x00, 0x00, 0xF8, 0x03, 0x00, + 0x00, 0xA0, 0x0A, 0x00, 0x00, 0xF8, 0x0F, 0x00, 0x00, 0x30, 0x01, 0x00, + 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x48, 0x94, 0x00, 0x00, 0xF8, 0x3F, 0x00, + 0x00, 0x0C, 0x02, 0x45, 0x94, 0xA0, 0x7F, 0x00, 0x00, 0x40, 0x58, 0x54, + 0x81, 0xD5, 0xFF, 0x00, 0x00, 0x51, 0xA5, 0xAB, 0x5A, 0xFA, 0xFF, 0x00, + 0x80, 0x80, 0x7E, 0x2C, 0xAF, 0xFB, 0xFF, 0x01, 0x00, 0xA8, 0xC5, 0xF7, + 0xE9, 0xEE, 0xFF, 0x03, 0x40, 0xE1, 0xFF, 0xFE, 0x7B, 0xFF, 0xFF, 0x07, + 0x20, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0xD4, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x0F, 0x10, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, + 0x10, 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xFC, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, + 0x04, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x04, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x7F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, + 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x40, 0xF6, 0x9F, 0x99, + 0x97, 0xBB, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xFF, + 0x00, 0xE6, 0x3D, 0x5A, 0x2B, 0xE8, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0xFF, + 0xBF, 0xFD, 0xFF, 0xFF, 0xA0, 0xFD, 0xEF, 0xDE, 0x6B, 0xFA, 0xFF, 0xFF, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF7, 0x00, 0x40, 0x44, 0x04, + 0x04, 0x42, 0xD8, 0xFE, 0x10, 0xF7, 0xFF, 0xAB, 0xAF, 0xED, 0xFE, 0xFF, + 0xC8, 0xEC, 0xDE, 0xFE, 0xFD, 0xFF, 0xFF, 0xFF, 0x80, 0x1A, 0x01, 0x22, + 0x00, 0x44, 0x58, 0xEB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, + 0x08, 0xD8, 0xC4, 0xC2, 0x45, 0x64, 0xB5, 0xD1, 0x50, 0x5F, 0x7F, 0x7D, + 0xFD, 0xDF, 0xFF, 0x6F, 0x90, 0xFA, 0xE7, 0x16, 0xA6, 0xDD, 0xFF, 0x56, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x40, 0xA0, 0xFC, 0xDF, 0x0E, 0x58, 0xFB, 0x7F, 0x26, + 0xA0, 0xFF, 0xF5, 0x05, 0x6E, 0xDD, 0xBF, 0x23, 0x40, 0x5A, 0x5F, 0xBD, + 0xD5, 0xBB, 0xFF, 0x20, 0x40, 0xA5, 0x6F, 0x5E, 0x96, 0xEE, 0x3F, 0x11, + 0xA0, 0xFE, 0x95, 0xA1, 0x69, 0xA9, 0x57, 0x10, 0x50, 0xBA, 0x5E, 0x16, + 0x40, 0xB0, 0x7D, 0x00, 0x80, 0xDD, 0xA9, 0x52, 0x06, 0xE8, 0x1F, 0x08, + 0x00, 0x7B, 0x4A, 0x13, 0x01, 0x60, 0x1F, 0x04, 0x80, 0xD5, 0x27, 0x84, + 0x00, 0xC0, 0x16, 0x00, 0x00, 0x5F, 0xB9, 0x02, 0x00, 0x90, 0x06, 0x02, + 0x00, 0xFE, 0x06, 0x00, 0x00, 0x60, 0x07, 0x01, 0x00, 0xFE, 0x5D, 0x00, + 0x00, 0xC0, 0x05, 0x00, 0x00, 0x5C, 0x01, 0x01, 0x00, 0x50, 0x02, 0x00, + 0x00, 0xF0, 0x16, 0x00, 0x00, 0xA0, 0x43, 0x00, 0x00, 0xA0, 0x4B, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x0A, 0x00, 0x00, 0xA0, 0x00, 0x00, + 0x00, 0x00, 0x17, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, + 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x84, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; diff --git a/test/images/icon-64.xpm b/test/images/icon-64.xpm new file mode 100644 index 0000000..bf80b7b --- /dev/null +++ b/test/images/icon-64.xpm @@ -0,0 +1,296 @@ +/* XPM */ +static char *icon_64[] = { +/* columns rows colors chars-per-pixel */ +"64 64 226 2 ", +" c #1F0D35", +". c #200E36", +"X c #230F3B", +"o c #25113C", +"O c #28163E", +"+ c #2C1544", +"@ c #2E1C44", +"# c #2A1342", +"$ c #331B4C", +"% c #301A47", +"& c #381D52", +"* c #36234B", +"= c #3B2354", +"- c #3E2855", +"; c #432B5B", +": c #41255B", +"> c #47335C", +", c #4A2C65", +"< c #492A65", +"1 c #4C3363", +"2 c #4C3467", +"3 c #51356D", +"4 c #533B6B", +"5 c #513A67", +"6 c #543472", +"7 c #563971", +"8 c #593C74", +"9 c #5D3C7B", +"0 c #583576", +"q c #502E6D", +"w c #603E7E", +"e c #57446C", +"r c #5C4473", +"t c #5E437A", +"y c #5E4D71", +"u c #5F516F", +"i c #614D75", +"p c #62437D", +"a c #654B7C", +"s c #684E7F", +"d c #65517A", +"f c #6A547D", +"g c #6A5B7C", +"h c #635375", +"j c #6C607D", +"k c #623F80", +"l c #644381", +"z c #664A82", +"x c #694C83", +"c c #6D4E89", +"v c #6C5383", +"b c #6E5B82", +"n c #6D538B", +"m c #705786", +"M c #725C86", +"N c #71528E", +"B c #745C8B", +"V c #755592", +"C c #785694", +"Z c #755C93", +"A c #795B94", +"S c #7C559D", +"D c #7E5A9C", +"F c #76628A", +"G c #7A648D", +"H c #7C6A8D", +"J c #746684", +"K c #7B6394", +"L c #7E6A92", +"P c #7C6499", +"I c #7F7091", +"U c #7F57A3", +"Y c #805C9E", +"T c #806D93", +"R c #846C9C", +"E c #82659D", +"W c #847395", +"Q c #86739B", +"! c #88759A", +"~ c #8C7C9B", +"^ c #857894", +"/ c #825CA3", +"( c #855FA9", +") c #8563A4", +"_ c #8866A7", +"` c #866BA2", +"' c #896CA4", +"] c #8965AA", +"[ c #8D6AAB", +"{ c #8661A9", +"} c #906EAE", +"| c #8B74A4", +" . c #8E7AA6", +".. c #8C72A7", +"X. c #9273AD", +"o. c #947BAC", +"O. c #927CA7", +"+. c #8F69B2", +"@. c #8C66B0", +"#. c #916BB5", +"$. c #946EB9", +"%. c #9574B3", +"&. c #9876B7", +"*. c #997BB5", +"=. c #9671BA", +"-. c #9975BC", +";. c #9D7CBB", +":. c #977AB0", +">. c #A07FBF", +",. c #9E7BC1", +"<. c #9C75C4", +"1. c #A27DC4", +"2. c #92899E", +"3. c #8F839C", +"4. c #9383A3", +"5. c #9582AB", +"6. c #9981AF", +"7. c #9B8CAB", +"8. c #978BA4", +"9. c #9E90AC", +"0. c #9D96A7", +"q. c #9C82B3", +"w. c #9E8CB3", +"e. c #9E82B9", +"r. c #9885B3", +"t. c #9F90B0", +"y. c #A095AE", +"u. c #A39AAD", +"i. c #A18DB6", +"p. c #A183BC", +"a. c #A58BBC", +"s. c #A58BBB", +"d. c #A293B3", +"f. c #A99DB5", +"g. c #A593BC", +"h. c #A994BD", +"j. c #AB9CBB", +"k. c #A599B2", +"l. c #ADA1BC", +"z. c #ACA5B4", +"x. c #B2A8BD", +"c. c #A585C2", +"v. c #A78AC2", +"b. c #AA8CC3", +"n. c #AC8DCA", +"m. c #A784CA", +"M. c #AD94C3", +"N. c #AD9BC3", +"B. c #AE92CA", +"V. c #AF98C8", +"C. c #B19BC5", +"Z. c #B195CB", +"A. c #B49ACB", +"S. c #B298C8", +"D. c #AE8BD2", +"F. c #B495D4", +"G. c #B99ED2", +"H. c #B89BD5", +"J. c #AEA0C3", +"K. c #B3A3C4", +"L. c #B6ACC3", +"P. c #B8ADC4", +"I. c #B5A4C9", +"U. c #B9A3CD", +"Y. c #B6A9C9", +"T. c #BBABCC", +"R. c #BCB4C4", +"E. c #BDB2CC", +"W. c #BFBAC6", +"Q. c #BCA4D2", +"!. c #BEAAD1", +"~. c #BEA3DA", +"^. c #BEB1D0", +"/. c #C0B5CE", +"(. c #C4BBCD", +"). c #C1ACD4", +"_. c #C4ACDB", +"`. c #C0A5DD", +"'. c #C4B3D4", +"]. c #C5BBD3", +"[. c #C8BCD5", +"{. c #C6B2DA", +"}. c #C9B5DB", +"|. c #CCBCDB", +" X c #C8B7D7", +".X c #D0BFDD", +"XX c #CAB4E1", +"oX c #CEBAE1", +"OX c #D1BEE3", +"+X c #C6ADE0", +"@X c #C7C1CD", +"#X c #C8C2CF", +"$X c #CBC2D5", +"%X c #CFC8D6", +"&X c #CDC3DA", +"*X c #C7C0D0", +"=X c #D1C5DD", +"-X c #D3CBDC", +";X c #D0CAD7", +":X c #DAD6DE", +">X c #D6D2DB", +",X c #D4C3E3", +"X~ h , 2 3 2 2 1 > 1 > ; ; = $ + > H z.sXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdX", +"dXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXeX~ d a F B B K K L | ~ ! I H H M f r 5 ; = % o g x.dXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdX", +"dXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXeX^ h W Q | .5.t.l.R.*X;X>X>X-X%X@XR.z.0.~ F i 5 ; $ O ; z.dXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdX", +"dXdXdXdXdXdXdXdXdXdXdXdXdXdXdXsX^ g 5.5.7.i.j.P.&X5XrXrXyXrXyXrXrXyXrXrXrXeX:X(.u.T f 5 ; $ X ; W.dXdXdXdXdXdXdXdXdXdXdXdXdXdXdX", +"dXdXdXdXdXdXdXdXdXdXdXdXdXdXu.g 7.t.d.N.C.E.-XrXyXyXyXyXyXrXrXeXrXrXyXrXrXrXrXrX8X@X9.G i > * + . h sXdXdXdXdXdXdXdXdXdXdXdXdXdX", +"dXdXdXdXdXdXdXdXdXdXdXdXsXH ^ f.f.N.Y.P.].5XyXyXeXeX5X5X5X5X5X5X:X5X:X8X:XeXrXrXtXeX#Xu.T h 1 = O o O #XdXdXdXdXdXdXdXdXdXdXdXdX", +"dXdXdXdXdXdXdXdXdXdXdX:Xg z.l.K.Y.T.T.'.-X5X8X:X>X;X;X;X&X%X%X%X;X;X;X;X>X;X>X:X5XeX:XR.9.T h 5 ; O O . 0.dXdXdXdXdXdXdXdXdXdXdX", +"dXdXdXdXdXdXdXdXdXdX:Xb L.L.Y.Y.T.T.Y./.].$X$X].[.(.(.(.(.(.(.(.(.(.(.(.(.(.(.(.#X#X%XW.f.~ G 8 > & + o . j dXdXdXdXdXdXdXdXdXdX", +"dXdXdXdXdXdXdXdXdX:XH W.W.Y.T.T.Y.K.K.L.P.T.P.P.P.P.P.P.P.P.x.P.x.R.P.R.P.P.L.P.R.P.R.x.k.2.T h 4 ; $ o . . J dXdXdXdXdXdXdXdXdX", +"dXdXdXdXdXdXdXdX:XJ (.].T.E.T.Y.N.f.h.j.j.l.f.f.f.j.j.j.l.l.l.l.j.l.l.j.l.l.f.f.f.f.u.u.9.~ T f e > = + o . . j dXdXdXdXdXdXdXdX", +"dXdXdXdXdXdXdX4Xb (.*X^.E.T.Y.J.i.w.w.w.i.w.7.w.9.d.9.d.d.9.k.k.d.y.d.d.d.d.9.9.8.8.8.4.~ W H f r 5 : $ # X . . 0.dXdXdXdXdXdXdX", +"dXdXdXdXdXdXsXJ W.$X].^.E.Y.J.i.6.o.5.o.O.O.O.~ O.O.8.O.O.~ O.~ 3.4.3.3.4.4.2.~ O.~ W W T T J f r 5 : $ + X . . O x.dXdXdXdXdXdX", +"dXdXdXdXdXdXI z.&X].$X^.Y.J.g.5. .! Q Q ! ~ ~ W ! W W ~ T T ~ ^ ! ! ! ! ! ! W W W W T T F j f i e > ; $ % o . . . O eXdXdXdXdXdX", +"dXdXdXdXfX#X^ -X].].].T.J.g.r.` T E T E T Y F F G T T T T T T T T T T T T T T T T T M T f f i r 5 > : $ + o . . e dXdXdXdXdX", +"dXdXdXdXfXb &X$X].$X^.J.N.i.| P Y C s f f f M M M M F F T m T T T G G G G G M B M M j f f a r 4 5 ; : $ @ O . . z.dXdXdXdX", +"dXdXdXdXy.l.&X].&X].Y.J.r.r.P P n t t y z b n b f Y f Y j Y T m G m G m M m M m m m f s i w 8 4 > ; : % # # . . . + pXdXdXdX", +"dXdXdXyXL 4X$X$X].^.J.g.r.P Z t 7 e t t z z z z s s f f f f m m m m m m m m m v s a a i w 8 4 5 , ; = $ # # . . . 3.dXdXdX", +"dXdXdXf.Y.-X].&X].Y.g.r.r.Z 7 3 7 7 7 t t z z z s s s s s s s c x m s m v s s s a w i w e e 4 1 < : = $ $ # X . . . . @ pXdXdX", +"dXdXsXI 5X&X-X].^.J.w.r.P 2 2 7 3 7 7 7 t e z z w s w s s s s c x x x x x x l a i w w 8 0 4 q 1 ; : : $ $ # X X . . . z.dXdX", +"fXfX*XY.:X&X&X^.Y.g.r.P z 3 3 3 6 6 6 9 7 k k z w w p s s x p s l x x l l l l a w w 8 8 4 q q , < : & & & # # # o X . . . ; dXdX", +"dXfX7.-X-X&X&X^.Y.g.P n k 3 3 3 3 6 6 6 7 k k k s w w p w k p a l l l l l l w w w 8 8 8 0 q q , < : : : & $ $ # O O O . . . >XdX", +"dXeXg.7X&X-X].^.J.I b z t 3 3 3 3 3 6 0 6 9 7 k k w w w w k p w l l l l w l w w 9 8 8 0 0 q q < < : : & & $ $ $ % + O O . . ^ dX", +"dX;X^.7X&X-X^.Y.r.Z n z z 3 3 3 6 6 6 6 9 t k k k k w w k k w w l l l l l w w w w 9 9 0 0 q q q < < : & & & $ $ $ % @ O O O > dX", +"dXL.&X-X&X&X^.N.P P P P n z z z k z n n N N V V V C V V Y V V Y Y Y C C C C C C Y s Y s c w w s p r 8 4 4 5 2 1 ; ; ; = * @ O sX", +"dXf.4X=X1X-X].N.g.w.5.5. .Q Q | P r.r.P o.o.6.6.q.q.q.6.6.:.6.6.:.O.:.:.:.9.:.O.:.O.~ O.O.:.X.! R R T H K F M M v f i e > - @ R.", +"rX^.7X7X0X7XX.x.U.C.C.C.h.| | ' ' R R R T K Z B M M m f i r 5 > * j ", +"%X].4X&X&XN.g.r.P P P P P V N n Z Z Z Z V S S S Y Y Y Y Y Y Y Y Y Y Y Y :.*.*.s.q.q.q._ V N N c c x x a p p p t 7 4 2 2 > - $ u ", +">X&XX;X1X;X1X1X:X:X:XX-X%X.X[.[.[.[./././.P.P.Y.L.K.l.g.8.W b e * ", +"P.-X4X&X&X&X^.^.Y.Y.Y.J.V.J.K.K.Y.Y.Y.Y.T.T.^.!.)./.).).)./.).).!.!.!.!.'. X).).'.'.'.).U.L.I.C.l.j.h.d.d.i.i.i.w.6.4.| R d 5 * ", +"P.&X,XY.T.I.N.g.r.o...` ' ' E E Y ) _ _ _ [ [ [ [ } } } } } X.X.X.[ | } [ X.X.X.X.X.[ [ _ E _ Y E Y Y m Y x Y Y s s c c m m > % ", +"-X&X&XY.!.J.M.p.*.%..._ _ ) ) Y Y Y ) _ _ _ _ [ [ [ } } } } } X.X.[ [ [ [ [ [ [ [ _ _ _ _ _ ) Y Y Y Y Y m Y m Y Y c c N C Y m @ ", +"-X-X&XE.^.^.T.Y.V.N.M.g.a.g.a.s.h.s.h.h.h.S.S.S.l.S.S.S.S.A.S.C.S.C.C.C.C.C.C.C.C.C.S.C.M.s.M.s.s.s.:.:.:.:.:.:.[ O.' *.e.O. .; ", +"].>X-X-X7XqX7X7X7X6X6X5X9X0XqXtXtXuXuXiXiXiXiXpXpXpXsXiXsXiXiXiXtXyXiXyXyXiXiXtXtXtXtXtXtXtXtXtX0XeX8X5X:X1X>X.>.*.*.:.O.&.>.v.n.B.B.M.w.w.J ", +"rX^.&XJ.Y.Y.V.b.e.*.X.%.} ] ] @.} _ [ +.} } } } } %.%.%.:.:.%.%.:.%.:.:.X.X.X.X.} %.} [ [ [ _ _ _ E Y Y Y Y ( >.<.<.m.n.v.w.4.8.", +"dXJ.-XY.Q.!.J.B.b.p.e.-.*.%.%.%.&.&.&.&.*.*.*.;.*.>.;.>.>.>.>.>.>.>.>.>.>.*.*.*.*.s.>.:.:.:.X.X.X.[ [ _ ) ) X.>.m.m.n.F.V.f.I W.", +"dXE.X1X1X1X4X4X4X8X4X4X5X4X4X:X.>.>.>.>.>.>.c.>.s.).1X1X1X Xb.s.b.M.s.>.s.s.s.>.>.*.&.:.X.X.} [ [ _ +.<.D.D.F.~.XXY.t.3.dX", +"dXdXT.&XY.v.A.B.c.;.$.#.#.#.+.@.] @.} +.%.&.*.X.%.&.;.>.>.;XtX6Xs.>.>.>.>.*.*.>.;.*.*.*.[ _ _ _ / / U S S U <.1.D.H.+XXXY.J :XdX", +"dXdX;X&XT.M.M.B.c.>.$.#.#.+.@.#.@.@.+.#.=.&.;.>.;.;.>.>.>.>.>.s.b.b.>.s.s.>.>.>.>.>.;.*.} _ _ / / / U S S U 1.D.H._.&X&XY.h dXdX", +"dXdXfXK.$XM.a.V.n.>.&.$.#.#.#.$.#.+.=.&.&.>.>.>.c.c.c.>.c.b.b.b.b.b.>.b.b.b.b.>.c.>.>.>.%.} [ _ ) / Y S U @.D.F.~.XX3X|.3.L.dXdX", +"dXdXdX^.&XI.v.v.n.1.-.$.#.#.#.$.-.-.&.;.>.>.>.b.b.b.Z.Z.Z.b.Z.Z.S.S.S.S.S.S.G.S.S.M.c.c.>.X.} [ _ ) / / ( <.D.~.+X,X6X^.y sXdXdX", +"dXdXdXsXY.^.v.p.1.1.<.$.$.#.$.$.-.;.>.>.>.1.b.n.Z.Z.Z.S.S.A.S.S.S.S.S.S.G..X}.).).).Q.Z.s.&.X.} ] ) / ( @.m.H.+XoX2X.1.<.$.$.$.$.-.-.1.1.m.b.b.n.Z.S.F.G.G.Q.Q.Q.Q.U.G.Q.Q..X1X3X,X,X,X.X).S.&.&.X.} _ ) ] $.H.+XoX3X0X^.g sXdXdXdX", +"dXdXdXdXfXN.^.v.;.,.,.-.$.$.=.<.>.1.m.n.n.Z.Z.A.H.G.Q.Q.).).`.)._.).)._.0XqX0XwX0X9X9X}.S.>.*.*.} [ ] } c.`.XX3X6X2XW @XdXdXdXdX", +"dXdXdXdXdX0Xg.M.;.-.-.<.=.$.=.-.1.b.n.Z.F.F.A.G.G.Q.)._.)._._.}.{.}.}.}.9XaXaXaXpXpXiX.XA.s.>.*.%.[ } $.H.XXOX6XwXI.H dXdXdXdXdX", +"dXdXdXdXdXdX&Xw._ @.+.=.=.=.=.;.>.1.b.n.Z.G.Q.).Q._._._.}.}.XX}.oXOXOXOXOXpXfXfXfXaX6X.XS.s.p.;.%.%.%.c.+XOX2X0X&XJ aXdXdXdXdXdX", +"dXdXdXdXdXdXfX^.w.S U U { +.+.-.>.1.b.Z.A.G._._.}.}.}..XOXOXOX3X3X3X3X2X3X3X6XwX0X2X2XOXS.M.s.>.*.&.&.H.oX3X9X6X! >XdXdXdXdXdXdX", +"dXdXdXdXdXdXdXiX^.e.U U { { +.-.>.1.B.Z.A.)._.}.XXoX.XOXOX3X3X2X2X2X6X2X2X9X6X2X9X6X6X}.A.C.s.>.>.;.v.XX3X6X9Xd.L.dXdXdXdXdXdXdX", +"dXdXdXdXdXdXdXdXaX^.w.U ( { [ %.>.p.n.A.G.)._.}.oXOX,X,X3X2X2X2X6X9X9XwXwXwXwXwXwXwX2X).G.S.b.a.>.p._.3X6X9XK.0.dXdXdXdXdXdXdXdX", +"dXdXdXdXdXdXdXdXdXaX[.M.U _ +.+.&.>.b.S.G.).{.}..X,X3X2X2X6X9XwXwXwXwXuXuXuXuXuXuXqX X).U.A.B.v.p.G.OX2X9XY.9.dXdXdXdXdXdXdXdXdX", +"dXdXdXdXdXdXdXdXdXdXaX&XY._ _ +.&.>.b.S.G.).}.oXOX3X2X9X9XwXwXqXuXuXiXiXiXpXiXiXuX,X}.'.U.A.B.v.B.oX3X2XJ.d.dXdXdXdXdXdXdXdXdXdX", +"dXdXdXdXdXdXdXdXdXdXdXaX + +/**INDENT-OFF**/ +extern "C" { +#include "file.h" +} +/**INDENT-ON**/ + +#if 0 +#define D(...) printf(__VA_ARGS__) +#else +#define D(...) +#endif + +#define EXPECT_OK(x) EXPECT_FALSE(x) +#define EXPECT_ERR(x) EXPECT_TRUE(x) + +#if 0 +char *__imlib_FileKey(const char *file); +char *__imlib_FileRealFile(const char *file); +char *__imlib_FileExtension(const char *file); + +//int __imlib_FileExists(const char *s); +//int __imlib_FileIsFile(const char *s); +//int __imlib_FileIsDir(const char *s); +char **__imlib_FileDir(const char *dir, int *num); +void __imlib_FileFreeDirList(char **l, int num); +void __imlib_FileDel(const char *s); +time_t __imlib_FileModDate(const char *s); +char *__imlib_FileHomeDir(int uid); +int __imlib_FilePermissions(const char *s); + +//int __imlib_FileCanRead(const char *s); +int __imlib_IsRealFile(const char *s); +#endif + +#define USE_REAL_FILE 0 + +TEST(FILE, file_extension) +{ + const char *s; + + s = __imlib_FileExtension("abc.def"); + EXPECT_STREQ(s, "def"); + + s = __imlib_FileExtension(".def"); + EXPECT_STREQ(s, "def"); + + s = __imlib_FileExtension("def"); + EXPECT_STREQ(s, "def"); + + s = __imlib_FileExtension("."); + EXPECT_STREQ(s, NULL); + + s = __imlib_FileExtension("def."); + EXPECT_STREQ(s, NULL); + + s = __imlib_FileExtension("/def.x"); + EXPECT_STREQ(s, "x"); + + s = __imlib_FileExtension("/def"); + EXPECT_STREQ(s, "def"); +} + +TEST(FILE, file_exists) +{ + int rc; + + rc = __imlib_FileExists("./Makefile"); + EXPECT_EQ(rc, 1); + + rc = __imlib_FileExists("."); + EXPECT_EQ(rc, 1); + + rc = __imlib_FileExists("./foob"); + EXPECT_EQ(rc, 0); + + rc = __imlib_FileExists("./Makefile:foo"); + EXPECT_EQ(rc, USE_REAL_FILE); + + rc = __imlib_FileExists(".:foo"); + EXPECT_EQ(rc, USE_REAL_FILE); + + rc = __imlib_FileExists("./foob:foo"); + EXPECT_EQ(rc, 0); +} + +TEST(FILE, file_is_file) +{ + int rc; + + rc = __imlib_FileIsFile("./Makefile"); + EXPECT_EQ(rc, 1); + + rc = __imlib_FileIsFile("."); + EXPECT_EQ(rc, 0); + + rc = __imlib_FileIsFile("./foob"); + EXPECT_EQ(rc, 0); + + rc = __imlib_FileIsFile("./Makefile:foo"); + EXPECT_EQ(rc, USE_REAL_FILE); + + rc = __imlib_FileIsFile(".:foo"); + EXPECT_EQ(rc, 0); + + rc = __imlib_FileIsFile("./foob:foo"); + EXPECT_EQ(rc, 0); +} + +TEST(FILE, file_is_dir) +{ + int rc; + + rc = __imlib_FileIsDir("./Makefile"); + EXPECT_EQ(rc, 0); + + rc = __imlib_FileIsDir("."); + EXPECT_EQ(rc, 1); + + rc = __imlib_FileIsDir("./foob"); + EXPECT_EQ(rc, 0); + + rc = __imlib_FileIsDir("./Makefile:foo"); + EXPECT_EQ(rc, 0); + + rc = __imlib_FileIsDir(".:foo"); + EXPECT_EQ(rc, USE_REAL_FILE); + + rc = __imlib_FileIsDir("./foob:foo"); + EXPECT_EQ(rc, 0); +} + +TEST(FILE, file_can_read) +{ + int rc; + + rc = __imlib_FileCanRead("./Makefile"); + EXPECT_EQ(rc, 1); + + rc = __imlib_FileCanRead("."); + EXPECT_EQ(rc, 1); + + rc = __imlib_FileCanRead("./foob"); + EXPECT_EQ(rc, 0); + + rc = system("touch gylle"); + EXPECT_EQ(rc, 0); + rc = __imlib_FileCanRead("gylle"); + EXPECT_EQ(rc, 1); + + rc = system("chmod 000 gylle"); + EXPECT_EQ(rc, 0); + rc = __imlib_FileCanRead("gylle"); + EXPECT_EQ(rc, 0); + + rc = unlink("gylle"); + EXPECT_EQ(rc, 0); +} + +TEST(FILE, file_is_real_file) +{ + int rc; + + rc = __imlib_IsRealFile("./Makefile"); + EXPECT_EQ(rc, 1); + + rc = __imlib_IsRealFile("."); + EXPECT_EQ(rc, 0); + + rc = __imlib_IsRealFile("./foob"); + EXPECT_EQ(rc, 0); + + rc = system("touch gylle"); + EXPECT_EQ(rc, 0); + rc = __imlib_IsRealFile("gylle"); + EXPECT_EQ(rc, 1); + + rc = system("chmod 000 gylle"); + EXPECT_EQ(rc, 0); + rc = __imlib_IsRealFile("gylle"); + EXPECT_EQ(rc, 1); + + rc = unlink("gylle"); + EXPECT_EQ(rc, 0); +} + +int +main(int argc, char **argv) +{ + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/test_load.cpp b/test/test_load.cpp new file mode 100644 index 0000000..5e47c55 --- /dev/null +++ b/test/test_load.cpp @@ -0,0 +1,174 @@ +#include + +#include +#include + +int debug = 0; + +#define D(...) if (debug) printf(__VA_ARGS__) + +#define EXPECT_OK(x) EXPECT_FALSE(x) +#define EXPECT_ERR(x) EXPECT_TRUE(x) + +#define TOPDIR SRC_DIR +#define IMGDIR TOPDIR "/test/images" +#define FILE_REF "icon-64.png" + +static const char *const pfxs[] = { + "argb", + "bmp", + "ff.bz2", // bz2 + "ff", + "gif", + "ico", + "jpg.mp3", // id3 + "jpeg", + "ilbm", // lbm + "png", + "ppm", // pnm + "tga", + "tiff", + "webp", + "xbm", + "xpm", + "ff.gz", // zlib +}; +#define N_PFX (sizeof(pfxs) / sizeof(char*)) + +static int +progress(Imlib_Image im, char percent, int update_x, int update_y, + int update_w, int update_h) +{ + D("%s: %3d%% %4d,%4d %4dx%4d\n", + __func__, percent, update_x, update_y, update_w, update_h); + + return 1; /* Continue */ +} + +static void +image_free(Imlib_Image im) +{ + imlib_context_set_image(im); + imlib_free_image_and_decache(); +} + +static void +test_load(void) +{ + char filei[256]; + char fileo[256]; + unsigned int i, j; + Imlib_Image im; + Imlib_Load_Error lerr; + FILE *fp; + int fd; + int err; + + snprintf(filei, sizeof(filei), "%s/%s", IMGDIR, FILE_REF); + D("Load '%s'\n", filei); + im = imlib_load_image(filei); + + ASSERT_TRUE(im); + + image_free(im); + + for (i = 0; i < N_PFX; i++) + { + // Load files of all types + snprintf(fileo, sizeof(fileo), "%s/%s.%s", IMGDIR, "icon-64", pfxs[i]); + D("Load '%s'\n", fileo); + im = imlib_load_image_with_error_return(fileo, &lerr); + EXPECT_EQ(lerr, 0); + if (lerr) + D("Error %d loading '%s'\n", lerr, fileo); + if (im) + image_free(im); + + if (strchr(pfxs[i], '.') == 0) + { + snprintf(filei, sizeof(filei), "%s.%s", "icon-64", pfxs[i]); + for (j = 0; j < N_PFX; j++) + { + // Load certain types pretending they are something else + snprintf(fileo, sizeof(fileo), "%s/%s.%s.%s", IMGDIR, + "icon-64", pfxs[i], pfxs[j]); + unlink(fileo); + symlink(filei, fileo); + D("Load incorrect suffix '%s'\n", fileo); + im = imlib_load_image_with_error_return(fileo, &lerr); + EXPECT_EQ(lerr, 0); + if (lerr) + D("Error %d loading '%s'\n", lerr, fileo); + if (im) + image_free(im); + } + } + + // Empty files of all types + snprintf(fileo, sizeof(fileo), "%s/%s.%s", IMGDIR, "empty", pfxs[i]); + unlink(fileo); + fp = fopen(fileo, "wb"); + fclose(fp); + D("Load empty '%s'\n", fileo); + im = imlib_load_image_with_error_return(fileo, &lerr); + D(" err = %d\n", lerr); + EXPECT_TRUE(lerr == IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT || + lerr == IMLIB_LOAD_ERROR_UNKNOWN || + lerr == IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST); + + // Non-existing files of all types + snprintf(fileo, sizeof(fileo), "%s/%s.%s", IMGDIR, "nonex", pfxs[i]); + unlink(fileo); + symlink("non-existing", fileo); + D("Load non-existing '%s'\n", fileo); + im = imlib_load_image_with_error_return(fileo, &lerr); + EXPECT_EQ(lerr, IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST); + + // Load via fd + snprintf(fileo, sizeof(fileo), "%s/%s.%s", IMGDIR, "icon-64", pfxs[i]); + fd = open(fileo, O_RDONLY); + D("Load fd %d '%s'\n", fd, fileo); + snprintf(fileo, sizeof(fileo), ".%s", pfxs[i]); + im = imlib_load_image_fd(fd, pfxs[i]); + EXPECT_TRUE(im); + if (im) + image_free(im); + err = close(fd); + EXPECT_TRUE(err != 0); + } +} + +TEST(LOAD, load_1) +{ + test_load(); +} + +TEST(LOAD, load_2) +{ + imlib_context_set_progress_function(progress); + imlib_context_set_progress_granularity(10); + test_load(); +} + +int +main(int argc, char **argv) +{ + const char *s; + + ::testing::InitGoogleTest(&argc, argv); + + for (argc--, argv++; argc > 0; argc--, argv++) + { + s = argv[0]; + if (*s++ != '-') + break; + switch (*s) + { + case 'd': + debug++; + break; + } + } + + return RUN_ALL_TESTS(); +} diff --git a/test/test_save.cpp b/test/test_save.cpp new file mode 100644 index 0000000..a813482 --- /dev/null +++ b/test/test_save.cpp @@ -0,0 +1,154 @@ +#include + +#include + +#if 0 +#define D(...) printf(__VA_ARGS__) +#else +#define D(...) do { } while (0) +#endif + +#define EXPECT_OK(x) EXPECT_FALSE(x) +#define EXPECT_ERR(x) EXPECT_TRUE(x) + +#define TOPDIR SRC_DIR +#define FILE_REF "test/images/icon-64.bmp" + +static const char *const pfxs[] = { + "argb", + "bmp", + "ff", +// "gif", +// "ico", + "jpeg", +// "lbm", + "png", + "pnm", + "tga", + "tiff", + "webp", + "xbm", +// "xpm", +}; +#define N_PFX (sizeof(pfxs) / sizeof(char*)) + +static int +progress(Imlib_Image im, char percent, int update_x, int update_y, + int update_w, int update_h) +{ + D("%s: %3d%% %4d,%4d %4dx%4d\n", + __func__, percent, update_x, update_y, update_w, update_h); + + return 1; /* Continue */ +} + +static void +test_save(void) +{ + char filei[256]; + char fileo[256]; + unsigned int i; + int w, h; + Imlib_Image im, im1, im2, im3; + Imlib_Load_Error lerr; + + snprintf(filei, sizeof(filei), "%s/%s", TOPDIR, FILE_REF); + D("Load '%s'\n", filei); + im = imlib_load_image(filei); + if (!im) + { + printf("Error loading '%s'\n", filei); + exit(0); + } + + imlib_context_set_image(im); + w = imlib_image_get_width(); + h = imlib_image_get_height(); + im1 = imlib_create_cropped_scaled_image(0, 0, w, h, w + 1, h + 1); + im2 = imlib_create_cropped_scaled_image(0, 0, w, h, w + 2, h + 2); + im3 = imlib_create_cropped_scaled_image(0, 0, w, h, w + 3, h + 3); + + ASSERT_TRUE(im); + ASSERT_TRUE(im1); + ASSERT_TRUE(im2); + ASSERT_TRUE(im3); + + for (i = 0; i < N_PFX; i++) + { + imlib_context_set_image(im); + imlib_image_set_format(pfxs[i]); + w = imlib_image_get_width(); + h = imlib_image_get_height(); + snprintf(fileo, sizeof(fileo), "%s/%s-%dx%d.%s", + ".", "img_save", w, h, pfxs[i]); + D("Save '%s'\n", fileo); + imlib_save_image_with_error_return(fileo, &lerr); + EXPECT_EQ(lerr, 0); + if (lerr) + D("Error %d saving '%s'\n", lerr, fileo); + + imlib_context_set_image(im1); + imlib_image_set_format(pfxs[i]); + w = imlib_image_get_width(); + h = imlib_image_get_height(); + snprintf(fileo, sizeof(fileo), "%s/%s-%dx%d.%s", + ".", "img_save", w, h, pfxs[i]); + D("Save '%s'\n", fileo); + imlib_save_image_with_error_return(fileo, &lerr); + EXPECT_EQ(lerr, 0); + if (lerr) + D("Error %d saving '%s'\n", lerr, fileo); + + imlib_context_set_image(im2); + imlib_image_set_format(pfxs[i]); + w = imlib_image_get_width(); + h = imlib_image_get_height(); + snprintf(fileo, sizeof(fileo), "%s/%s-%dx%d.%s", + ".", "img_save", w, h, pfxs[i]); + D("Save '%s'\n", fileo); + imlib_save_image_with_error_return(fileo, &lerr); + EXPECT_EQ(lerr, 0); + if (lerr) + D("Error %d saving '%s'\n", lerr, fileo); + + imlib_context_set_image(im3); + imlib_image_set_format(pfxs[i]); + w = imlib_image_get_width(); + h = imlib_image_get_height(); + snprintf(fileo, sizeof(fileo), "%s/%s-%dx%d.%s", + ".", "img_save", w, h, pfxs[i]); + D("Save '%s'\n", fileo); + imlib_save_image_with_error_return(fileo, &lerr); + EXPECT_EQ(lerr, 0); + if (lerr) + D("Error %d saving '%s'\n", lerr, fileo); + } + + imlib_context_set_image(im); + imlib_free_image_and_decache(); + imlib_context_set_image(im1); + imlib_free_image_and_decache(); + imlib_context_set_image(im2); + imlib_free_image_and_decache(); + imlib_context_set_image(im3); + imlib_free_image_and_decache(); +} + +TEST(SAVE, save_1) +{ + test_save(); +} + +TEST(SAVE, save_2) +{ + imlib_context_set_progress_function(progress); + imlib_context_set_progress_granularity(10); + test_save(); +} + +int +main(int argc, char **argv) +{ + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +}