aboutsummaryrefslogtreecommitdiffstats
path: root/lib/percept/test/egd_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/percept/test/egd_SUITE.erl')
-rw-r--r--lib/percept/test/egd_SUITE.erl303
1 files changed, 303 insertions, 0 deletions
diff --git a/lib/percept/test/egd_SUITE.erl b/lib/percept/test/egd_SUITE.erl
new file mode 100644
index 0000000000..603ad628d3
--- /dev/null
+++ b/lib/percept/test/egd_SUITE.erl
@@ -0,0 +1,303 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+-module(egd_SUITE).
+-include("test_server.hrl").
+
+%% Test server specific exports
+-export([all/1]).
+-export([init_per_suite/1, end_per_suite/1]).
+-export([init_per_testcase/2, end_per_testcase/2]).
+
+%% Test cases
+-export([
+ image_create_and_destroy/1,
+ image_shape/1,
+ image_colors/1,
+ image_font/1,
+ image_png_compliant/1
+ ]).
+
+%% Default timetrap timeout (set in init_per_testcase)
+-define(default_timeout, ?t:minutes(1)).
+
+init_per_suite(Config) when is_list(Config) ->
+ {A1,A2,A3} = now(),
+ random:seed(A1, A2, A3),
+ Config.
+
+end_per_suite(Config) when is_list(Config) ->
+ Config.
+
+init_per_testcase(_Case, Config) ->
+ Dog = ?t:timetrap(?default_timeout),
+ [{max_size, 800}, {watchdog,Dog} | Config].
+
+end_per_testcase(_Case, Config) ->
+ Dog = ?config(watchdog, Config),
+ ?t:timetrap_cancel(Dog),
+ ok.
+
+all(suite) ->
+ % Test cases
+ [
+ image_create_and_destroy,
+ image_shape,
+ image_colors,
+ image_font,
+ image_png_compliant
+ ].
+
+%%----------------------------------------------------------------------
+%% Tests
+%%----------------------------------------------------------------------
+
+image_create_and_destroy(suite) ->
+ [];
+image_create_and_destroy(doc) ->
+ ["Image creation and destroy test."];
+image_create_and_destroy(Config) when is_list(Config) ->
+ {W,H} = get_size(?config(max_size, Config)),
+ ?line Image = egd:create(W, H),
+ ?line ok = egd:destroy(Image),
+ ok.
+
+image_colors(suite) ->
+ [];
+image_colors(doc) ->
+ ["Image color test."];
+image_colors(Config) when is_list(Config) ->
+ {W,H} = get_size(?config(max_size, Config)),
+ ?line Image = egd:create(W, H),
+ put(image_size, {W,H}),
+
+ RGB = get_rgb(),
+ ?line Black = egd:color({0,0,0}),
+ ?line Red = egd:color({255,0,0}),
+ ?line Green = egd:color({0,255,0}),
+ ?line Blue = egd:color({0,0,255}),
+ ?line Random = egd:color(Image, RGB),
+
+ ?line ok = egd:line(Image, get_point(), get_point(), Random),
+ ?line ok = egd:line(Image, get_point(), get_point(), Red),
+ ?line ok = egd:line(Image, get_point(), get_point(), Green),
+ ?line ok = egd:line(Image, get_point(), get_point(), Black),
+ ?line ok = egd:line(Image, get_point(), get_point(), Blue),
+
+ HtmlDefaultNames = [black,silver,gray,white,maroon,red,
+ purple,fuchia,green,lime,olive,yellow,navy,blue,teal,
+ aqua],
+
+ lists:foreach(fun
+ (ColorName) ->
+ ?line Color = egd:color(ColorName),
+ ?line ok = egd:line(Image, get_point(), get_point(), Color)
+ end, HtmlDefaultNames),
+
+ ?line <<_/binary>> = egd:render(Image),
+ ?line ok = egd:destroy(Image),
+ erase(image_size),
+ ok.
+
+image_shape(suite) ->
+ [];
+image_shape(doc) ->
+ ["Image shape api test."];
+image_shape(Config) when is_list(Config) ->
+ {W,H} = get_size(?config(max_size, Config)),
+ put(image_size, {W,H}),
+ ?line Im = egd:create(W, H),
+
+ ?line Fgc = egd:color({255,0,0}),
+
+ ?line ok = egd:line(Im, get_point(), get_point(), Fgc),
+ ?line ok = egd:rectangle(Im, get_point(), get_point(), Fgc),
+ ?line ok = egd:filledEllipse(Im, get_point(), get_point(), Fgc),
+ ?line ok = egd:arc(Im, get_point(), get_point(), Fgc),
+ ?line ok = egd:arc(Im, get_point(), get_point(), 100, Fgc),
+
+ Pt1 = get_point(),
+ Pt2 = get_point(),
+
+ ?line ok = egd:filledRectangle(Im, Pt1, Pt2, Fgc),
+
+ ?line Bitmap = egd:render(Im, raw_bitmap),
+
+ ?line ok = bitmap_point_has_color(Bitmap, {W,H}, Pt2, Fgc),
+ ?line ok = bitmap_point_has_color(Bitmap, {W,H}, Pt1, Fgc),
+
+ ?line ok = egd:destroy(Im),
+ erase(image_size),
+ ok.
+
+image_font(suite) ->
+ [];
+image_font(doc) ->
+ ["Image font test."];
+image_font(Config) when is_list(Config) ->
+ {W,H} = get_size(?config(max_size, Config)),
+ put(image_size, {W,H}),
+ ?line Im = egd:create(W, H),
+ ?line Fgc = egd:color({0,130,0}),
+
+ ?line Filename = filename:join([code:priv_dir(percept),"fonts","6x11_latin1.wingsfont"]),
+ ?line Font = egd_font:load(Filename),
+
+ % simple text
+ ?line ok = egd:text(Im, get_point(), Font, "Hello World", Fgc),
+ ?line <<_/binary>> = egd:render(Im, png),
+
+ GlyphStr1 = " !\"#$%&'()*+,-./", % Codes 32 -> 47
+ NumericStr = "0123456789", % Codes 48 -> 57
+ GlyphStr2 = ":;<=>?@", % Codes 58 -> 64
+ AlphaBigStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ", % Codes 65 -> 90
+ GlyphStr3 = "[\\]^_`", % Codes 91 -> 96
+ AlphaSmStr = "abcdefghijklmnopqrstuvwxyz", % Codes 97 -> 122
+ GlyphStr4 = "{|}~", % Codes 123 -> 126
+
+ ?line ok = egd:text(Im, get_point(), Font, GlyphStr1, Fgc),
+ ?line <<_/binary>> = egd:render(Im, png),
+
+ ?line ok = egd:text(Im, get_point(), Font, NumericStr, Fgc),
+ ?line <<_/binary>> = egd:render(Im, png),
+
+ ?line ok = egd:text(Im, get_point(), Font, GlyphStr2, Fgc),
+ ?line <<_/binary>> = egd:render(Im, png),
+
+ ?line ok = egd:text(Im, get_point(), Font, AlphaBigStr, Fgc),
+ ?line <<_/binary>> = egd:render(Im, png),
+
+ ?line ok = egd:text(Im, get_point(), Font, GlyphStr3, Fgc),
+ ?line <<_/binary>> = egd:render(Im, png),
+
+ ?line ok = egd:text(Im, get_point(), Font, AlphaSmStr, Fgc),
+ ?line <<_/binary>> = egd:render(Im, png),
+
+ ?line ok = egd:text(Im, get_point(), Font, GlyphStr4, Fgc),
+ ?line <<_/binary>> = egd:render(Im, png),
+
+ ?line ok = egd:destroy(Im),
+ erase(image_size),
+ ok.
+
+image_png_compliant(suite) ->
+ [];
+image_png_compliant(doc) ->
+ ["Image png compliant test."];
+image_png_compliant(Config) when is_list(Config) ->
+ {W,H} = get_size(?config(max_size, Config)),
+ put(image_size, {W,H}),
+ ?line Im = egd:create(W, H),
+ ?line Fgc = egd:color({0,0,0}),
+ ?line ok = egd:filledRectangle(Im, get_point(), get_point(), Fgc),
+
+ ?line Bin = egd:render(Im, png),
+ ?line true = binary_is_png_compliant(Bin),
+
+ ?line ok = egd:destroy(Im),
+ erase(image_size),
+ ok.
+
+%%----------------------------------------------------------------------
+%% Auxiliary tests
+%%----------------------------------------------------------------------
+
+bitmap_point_has_color(Bitmap, {W,_}, {X,Y}, C) ->
+ {CR,CG,CB,_} = egd_primitives:rgb_float2byte(C),
+ N = W*Y*3 + X*3,
+ << _:N/binary, R,G,B, _/binary>> = Bitmap,
+ case {R,G,B} of
+ {CR,CG,CB} -> ok;
+ Other ->
+ io:format("bitmap_point_has_color: error color was ~p, should be ~p~n", [Other, {CR,CG,CB}]),
+ {error, {Other,{CR,CG,CB}}}
+ end.
+
+%% jfif header by specification
+%% 2 bytes, length
+%% 5 bytes, identifier ="JFIF\0"
+%% 2 bytes, version, (major, minor)
+%% 1 byte , units
+%% However, JFIF seems to start at 6 (7 with 1-index)?
+
+binary_is_jfif_compliant(JpegBin) ->
+ ?line {Bin, _} = split_binary(JpegBin, 11),
+ List = binary_to_list(Bin),
+ case lists:sublist(List, 7, 4) of
+ "JFIF" -> true;
+ Other ->
+ io:format("img -> ~p~n", [Other]),
+ false
+ end.
+
+binary_is_gif_compliant(GifBin) ->
+ ?line {Bin, _} = split_binary(GifBin, 10),
+ List = binary_to_list(Bin),
+ case lists:sublist(List, 1,5) of
+ "GIF87" -> true;
+ Other ->
+ io:format("img -> ~p~n", [Other]),
+ false
+ end.
+
+binary_is_png_compliant(PngBin) ->
+ ?line {Bin, _} = split_binary(PngBin, 10),
+ List = binary_to_list(Bin),
+ case lists:sublist(List, 2,3) of
+ "PNG" -> true;
+ Other ->
+ io:format("img -> ~p~n", [Other]),
+ false
+ end.
+
+%%----------------------------------------------------------------------
+%% Auxiliary
+%%----------------------------------------------------------------------
+
+
+get_rgb() ->
+ R = random(255),
+ G = random(255),
+ B = random(255),
+ {R,G,B}.
+
+get_angle() ->
+ random(359).
+
+get_point() ->
+ get_point(get(image_size)).
+get_point({W,H}) ->
+ X = random(W - 1),
+ Y = random(H - 1),
+ {X,Y}.
+
+get_size(Max) ->
+ W = trunc(random(Max/2) + Max/2 + 1),
+ H = trunc(random(Max/2) + Max/2 + 1),
+ io:format("Image size will be ~p x ~p~n", [W,H]),
+ {W,H}.
+
+get_points(N) ->
+ get_points(N, []).
+get_points(0, Out) ->
+ Out;
+get_points(N, Out) ->
+ get_points(N - 1, [get_point() | Out]).
+
+random(N) -> trunc(random:uniform(trunc(N + 1)) - 1).