-!Makefile
-tet_captured
-results-desktop
-results-target
-results
-/dali-test-suite-utils.pc
-rules.mk
-dali.info
+*.xml
+build
+build.log
--- /dev/null
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
+PROJECT(tct_coreapi_utc)
+
+INCLUDE(FindPkgConfig)
+SET(BIN_DIR "/opt/usr/bin")
+
+INCLUDE_DIRECTORIES(
+ src/common
+)
+
+ADD_SUBDIRECTORY(src)
--- /dev/null
+!Makefile
+tet_captured
+results-desktop
+results-target
+results
+/dali-test-suite-utils.pc
+rules.mk
+dali.info
--- /dev/null
+#!/bin/bash
+
+TEMP=`getopt -o 2vds: --long 2,verbose,desktop,scenario: \
+ -n 'build_out.sh' -- "$@"`
+
+if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
+
+# Note the quotes around `$TEMP': they are essential!
+eval set -- "$TEMP"
+
+scenario=all
+opt_verbose=0
+opt_env=scratchbox
+
+while true ; do
+ case "$1" in
+ -d|--desktop) opt_env=desktop ; shift ;;
+ -s|--scenario) scenario="$2" ; shift 2 ;;
+ -v|--verbose) opt_verbose=1 ; shift ;;
+ -2|--2) opt_env=sbs ; shift ;;
+ --) shift ; break ;;
+ *) echo "Internal error!" ; exit 1 ;;
+ esac
+done
+
+
+case "$opt_env" in
+ desktop)
+ . _export_desktop.sh
+ cat <<EOF > coverage.mk
+LDFLAGS += --coverage
+EOF
+ ;;
+ scratchbox)
+ . _export_env.sh
+ cat <<EOF > coverage.mk
+LDFLAGS +=
+EOF
+ ;;
+ sbs)
+ . _export_sbs.sh
+ cat <<EOF > coverage.mk
+LDFLAGS +=
+EOF
+ ;;
+esac
+
+
+echo PATH=$PATH
+echo LD_LIBRARY_PATH=$LD_LIBRARY_PATH
+echo TET_ROOT=$TET_ROOT
+echo TET_SUITE_ROOT=$TET_SUITE_ROOT
+echo ARCH=$ARCH
+
+RESULT_DIR=results-$ARCH
+HTML_RESULT=$RESULT_DIR/build-tar-result-$FILE_NAME_EXTENSION.html
+JOURNAL_RESULT=$RESULT_DIR/build-tar-result-$FILE_NAME_EXTENSION.journal
+
+# Faster cleanup.
+find . -name Makefile -execdir make -f {} clean \;
+
+mkdir -p $RESULT_DIR
+if [ $opt_verbose -eq 1 ] ; then
+ tcc -b -j - ./ $scenario | tee $JOURNAL_RESULT
+else
+ tcc -b -j $JOURNAL_RESULT -p ./ $scenario
+fi
+./tbp.pl $JOURNAL_RESULT
--- /dev/null
+#!/bin/bash
+
+( cd ../build/slp ; make cov_data )
+
+for i in `find . -name Makefile` ; do
+ (
+ cd $(dirname $i)
+ echo `pwd`
+ covs=( `ls *.gcda 2>/dev/null` )
+ if [[ $? -eq 0 ]]
+ then
+ make coverage
+ fi
+ )
+done
+
+(
+ cd .. ;
+ genhtml -o build/slp/doc/coverage `find . -name dali.info`
+)
+
+
--- /dev/null
+#!/bin/bash
+
+TEMP=`getopt -o ds: --long desktop,scenario: \
+ -n 'build_out.sh' -- "$@"`
+
+if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
+
+# Note the quotes around `$TEMP': they are essential!
+eval set -- "$TEMP"
+
+scenario=all
+env=./_export_env.sh
+
+while true ; do
+ case "$1" in
+ -d|--desktop) env=./_export_desktop.sh ; shift ;;
+ -s|--scenario) scenario="$2" ; shift 2 ;;
+ --) shift ; break ;;
+ *) echo "Internal error!" ; exit 1 ;;
+ esac
+done
+
+
+# Source correct environment
+. $env
+
+
+echo PATH=$PATH
+echo LD_LIBRARY_PATH=$LD_LIBRARY_PATH
+echo TET_ROOT=$TET_ROOT
+echo TET_SUITE_ROOT=$TET_SUITE_ROOT
+echo ARCH=$ARCH
+
+RESULT_DIR=results-$ARCH
+HTML_RESULT=$RESULT_DIR/exec-tar-result-$FILE_NAME_EXTENSION.html
+JOURNAL_RESULT=$RESULT_DIR/exec-tar-result-$FILE_NAME_EXTENSION.journal
+
+mkdir -p $RESULT_DIR
+
+tcc -e -j $JOURNAL_RESULT -p ./ $scenario
+./tbp.pl $JOURNAL_RESULT
+
#!/bin/bash
-TEMP=`getopt -o 2vds: --long 2,verbose,desktop,scenario: \
- -n 'build_out.sh' -- "$@"`
+rm -rf build
+mkdir build
-if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
+function build
+{
+ (cd src/$1; ../../scripts/tcheadgen.sh tct-$1-core.h)
+ if [ $? -ne 0 ]; then echo "Aborting..."; exit 1; fi
+ (cd build ; cmake .. -DMODULE=$1 ; make -j7 )
+}
-# Note the quotes around `$TEMP': they are essential!
-eval set -- "$TEMP"
+if [ -n "$1" ] ; then
+ echo BUILDING ONLY $1
+ build $1
-scenario=all
-opt_verbose=0
-opt_env=scratchbox
-
-while true ; do
- case "$1" in
- -d|--desktop) opt_env=desktop ; shift ;;
- -s|--scenario) scenario="$2" ; shift 2 ;;
- -v|--verbose) opt_verbose=1 ; shift ;;
- -2|--2) opt_env=sbs ; shift ;;
- --) shift ; break ;;
- *) echo "Internal error!" ; exit 1 ;;
- esac
-done
-
-
-case "$opt_env" in
- desktop)
- . _export_desktop.sh
- cat <<EOF > coverage.mk
-LDFLAGS += --coverage
-EOF
- ;;
- scratchbox)
- . _export_env.sh
- cat <<EOF > coverage.mk
-LDFLAGS +=
-EOF
- ;;
- sbs)
- . _export_sbs.sh
- cat <<EOF > coverage.mk
-LDFLAGS +=
-EOF
- ;;
-esac
-
-
-echo PATH=$PATH
-echo LD_LIBRARY_PATH=$LD_LIBRARY_PATH
-echo TET_ROOT=$TET_ROOT
-echo TET_SUITE_ROOT=$TET_SUITE_ROOT
-echo ARCH=$ARCH
-
-RESULT_DIR=results-$ARCH
-HTML_RESULT=$RESULT_DIR/build-tar-result-$FILE_NAME_EXTENSION.html
-JOURNAL_RESULT=$RESULT_DIR/build-tar-result-$FILE_NAME_EXTENSION.journal
-
-# Faster cleanup.
-find . -name Makefile -execdir make -f {} clean \;
-
-mkdir -p $RESULT_DIR
-if [ $opt_verbose -eq 1 ] ; then
- tcc -b -j - ./ $scenario | tee $JOURNAL_RESULT
else
- tcc -b -j $JOURNAL_RESULT -p ./ $scenario
+ for mod in `ls -1 src/ | grep -v CMakeList `
+ do
+ if [ $mod != 'common' ] && [ $mod != 'manual' ]; then
+ echo BUILDING $mod
+ build $mod
+ fi
+ done
fi
-./tbp.pl $JOURNAL_RESULT
( cd ../build/slp ; make cov_data )
-for i in `find . -name Makefile` ; do
+
+for i in `find . -name "*.dir"` ; do
(
- cd $(dirname $i)
+ cd $i
echo `pwd`
covs=( `ls *.gcda 2>/dev/null` )
if [[ $? -eq 0 ]]
then
- make coverage
+ lcov --directory . -c -o dali.info
+ lcov --remove dali.info "*boost*" "/usr/include/*" "*/automated-tests/*" -o dali.info
fi
)
done
cd .. ;
genhtml -o build/slp/doc/coverage `find . -name dali.info`
)
-
-
#!/bin/bash
-TEMP=`getopt -o ds: --long desktop,scenario: \
- -n 'build_out.sh' -- "$@"`
-
-if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
-
-# Note the quotes around `$TEMP': they are essential!
-eval set -- "$TEMP"
-
-scenario=all
-env=./_export_env.sh
-
-while true ; do
- case "$1" in
- -d|--desktop) env=./_export_desktop.sh ; shift ;;
- -s|--scenario) scenario="$2" ; shift 2 ;;
- --) shift ; break ;;
- *) echo "Internal error!" ; exit 1 ;;
- esac
-done
-
-
-# Source correct environment
-. $env
-
-
-echo PATH=$PATH
-echo LD_LIBRARY_PATH=$LD_LIBRARY_PATH
-echo TET_ROOT=$TET_ROOT
-echo TET_SUITE_ROOT=$TET_SUITE_ROOT
-echo ARCH=$ARCH
-
-RESULT_DIR=results-$ARCH
-HTML_RESULT=$RESULT_DIR/exec-tar-result-$FILE_NAME_EXTENSION.html
-JOURNAL_RESULT=$RESULT_DIR/exec-tar-result-$FILE_NAME_EXTENSION.journal
-
-mkdir -p $RESULT_DIR
-
-tcc -e -j $JOURNAL_RESULT -p ./ $scenario
-./tbp.pl $JOURNAL_RESULT
-
+function execute
+{
+ scripts/tctestsgen.sh $1 `pwd` desktop
+ testkit-lite -f `pwd`/tests.xml -o tct-${1}-core-tests.xml -A --comm localhost
+ scripts/add_style.pl $1
+}
+
+# Clean up old test results
+rm -f tct*core-tests.xml
+
+if [ -n "$1" ] ; then
+ echo EXECUTING ONLY $1
+ execute $1
+
+else
+ for mod in `ls -1 src/ | grep -v CMakeList `
+ do
+ if [ $mod != 'common' ] && [ $mod != 'manual' ]; then
+ echo EXECUTING $mod
+ execute $mod
+ fi
+ done
+fi
+
+scripts/summarize.pl
--- /dev/null
+%define MODULE_NAME dali
+%define MODULE_LIBNAME dali
+Name: core-%{MODULE_NAME}-tests
+Summary: Core API unit TC (%{name})
+Version: 0.1
+Release: 0
+Group: Development/Tools
+License: Apache License, Version 2.0, Samsung Properietary
+Source0: %{name}-%{version}.tar.gz
+Requires: dali
+BuildRequires: dali-integration-devel
+BuildRequires: pkgconfig(dali-core)
+BuildRequires: pkgconfig(dali)
+BuildRequires: libxml2-devel
+BuildRequires: cmake
+
+%description
+Core API unit TC (%{name})
+
+%prep
+%setup -q
+
+%build
+
+%define PREFIX "%{_libdir}/%{name}"
+
+export LDFLAGS+="-Wl,--rpath=%{PREFIX} -Wl,--as-needed"
+cd automated-tests
+cmake . -DMODULE="%{MODULE_NAME}" -DCMAKE_INSTALL_PREFIX=%{_prefix}
+
+make %{?jobs:-j%jobs}
+
+%install
+rm -rf %{buildroot}
+cd automated-tests
+%make_install
+mkdir -p %{buildroot}/opt/usr/share/license
+cp %{_builddir}/%{name}-%{version}/LICENSE %{buildroot}/opt/usr/share/license/%{name}
+mkdir -p %{buildroot}/tmp/
+cp %{_builddir}/%{name}-%{version}/automated-tests/scripts/add_all_smack_rule.sh %{buildroot}/tmp/
+cp %{_builddir}/%{name}-%{version}/automated-tests/scripts/all_smack.rule %{buildroot}/tmp/
+
+%post
+
+%postun
+
+
+%files
+/opt/usr/bin/*
+/opt/usr/share/license/%{name}
+/tmp/add_all_smack_rule.sh
+/tmp/all_smack.rule
--- /dev/null
+%define MODULE_NAME dali-unmanaged
+%define MODULE_LIBNAME dali-unmanaged
+Name: core-%{MODULE_NAME}-tests
+Summary: Core API unit TC (%{name})
+Version: 0.1
+Release: 0
+Group: Development/Tools
+License: Apache License, Version 2.0, Samsung Properietary
+Source0: %{name}-%{version}.tar.gz
+Requires: dali
+BuildRequires: dali-devel
+BuildRequires: dali-integration-devel
+BuildRequires: pkgconfig(dali-core)
+BuildRequires: pkgconfig(dali)
+BuildRequires: libxml2-devel
+BuildRequires: cmake
+
+%description
+Core API unit TC (%{name})
+
+%prep
+%setup -q
+
+%build
+
+%define PREFIX "%{_libdir}/%{name}"
+
+export LDFLAGS+="-Wl,--rpath=%{PREFIX} -Wl,--as-needed"
+cd automated-tests
+cmake . -DMODULE="%{MODULE_NAME}" -DCMAKE_INSTALL_PREFIX=%{_prefix}
+
+make %{?jobs:-j%jobs}
+
+%install
+rm -rf %{buildroot}
+cd automated-tests
+%make_install
+mkdir -p %{buildroot}/opt/usr/share/license
+cp %{_builddir}/%{name}-%{version}/LICENSE %{buildroot}/opt/usr/share/license/%{name}
+mkdir -p %{buildroot}/tmp/
+cp %{_builddir}/%{name}-%{version}/automated-tests/scripts/add_all_smack_rule.sh %{buildroot}/tmp/
+cp %{_builddir}/%{name}-%{version}/automated-tests/scripts/all_smack.rule %{buildroot}/tmp/
+
+%post
+
+%postun
+
+
+%files
+/opt/usr/bin/*
+/opt/usr/share/license/%{name}
+/tmp/add_all_smack_rule.sh
+/tmp/all_smack.rule
--- /dev/null
+#!/bin/sh
+
+SCRIPTDIR=`dirname $(readlink -f $0)`
+SMACK_FILE=$SCRIPTDIR/all_smack.rule
+
+echo ""
+echo "Add smack rule in $SMACK_FILE"
+echo "==================================================="
+echo ""
+
+while read rule; do
+ NO_BLANK=$(echo $rule | sed 's/ //g' | sed 's/ //g')
+ if [ ${#NO_BLANK} -lt 1 ]; then
+ echo "Blank"
+ continue
+ elif [ `echo $NO_BLANK|cut -c1-1` = '#' ]; then
+ echo "Comment"
+ continue
+ fi
+
+ echo "echo \"$rule\" > /smack/load2"
+ echo "$rule" > /smack/load2
+done < $SMACK_FILE
+
+echo "==================================================="
+echo ""
--- /dev/null
+#!/bin/sh
+
+SCRIPTDIR=`dirname $(readlink -f $0)`
+SMACK_FILE=$SCRIPTDIR/all_smack.rule
+
+echo ""
+echo "Add smack rule in $SMACK_FILE"
+echo "==================================================="
+
+echo "sdb root on"
+sdb root on
+
+while read rule; do
+ NO_BLANK=$(echo $rule | sed 's/ //g' | sed 's/ //g')
+ if [ ${#NO_BLANK} -lt 1 ]; then
+ #echo "Blank"
+ continue
+ elif [ `echo $NO_BLANK|cut -c1-1` = '#' ]; then
+ #echo "Comment"
+ continue
+ fi
+
+ echo "sdb shell \"echo $rule > /smack/load2\""
+ sdb shell "echo $rule > /smack/load2"
+done < $SMACK_FILE
+
+echo "==================================================="
+echo ""
--- /dev/null
+#!/usr/bin/perl
+
+use strict;
+use Encode;
+use Getopt::Long;
+use Cwd;
+
+my $pwd = getcwd;
+my $MOD_NAME = $ARGV[0];
+my $results_xml = "tct-$MOD_NAME-core-tests.xml";
+my $results_out = "results_xml.$$";
+
+# Copy $results_xml, writing new stylesheet line:
+# Write <?xml-stylesheet type="text/xsl" href="./style/testresult.xsl"?> as second line
+open RESULTS, "<$results_xml" || die "Can't open $results_xml for reading:$!\n";
+open RESULTS_OUT, ">$results_out" || die "Can't open $results_out for writing:$!\n";
+my $fline = readline RESULTS;
+print RESULTS_OUT $fline;
+print RESULTS_OUT "<?xml-stylesheet type=\"text/xsl\" href=\"./style/testresult.xsl\"?>\n";
+while(<RESULTS>)
+{
+ print RESULTS_OUT $_;
+}
+close RESULTS_OUT;
+close RESULTS;
+unlink $results_xml;
+print `mv $results_out $results_xml`;
--- /dev/null
+# calendar-service
+_ calendar-service::svc rwx
+
+# capi-appfw-application
+_ alarm-server::alarm rw
+_ aul::launch x
+_ aul::terminate x
+
+# capi-network-bluetooth
+_ bt-service::admin w
+_ bt-service::manager w
+_ bt-service::gap w
+_ bt-service::spp w
+_ bt:service::opp w
+
+# capi-network-nfc
+_ nfc-manager rwx
+_ nfc-manager::tag rwx
+_ nfc-manager::p2p rwx
+_ nfc-manager::admin rwx
+_ nfc-manager::common rwx
+
+# capi-location-*
+_ location::maps rw
+_ location::client rw
+
+# libmdm
+_ mdm-server::eas rw
--- /dev/null
+#!/bin/bash
+if [ -z "$TC_PROJECT_DIR" ]; then
+ echo "CoreAPI project directory can't be found. `basename $0` exitting..."
+ exit 1
+fi
+
+_tcbuild () {
+ local cur
+ cur=${COMP_WORDS[$COMP_CWORD]}
+ if [ $COMP_CWORD -eq 1 ]; then
+ COMPREPLY=( $( compgen -W "addmod build install rmmod" -- $cur ) )
+ else #if [ $COMP_CWORD -eq 2 ]; then
+ COMPREPLY=( $( cd $TC_PROJECT_DIR/src; compgen -d -X "common" -- $cur ) )
+ fi
+ return 0
+}
+
+complete -F _tcbuild tcbuild
--- /dev/null
+#!/bin/bash
+
+PROJECT_DIR="$(cd "$(dirname $0)" && cd .. && pwd)"
+
+ln -s $PROJECT_DIR/scripts/tcbuild.sh $PROJECT_DIR/tcbuild
+
+echo "" >> $HOME/.bashrc
+echo "# CoreAPI-tests convenience helpers" >> $HOME/.bashrc
+echo "export TC_PROJECT_DIR=\"$PROJECT_DIR\"" >> $HOME/.bashrc
+echo "source $PROJECT_DIR/scripts/autocompletion.sh" >> $HOME/.bashrc
--- /dev/null
+#!/bin/bash
+
+USAGE=$(cat <<EOF
+Usage note: retriever.sh [option] [directory]
+Options:
+ none retrieve TC names with corresponding startup and cleanup functions
+ -f retrieveve TC name with corresponding "set" and "purpose" clauses
+ -anum retrieve automatic TC number
+ -mnum retrieve manual TC number
+
+In case of TC in form of "int tc_name()" script will abort.
+("int tc_name(void)" is a proper function signature)
+EOF
+)
+
+function get_tc_files {
+ CMAKE_FILE="$DIR/CMakeLists.txt"
+ if [ ! -e $CMAKE_FILE ]; then
+ echo "File $CMAKE_FILE not found. Aborting..."
+ exit 1
+ fi
+
+ TC_FILES=$(cat $CMAKE_FILE | awk -vDIR="$DIR" '
+ BEGIN {
+ flag = 0;
+ files = "";
+ }
+ /^SET\(TC_SOURCES/ {
+ flag = 1;
+ next;
+ }
+ /\)/ {
+ if (flag == 1)
+ exit;
+ }
+ !/^ *#/ {
+ if (flag == 1) {
+ if (files == "")
+ files = DIR "/" $1;
+ else
+ files = files " " DIR "/" $1;
+ }
+ }
+ END {
+ print files;
+ }')
+}
+
+function tc_names {
+ if [[ -z "$1" ]]; then
+ exit
+ fi
+
+ awk '
+ BEGIN {
+ OFS = ",";
+ start_fun = "NULL";
+ clean_fun = "NULL";
+ err_flag = 0;
+ tc_list = "";
+ }
+ /^void .*startup\(void\)/ {
+ gsub(/^void /, "");
+ gsub(/\(void\)$/,"");
+ start_fun = $0
+ }
+ /^void .*cleanup\(void\)/ {
+ gsub(/^void /, "");
+ gsub(/\(void\)$/,"");
+ clean_fun = $0
+ }
+ /^int .*\(\)/ {
+ print "Warning: function with empty argument list -- \"" $0 "\" in " FILENAME ":" FNR;
+ err_flag = 1;
+ }
+ /^int .*\(void\)/ {
+ gsub(/^int /, "");
+ gsub(/\(void\).*/,"");
+ if (tc_list != "") tc_list = tc_list "\n";
+ tc_list = tc_list $0 OFS start_fun OFS clean_fun
+ }
+ END {
+ if (err_flag) {
+ exit 1
+ } else {
+ print tc_list
+ }
+ }
+ ' $*
+}
+
+function tc_anum {
+ awk '
+ BEGIN {
+ count = 0;
+ err_flag = 0;
+ }
+ /^int .*\(\)/ {
+ print "Warning: function with empty argument list -- \"" $0 "\" in " FILENAME ":" FNR;
+ err_flag = 1;
+ }
+ /^int .*\(void\)$/ {
+ count++;
+ }
+ END {
+ if (err_flag) {
+ exit 1
+ } else {
+ print count
+ }
+ }
+ ' $*
+}
+
+function tc_mnum {
+ # TODO: fix this hardcoded value
+ echo 0
+}
+
+function tc_fullinfo {
+ awk '
+ BEGIN {
+ OFS=",";
+ purpose = "";
+ set = "default";
+ err_flag = 0;
+ tc_list = "";
+ }
+ /^\/\/& set:/ {
+ set = $3;
+ next;
+ }
+ /^\/\/& purpose:/ {
+ purpose = $3;
+ for (i = 4; i <= NF; i++) {
+ purpose = purpose " " $i;
+ }
+ next;
+ }
+ /^int .*\(\)/ {
+ print "Warning: function with empty argument list -- \"" $0 "\" in " FILENAME ":" FNR;
+ err_flag = 1;
+ }
+ /^int .*\(void\)$/ {
+ gsub(/^int /, "");
+ gsub(/\(void\)$/,"");
+ if (tc_list != "") tc_list = tc_list "\n";
+ tc_list = tc_list $0 OFS set OFS purpose;
+ purpose = "";
+ next
+ }
+ END {
+ if (err_flag) {
+ exit 1
+ } else {
+ print tc_list
+ }
+ }
+ ' $*
+}
+
+
+# usage note and exit:
+# - argument begin with '-' but is not recognised or number of arguments is > 2,
+# - argument doesn't begin with '-' and number of arguments is > 1
+if [[ ( "$1" == -* && ( ! "$1" =~ ^-(anum|mnum|f)$ || $# > 2 ) ) || ( "$1" != -* && $# > 1 ) ]]; then
+ echo -e "$USAGE"
+ exit 1
+fi
+
+
+# get directory from last argument (or assume current one)
+if [[ ! "$1" =~ ^-(anum|mnum|f)$ ]]; then
+ DIR=${1:-.}
+else
+ DIR=${2:-.}
+fi
+
+
+# populate $TC_FILES with files declared in CMakeLists.txt
+get_tc_files $DIR
+if [ $? != 0 ]; then
+ exit 1
+fi
+
+
+# run appropriate subcommand
+case "$1" in
+ -anum)
+ tc_anum $TC_FILES ;;
+ -mnum)
+ tc_mnum $TC_FILES ;;
+ -f)
+ tc_fullinfo $TC_FILES ;;
+ *)
+ tc_names $TC_FILES ;;
+esac
--- /dev/null
+#!/usr/bin/perl
+
+use strict;
+use XML::Parser;
+use Encode;
+use Getopt::Long;
+use Cwd;
+
+my $pwd = getcwd;
+my $num_tests=0;
+my $num_passes=0;
+my $num_actual_passes=0;
+my $text = "";
+
+sub handle_start
+{
+ my ($p, $elt, %attrs) = @_;
+
+ if($elt =~ /testcase/)
+ {
+ $num_tests++;
+ if($attrs{"result"} eq "PASS")
+ {
+ $num_passes++;
+ }
+ }
+ if($elt =~ /actual_result/)
+ {
+ $text = "";
+ }
+}
+
+sub handle_end
+{
+ my ($p, $elt) = @_;
+ if($elt =~ /actual_result/)
+ {
+ if($text eq "PASS")
+ {
+ $num_actual_passes++;
+ }
+ $text = "";
+ }
+}
+
+sub handle_char
+{
+ my ($p, $str) = @_;
+ $text .= $str;
+}
+
+my($parser) = new XML::Parser(Handlers => {Start => \&handle_start,
+ End => \&handle_end,
+ Char => \&handle_char});
+
+
+# Write summary.xml:
+open SUMMARY, ">summary.xml" || die "Can't open summary.xml for writing:$!\n";
+print SUMMARY << "EOS";
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="./style/summary.xsl"?>
+<result_summary plan_name="Core">
+ <other xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string" />
+ <summary test_plan_name="Empty test_plan_name">
+ <start_at>2014-03-21_18_52_41</start_at>
+ <end_at>2014-03-21_18_57_54</end_at>
+ </summary>
+EOS
+
+my $output_files = `ls tct*core-tests.xml`;
+my $file;
+foreach $file (split /\s+/, $output_files )
+{
+ $num_tests=0;
+ $num_passes=0;
+ $num_actual_passes=0;
+ $text = "";
+
+ $parser->parsefile($file);
+
+ my $pass_rate = sprintf("%5.2f", $num_passes * 100.0 / $num_tests);
+ my $num_fails = $num_tests - $num_passes;
+ my $fail_rate = sprintf("%5.2f", $num_fails * 100.0 / $num_tests);
+
+ my $suite_name = $file;
+ $suite_name =~ s/\.xml$//;
+
+print SUMMARY << "EOS2";
+ <suite name="$suite_name">
+ <total_case>$num_tests</total_case>
+ <pass_case>$num_passes</pass_case>
+ <pass_rate>$pass_rate</pass_rate>
+ <fail_case>$num_fails</fail_case>
+ <fail_rate>$fail_rate</fail_rate>
+ <block_case>0</block_case>
+ <block_rate>0.00</block_rate>
+ <na_case>0</na_case>
+ <na_rate>0.00</na_rate>
+ </suite>
+EOS2
+}
+
+print SUMMARY "</result_summary>\n";
+close SUMMARY;
--- /dev/null
+#!/bin/bash
+
+#---------- DEBUG_BEGIN ----------
+#ARG="-d" # debug-on flag, might be set as $1
+# keyprompt "introductory message" -- wait until any key pressed
+function keyprompt { echo -ne "\n\e[1;31m$1 -- " && read -n 1 && echo -e "\n\e[0m"; }
+# d_bp -- breakpoint at which user need to press any key to proceed
+function d_bp { if [[ "$ARG" == "-d" ]]; then keyprompt "d >> Press any key"; fi }
+# d_showVar VARNAME -- print bash variable name
+function d_showVar { if [ "$ARG" == "-d" -a -n "$1" ]; then echo "d >> ${1} = ${!1}"; fi }
+# d_print "message" -- print a debug message
+function d_print { if [ "$ARG" == "-d" -a -n "$1" ]; then echo -e "d >> $1"; fi }
+#---------- DEBUG_END ----------
+
+PROJECT_DIR="$(cd "$(dirname $0)" && pwd)"
+d_showVar PROJECT_DIR
+
+function gbs_profile {
+perl -e "
+use Config::Tiny;
+my \$Config = Config::Tiny->read( \"\$ENV{HOME}/.gbs.conf\" );
+my \$profile = \$Config->{general}->{profile};
+\$profile =~ s/profile.//;
+print \$profile;"
+}
+
+PROFILE=`gbs_profile`
+RPM_DIR="$HOME/GBS-ROOT/local/repos/$PROFILE/armv7l/RPMS"
+d_showVar RPM_DIR
+
+function add_module {
+ # argument check
+ if [ -z "$1" ]; then echo "Usage: `basename $0` addmod <module_name> [module_lib_name]"; exit 1; fi
+
+ MODULE_NAME=$1
+ d_showVar MODULE_NAME
+ MODULE_NAME_C=$(echo $MODULE_NAME | sed -e 's/-\([a-z]\)/\U\1/' -e 's/^\([a-z]\)/\U\1/')
+ d_showVar MODULE_NAME_C
+ MODULE_NAME_U=$(echo $MODULE_NAME | sed -e 's/-/_/')
+ d_showVar MODULE_NAME_U
+# MODULE_LIBNAME=${2:-capi-$MODULE_NAME}
+ MODULE_LIBNAME=$1
+ d_showVar MODULE_LIBNAME
+
+ echo "Adding $MODULE_NAME module to project..."
+ d_bp
+ cd $PROJECT_DIR
+ # prepare .spec file
+ echo "-- Generating packaging/core-$MODULE_NAME-tests.spec file"
+ if [ ! -d packaging ]; then mkdir packaging; fi
+ sed -e "s:\[MODULE_NAME\]:$MODULE_NAME:g" -e "s:\[MODULE_LIBNAME\]:$MODULE_LIBNAME:g" \
+ templates/core-\[module_name\]-tests.spec > packaging/core-$MODULE_NAME-tests.spec
+ # prepare src directory
+ mkdir src/$MODULE_NAME
+ echo "-- Generating src/$MODULE_NAME/CMakeLists.txt file"
+ sed -e "s:%{MODULE_NAME}:$MODULE_NAME:g" -e "s:%{MODULE_LIBNAME}:$MODULE_LIBNAME:g" \
+ templates/src-directory/CMakeLists.txt > src/$MODULE_NAME/CMakeLists.txt
+ echo "-- Generating src/$MODULE_NAME/tct-$MODULE_NAME-core.c file"
+ sed -e "s:%{MODULE_NAME}:$MODULE_NAME:g" \
+ templates/src-directory/tct-\[module_name\]-core.c > src/$MODULE_NAME/tct-$MODULE_NAME-core.c
+ echo "-- Generating src/$MODULE_NAME/utc-$MODULE_NAME.c file"
+ sed -e "s:%{MODULE_NAME_U}:$MODULE_NAME_U:g" -e "s:%{MODULE_NAME_C}:$MODULE_NAME_C:g" \
+ templates/src-directory/utc-\[module_name\].c > src/$MODULE_NAME/utc-$MODULE_NAME.c
+ echo "Task finished successfully"
+}
+
+function rm_module {
+ # argument check
+ if [ -z "$1" ]; then echo "Usage: `basename $0` rmmod <module_name>"; exit 1; fi
+
+ MODULE_NAME=$1
+ d_showVar MODULE_NAME
+
+ echo "Removing $MODULE_NAME module from project..."
+ d_bp
+ echo "---- Updating /opt/tct/packages/package_list.xml"
+ scripts/tcpackageslistsgen.sh $MODULE_NAME /opt/tct/packages/package_list.xml 1
+ if [ $? -ne 0 ]; then echo "Aborting..."; exit 1; fi
+ # echo "---- Updating test plans"
+ # scripts/tcpackageslistsgen.sh $MODULE_NAME /opt/tct/manager/plan/*.xml 1
+ # if [ $? -ne 0 ]; then echo "Aborting..."; exit 1; fi
+
+ cd $PROJECT_DIR
+ echo "-- Removing packaging/core-$MODULE_NAME-tests.spec file"
+ rm packaging/core-$MODULE_NAME-tests.spec
+ echo "-- Removing src/$MODULE_NAME directory"
+ rm -r src/$MODULE_NAME
+ echo "Task finished successfully"
+}
+
+function build {
+ if [ -n "$1" ]; then
+ (cd src/$1; ../../scripts/tcheadgen.sh tct-$1-core.h)
+ if [ $? -ne 0 ]; then echo "Aborting..."; exit 1; fi
+ cp packaging/core-$1-tests.spec ../packaging
+ gbs build -A armv7l --spec core-$1-tests.spec --include-all --keep-packs | \
+ tee build.log | stdbuf -o0 sed -e 's/error:/\x1b[1;91m&\x1b[0m/' \
+ -e 's/warning:/\x1b[93m&\x1b[0m/'
+ rm ../packaging/core-$1-tests.spec
+ else
+ echo "Build requires a module name"
+ exit 1
+ fi
+}
+
+function inst {
+ if [ -z "$1" ]
+ then
+ for mod in `ls -1 src/ | grep -v CMakeLists`
+ do
+
+ if [ $mod != 'common' ] && [ $mod != 'manual' ]; then
+
+ PKG_NAME="core-$mod-tests"
+ d_showVar PKG_NAME
+ VER=$(cat packaging/$PKG_NAME.spec | awk '/^Version:/ { print $2; exit; }')
+ d_showVar VER
+ PKG_VNAME="$PKG_NAME-$VER"
+ d_showVar PKG_VNAME
+ PKG_FNAME="$PKG_VNAME-0.armv7l.rpm"
+ d_showVar PKG_FNAME
+
+ if [ -f "$RPM_DIR/$PKG_FNAME" ]
+ then
+ inst $mod
+ echo ""
+ fi
+ fi
+ done
+ else
+ cd $PROJECT_DIR
+ # setting variables
+ MOD_NAME="$1"
+ d_showVar MOD_NAME
+ PKG_NAME="core-$MOD_NAME-tests"
+ d_showVar PKG_NAME
+ VER=$(cat packaging/$PKG_NAME.spec | awk '/^Version:/ { print $2; exit; }')
+ d_showVar VER
+ PKG_VNAME="$PKG_NAME-$VER"
+ d_showVar PKG_VNAME
+ PKG_FNAME="$PKG_VNAME-0.armv7l.rpm"
+ d_showVar PKG_FNAME
+ TCT_DIR="opt/tct-$MOD_NAME-core-tests"
+ d_showVar TCT_DIR
+
+ echo "Deploying $MOD_NAME suite to tct-mgr..."
+ d_bp
+ # prepare tct directory and files
+ echo "-- Preparing suite .zip file..."
+ echo "---- Creating /tmp/$TCT_DIR directory"
+ rm -r /tmp/opt > /dev/null 2>&1
+ mkdir -p /tmp/$TCT_DIR
+ # README
+ echo "---- Copying /tmp/$TCT_DIR"
+ cp templates/tct-package/README /tmp/$TCT_DIR
+ # rpm
+ echo "---- Copying /tmp/$TCT_DIR package"
+ cp $RPM_DIR/$PKG_FNAME /tmp/$TCT_DIR
+ if [ $? -ne 0 ]; then echo "Aborting..."; exit 1; fi
+ # inst.sh
+ echo "---- Generating /tmp/$TCT_DIR/inst.sh file"
+ sed -e "s:%{PKG_NAME}:\"$PKG_NAME\":g" -e "s:%{PKG_FULLNAME}:\"$PKG_FNAME\":g" \
+ -e "s:%{PKG_DIR}:\"/opt/usr/media/tct/$TCT_DIR\":g" \
+ templates/tct-package/inst.sh > /tmp/$TCT_DIR/inst.sh
+ chmod a+x /tmp/$TCT_DIR/inst.sh
+ # tests.xml
+ echo "---- Generating /tmp/$TCT_DIR"
+ scripts/tctestsgen.sh $MOD_NAME /tmp/$TCT_DIR target
+ if [ $? -ne 0 ]; then echo "Aborting..."; exit 1; fi
+ # zip
+ echo "---- Preparing /tmp/tct/packages/tct-$MOD_NAME-core-tests-2.2.1-1.zip file"
+ # clear old zips
+ rm -r /tmp/tct/packages > /dev/null 2>&1
+ mkdir -p /tmp/tct/packages
+ # create new zip
+ ( cd /tmp; zip -r /tmp/tct/packages/tct-$MOD_NAME-core-tests-2.2.1-1.zip opt > /dev/null 2>&1; )
+ # deployment
+ echo "-- Suite deployment..."
+ echo "---- Copying /opt/tct/packages/tct-$MOD_NAME-core-tests-2.2.1-1.zip"
+ cp /tmp/tct/packages/tct-$MOD_NAME-core-tests-2.2.1-1.zip /opt/tct/packages/
+ echo "---- Updating /opt/tct/packages/package_list.xml"
+ scripts/tcpackageslistsgen.sh $MOD_NAME /opt/tct/packages/package_list.xml 0
+ if [ $? -ne 0 ]; then echo "Aborting..."; exit 1; fi
+ # echo "---- Updating test plans"
+ # for file in `grep -r tct-$MOD_NAME-core-tests /opt/tct/manager/plan/ | cut -d: -f1 | uniq`
+ # do
+ # scripts/tcpackageslistsgen.sh $MOD_NAME $file
+ # done
+ # scripts/tcpackageslistsgen.sh $MOD_NAME /opt/tct/manager/plan/Full_test.xml
+ # if [ $? -ne 0 ]; then echo "Aborting..."; exit 1; fi
+ echo "Task finished successfully"
+ fi
+}
+
+if [ -z "$1" ]; then
+ # usage note
+ echo "Usage: `basename $0` <addmod|rmmod|build|install> <module_name> [module_lib_name]"
+ exit 1
+elif [ "addmod" == "$1" ]; then
+ # add new module
+ add_module $2 $3
+elif [ "rmmod" == "$1" ]; then
+ # remove module
+ rm_module $2
+elif [ "build" == "$1" ]; then
+ # build the binary
+ build $2
+elif [ "install" == "$1" ]; then
+ # install
+ inst $2
+else
+ echo "Invalid subcommand: $1"
+fi
--- /dev/null
+#!/bin/bash
+
+if [[ -z $1 ]]; then
+ echo "Usage note: tcheadgen.sh <header_filename.h>"
+ exit 1
+fi
+
+FILE="$PWD/$1"
+TFILE="/tmp/retr.csv"
+HEADER_NAME=$(echo $1 | tr '[:lower:]' '[:upper:]' | sed -e 's/-/_/g' -e 's/\./_/')
+SCRIPT_DIR="$(cd "$(dirname $0)" && pwd)"
+
+$SCRIPT_DIR/retriever.sh > $TFILE
+if [ $? -ne 0 ]; then cat $TFILE; exit 1; fi
+awk -F',' -v HEADER_NAME="$HEADER_NAME" '
+ BEGIN {
+ OFS = ", ";
+
+ startup_counter = 0;
+ startup_list[0] = "";
+
+ cleanup_counter = 0;
+ cleanup_list[0] = "";
+
+ testcase_counter = 0;
+ testcase_list[0] = "";
+
+ tc_array_counter = 0;
+ tc_array_list[0] = "";
+
+print "#ifndef __" HEADER_NAME "__"
+print "#define __" HEADER_NAME "__"
+print ""
+print "#include \"testcase.h\""
+print ""
+ }
+ {
+ testcase_list[testcase_counter++] = $1;
+
+ if (startup_counter == 0 || startup_list[startup_counter-1] != $2)
+ startup_list[startup_counter++] = $2;
+
+ if (startup_counter == 0 || cleanup_list[cleanup_counter-1] != $3)
+ cleanup_list[cleanup_counter++] = $3;
+
+ tc_array_list[tc_array_counter++] = "\"" $1 "\", " $1 ", " $2 ", " $3;
+ }
+ END {
+ sc_count = (startup_counter > cleanup_counter) ? startup_counter : cleanup_counter;
+ for (i = 0; i < sc_count; i++) {
+ if (i < startup_counter && startup_list[i] != "NULL")
+print "extern void " startup_list[i] "(void);"
+ if (i < cleanup_counter && cleanup_list[i] != "NULL")
+print "extern void " cleanup_list[i] "(void);"
+ }
+
+print ""
+ for (i = 0; i < testcase_counter; i++)
+print "extern int " testcase_list[i] "(void);"
+
+print ""
+print "testcase tc_array[] = {"
+
+ for (i = 0; i < tc_array_counter; i++)
+print " {" tc_array_list[i] "},"
+
+print " {NULL, NULL}"
+print "};"
+print ""
+print "#endif // __" HEADER_NAME "__"
+}' $TFILE > $FILE
--- /dev/null
+#!/bin/bash
+
+if [ -z $1 -o -z $2 ]; then
+ echo "Usage note: tcpackageslistsgen.sh <module_name> <output_file.xml>"
+ exit 1
+fi
+
+MODULE_NAME=$1
+FILE=$2
+if [ ! -f $FILE ]; then
+ echo "No such file: $2"
+ exit
+fi
+SCRIPT_DIR="$(cd "$(dirname $0)" && pwd)"
+AUTO_NUM=$(cd $SCRIPT_DIR/..; scripts/retriever.sh -anum src/$MODULE_NAME)
+if [ $? -ne 0 ]; then echo $AUTO_NUM; exit 1; fi
+MAN_NUM=$(cd $SCRIPT_DIR/..; scripts/retriever.sh -mnum src/$MODULE_NAME)
+if [ $? -ne 0 ]; then echo $MAN_NUM; exit 1; fi
+
+TFILE="/tmp/tempfile.xml"
+if [ -f $TFILE ]; then
+ rm $TFILE
+fi
+
+function regen {
+ awk -v RS='\r\n' -v ORS='\r\n' -v MODULE_NAME=$MODULE_NAME -v AUTO_NUM=$AUTO_NUM -v MAN_NUM=$MAN_NUM '
+ BEGIN {
+ found = 0;
+ replaced = 0;
+ }
+ $0 ~ "<suite name=\"tct-" MODULE_NAME "-core-tests\" category=\"Core APIs\">" {
+ found = 1;
+ next
+ }
+ /<\/suite>/ {
+ if (found == 1) {
+print " <suite name=\"tct-" MODULE_NAME "-core-tests\" category=\"Core APIs\">";
+print " <auto_tcn>" AUTO_NUM "</auto_tcn>";
+print " <manual_tcn>" MAN_NUM "</manual_tcn>";
+print " <total_tcn>" AUTO_NUM+MAN_NUM "</total_tcn>";
+print " <pkg_name>tct-" MODULE_NAME "-core-tests-2.2.1-1.zip</pkg_name>";
+print " </suite>";
+ found = 0;
+ replaced = 1;
+ } else {
+ print $0;
+ }
+ next
+ }
+ /<\/ns3:testplan>/ {
+ if (replaced == 0) {
+print " <suite name=\"tct-" MODULE_NAME "-core-tests\" category=\"Core APIs\">";
+print " <auto_tcn>" AUTO_NUM "</auto_tcn>";
+print " <manual_tcn>" MAN_NUM "</manual_tcn>";
+print " <total_tcn>" AUTO_NUM+MAN_NUM "</total_tcn>";
+print " <pkg_name>tct-" MODULE_NAME "-core-tests-2.2.1-1.zip</pkg_name>";
+print " </suite>";
+print $0
+ } else {
+ print $0
+ }
+ next
+ }
+ {
+ if (found == 0) {
+ print $0;
+ }
+ }' $FILE > $TFILE
+ cat $TFILE > $FILE
+}
+
+regen
--- /dev/null
+#!/bin/bash
+
+if [[ -z $1 ]]; then
+ echo "Usage note: tctestsgen.sh <module_name>"
+ exit 1
+fi
+
+MODULE_NAME=$1
+MODULE_NAME_C=$(echo $MODULE_NAME | sed -e 's/-\([a-z]\)/\U\1/' -e 's/^\([a-z]\)/\U\1/')
+SCRIPT_DIR="$(cd "$(dirname $0)" && pwd)"
+TC_DIR="/opt/usr/bin/tct-$1-core"
+if [[ $3 == "desktop" ]] ; then
+ TC_DIR="build/src/$1"
+fi
+
+FILE="$2/tests.xml"
+if [ -a $FILE ]; then
+ rm $FILE
+fi
+TFILE="/tmp/tcs.csv"
+if [ -a $TFILE ]; then
+ rm $TFILE
+fi
+
+function gen {
+ awk -F',' -v MODULE_NAME=$MODULE_NAME -v MODULE_NAME_C=$MODULE_NAME_C -v TC_DIR=$TC_DIR '
+ BEGIN {
+ set = ""
+print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+print " <?xml-stylesheet type=\"text/xsl\" href=\"./testcase.xsl\"?>";
+print "<test_definition>";
+print " <suite name=\"tct-"MODULE_NAME"-core-tests\" category=\"Core APIs\">";
+ }
+ {
+ if (set != "" && set != $2) {
+print " </set>"
+ }
+
+ if (set != $2) {
+ set = $2;
+print " <set name=\"" set "\">";
+ }
+
+ tcname = $1;
+ tcpurpose = $3
+
+print " <testcase component=\"CoreAPI/" MODULE_NAME_C "/" set "\" execution_type=\"auto\" id=\"" tcname "\" purpose=\"" tcpurpose "\">";
+print " <description>";
+
+print " <test_script_entry test_script_expected_result=\"0\">" TC_DIR "/tct-" MODULE_NAME "-core " tcname "</test_script_entry>";
+print " </description>";
+print " </testcase>";
+ }
+ END {
+ if (set != "") {
+print " </set>"
+ }
+print " </suite>"
+print "</test_definition>"
+ }' $TFILE > $FILE
+}
+
+(cd $SCRIPT_DIR/..; scripts/retriever.sh -f src/$MODULE_NAME > ${TFILE}_pre)
+if [ $? -ne 0 ]; then cat ${TFILE}_pre; exit 1; fi
+cat ${TFILE}_pre | sort -t',' -k2,2 -s > $TFILE
+gen
--- /dev/null
+IF( DEFINED MODULE )
+ MESSAGE(STATUS "Building: ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE}")
+ ADD_SUBDIRECTORY(${MODULE})
+ELSE( DEFINED MODULE )
+ MESSAGE(FATAL_ERROR "No module selected to build. Aborting...")
+ENDIF( DEFINED MODULE )
--- /dev/null
+#ifndef _ASSERT_H_
+#define _ASSERT_H_
+#include <stdio.h>
+#include <stdlib.h>
+
+#define assert(exp) \
+ if (!(exp)) { \
+ fprintf(stderr, \
+ "Assert fail in %s:%d\n", __FILE__, __LINE__); \
+ fprintf(stderr, \
+ "Following expression is not true:\n" \
+ "%s\n", #exp); \
+ return 1; \
+ }
+
+#define assert_eq(var, ref) \
+ if (var != ref) { \
+ fprintf(stderr, \
+ "Assert fail in %s:%d\n", __FILE__, __LINE__); \
+ fprintf(stderr, \
+ "Values \"%s\" and \"%s\" are not equal:\n" \
+ "%s == %d, %s == %d\n", \
+ #var, #ref, #var, (int)var, #ref, (int)ref); \
+ return 1; \
+ }
+
+#define assert_neq(var, ref) \
+ if (var == ref) { \
+ fprintf(stderr, \
+ "Assert fail in %s:%d\n", __FILE__, __LINE__); \
+ fprintf(stderr, \
+ "Values \"%s\" and \"%s\" are equal:\n" \
+ "%s == %s == %d\n", \
+ #var, #ref, #var, #ref, (int)ref); \
+ return 1; \
+ }
+
+#define assert_gt(var, ref) \
+ if (var <= ref) { \
+ fprintf(stderr, \
+ "Assert fail in %s:%d\n", __FILE__, __LINE__); \
+ fprintf(stderr, \
+ "Value \"%s\" is not greater than \"%s\":\n" \
+ "%s == %d, %s == %d\n", \
+ #var, #ref, #var, var, #ref, ref); \
+ return 1; \
+ }
+
+#define assert_geq(var, ref) \
+ if (var < ref) { \
+ fprintf(stderr, \
+ "Assert fail in %s:%d\n", __FILE__, __LINE__); \
+ fprintf(stderr, \
+ "Value \"%s\" is not greater or equal to \"%s\":\n" \
+ "%s == %d, %s == %d\n", \
+ #var, #ref, #var, var, #ref, ref); \
+ return 1; \
+ }
+
+#define assert_lt(var, ref) \
+ if (var >= ref) { \
+ fprintf(stderr, \
+ "Assert fail in %s:%d\n", __FILE__, __LINE__); \
+ fprintf(stderr, \
+ "Value \"%s\" is not lower than \"%s\":\n" \
+ "%s == %d, %s == %d\n", \
+ #var, #ref, #var, var, #ref, ref); \
+ return 1; \
+ }
+
+#define assert_leq(var, ref) \
+ if (var > ref) { \
+ fprintf(stderr, \
+ "Assert fail in %s:%d\n", __FILE__, __LINE__); \
+ fprintf(stderr, \
+ "Value \"%s\" is not lower or equal to \"%s\":\n" \
+ "%s == %d, %s == %d\n", \
+ #var, #ref, #var, var, #ref, ref); \
+ return 1; \
+ }
+
+#endif // _ASSERT_H_
--- /dev/null
+#ifndef _TESTCASE_H_
+#define _TESTCASE_H_
+
+/* pointer to startup/cleanup functions */
+typedef void (*void_fun_ptr)(void);
+
+/* pointer to testcase functions */
+typedef int (*tc_fun_ptr)(void);
+
+/* struct describing specific testcase */
+typedef struct testcase_s {
+ const char* name;
+ tc_fun_ptr function;
+ void_fun_ptr startup;
+ void_fun_ptr cleanup;
+} testcase;
+
+#endif // _TESTCASE_H_
--- /dev/null
+SET(PKG_NAME "dali-internal")
+
+SET(EXEC_NAME "tct-${PKG_NAME}-core")
+SET(RPM_NAME "core-${PKG_NAME}-tests")
+
+SET(CAPI_LIB "dali-internal")
+
+SET(TC_SOURCES
+ utc-Dali-ImageFactory.cpp
+ utc-Dali-Material.cpp
+ utc-DaliInternal-Font.cpp
+ utc-DaliInternal-ResourceClient.cpp
+)
+
+LIST(APPEND TC_SOURCES
+ ../dali/dali-test-suite-utils/dali-test-suite-utils.cpp
+ ../dali/dali-test-suite-utils/test-application.cpp
+ ../dali/dali-test-suite-utils/test-gesture-manager.cpp
+ ../dali/dali-test-suite-utils/test-gl-abstraction.cpp
+ ../dali/dali-test-suite-utils/test-gl-sync-abstraction.cpp
+ ../dali/dali-test-suite-utils/test-native-image.cpp
+ ../dali/dali-test-suite-utils/test-platform-abstraction.cpp
+ ../dali/dali-test-suite-utils/test-render-controller.cpp
+ ../dali/dali-test-suite-utils/test-trace-call-stack.cpp
+ ../dali-unmanaged/dali-test-suite-utils/mesh-builder.cpp
+)
+
+PKG_CHECK_MODULES(${CAPI_LIB} REQUIRED
+ dali-core
+)
+
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -ggdb --coverage")
+
+FOREACH(directory ${${CAPI_LIB}_LIBRARY_DIRS})
+ SET(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -L${directory}")
+ENDFOREACH(directory ${CAPI_LIB_LIBRARY_DIRS})
+
+INCLUDE_DIRECTORIES(
+ ${${CAPI_LIB}_INCLUDE_DIRS}
+ ../dali/dali-test-suite-utils
+ ../dali-unmanaged/dali-test-suite-utils
+ ../../..
+)
+
+ADD_EXECUTABLE(${EXEC_NAME} ${EXEC_NAME}.cpp ${TC_SOURCES})
+TARGET_LINK_LIBRARIES(${EXEC_NAME}
+ ${${CAPI_LIB}_LIBRARIES}
+)
+
+INSTALL(PROGRAMS ${EXEC_NAME}
+ DESTINATION ${BIN_DIR}/${EXEC_NAME}
+)
--- /dev/null
+#include <stdio.h>
+#include <string.h>
+#include "tct-dali-internal-core.h"
+
+int main(int argc, const char *argv[])
+{
+ int result = -1;
+ int i;
+
+ if (argc != 2) {
+ printf("Usage: %s <testcase name>\n", argv[0]);
+ return 2;
+ }
+
+ for (i = 0; tc_array[i].name; i++) {
+ if (!strcmp(argv[1], tc_array[i].name)) {
+ if (tc_array[i].startup)
+ tc_array[i].startup();
+
+ result = tc_array[i].function();
+
+ if (tc_array[i].cleanup)
+ tc_array[i].cleanup();
+
+ return result;
+ }
+ }
+
+ printf("Unknown testcase name: \"%s\"\n", argv[1]);
+ return 2;
+}
--- /dev/null
+#ifndef __TCT_DALI_INTERNAL_CORE_H__
+#define __TCT_DALI_INTERNAL_CORE_H__
+
+#include "testcase.h"
+
+extern void utc_dali_material_startup(void);
+extern void utc_dali_material_cleanup(void);
+
+extern int UtcDaliImageFactoryUseCachedRequest01(void);
+extern int UtcDaliImageFactoryUseCachedRequest02(void);
+extern int UtcDaliImageFactoryUseCachedRequest03(void);
+extern int UtcDaliImageFactoryUseCachedRequest04(void);
+extern int UtcDaliImageFactoryCompatibleResource01(void);
+extern int UtcDaliImageFactoryCompatibleResource02(void);
+extern int UtcDaliImageFactoryCompatibleResource03(void);
+extern int UtcDaliImageFactoryReload01(void);
+extern int UtcDaliImageFactoryReload02(void);
+extern int UtcDaliImageFactoryReload03(void);
+extern int UtcDaliImageFactoryReload04(void);
+extern int UtcDaliImageFactoryReload05(void);
+extern int UtcDaliImageFactoryReload06(void);
+extern int UtcDaliMaterialMethodNew01(void);
+extern int UtcDaliMaterialMethodNew02(void);
+extern int UtcDaliMaterialReadyTextureOffstage(void);
+extern int UtcDaliMaterialUnreadyTextureOffstage(void);
+extern int UtcDaliMaterialStaging01(void);
+extern int UtcDaliMaterialStaging02(void);
+extern int UtcDaliMaterialSetPropsWhilstStaged(void);
+extern int UtcDaliMaterialSetTextureWhilstStaged(void);
+extern int UtcDaliMaterialSetUnreadyTextureWhilstStaged(void);
+extern int UtcDaliMaterialIsOpaqueWithoutTexture(void);
+extern int UtcDaliMaterialIsOpaqueWithTexture(void);
+extern int UtcDaliMaterialIsOpaqueWithProps(void);
+extern int UtcDaliMaterialRender(void);
+extern int UtcDaliFontMeasureTextWidth(void);
+extern int UtcDaliFontMeasureTextWidthNegative(void);
+extern int UtcDaliFontMeasureTextHeight(void);
+extern int UtcDaliFontMeasureTextHeightNegative(void);
+extern int UtcDaliInternalRequestResourceBitmapRequests01(void);
+extern int UtcDaliInternalRequestResourceBitmapRequests02(void);
+extern int UtcDaliInternalRequestResourceBitmapRequests03(void);
+extern int UtcDaliInternalRequestReloadBitmapRequests01(void);
+extern int UtcDaliInternalRequestReloadBitmapRequests02(void);
+extern int UtcDaliInternalRequestReloadBitmapRequests03(void);
+extern int UtcDaliInternalSaveResource01(void);
+extern int UtcDaliInternalSaveResource02(void);
+extern int UtcDaliInternalSaveResource03(void);
+extern int UtcDaliInternalSaveResource04(void);
+extern int UtcDaliInternalSaveResource05(void);
+extern int UtcDaliInternalRequestResourceTicket01(void);
+extern int UtcDaliInternalRequestResourceTicket02(void);
+extern int UtcDaliInternalLoadShaderRequest01(void);
+extern int UtcDaliInternalLoadShaderRequest02(void);
+extern int UtcDaliInternalAllocateBitmapImage01(void);
+extern int UtcDaliInternalAddBitmapImage01(void);
+extern int UtcDaliInternalAddBitmapImage02(void);
+extern int UtcDaliInternalAddBitmapImage03(void);
+extern int UtcDaliInternalGetBitmapImage01(void);
+extern int UtcDaliInternalGetBitmapImage02(void);
+extern int UtcDaliInternalGetBitmapImage03(void);
+extern int UtcDaliInternalAllocateTexture01(void);
+extern int UtcDaliInternalAddNativeImage(void);
+extern int UtcDaliInternalAddFrameBufferImage(void);
+extern int UtcDaliInternalAllocateMesh01(void);
+
+testcase tc_array[] = {
+ {"UtcDaliImageFactoryUseCachedRequest01", UtcDaliImageFactoryUseCachedRequest01, NULL, NULL},
+ {"UtcDaliImageFactoryUseCachedRequest02", UtcDaliImageFactoryUseCachedRequest02, NULL, NULL},
+ {"UtcDaliImageFactoryUseCachedRequest03", UtcDaliImageFactoryUseCachedRequest03, NULL, NULL},
+ {"UtcDaliImageFactoryUseCachedRequest04", UtcDaliImageFactoryUseCachedRequest04, NULL, NULL},
+ {"UtcDaliImageFactoryCompatibleResource01", UtcDaliImageFactoryCompatibleResource01, NULL, NULL},
+ {"UtcDaliImageFactoryCompatibleResource02", UtcDaliImageFactoryCompatibleResource02, NULL, NULL},
+ {"UtcDaliImageFactoryCompatibleResource03", UtcDaliImageFactoryCompatibleResource03, NULL, NULL},
+ {"UtcDaliImageFactoryReload01", UtcDaliImageFactoryReload01, NULL, NULL},
+ {"UtcDaliImageFactoryReload02", UtcDaliImageFactoryReload02, NULL, NULL},
+ {"UtcDaliImageFactoryReload03", UtcDaliImageFactoryReload03, NULL, NULL},
+ {"UtcDaliImageFactoryReload04", UtcDaliImageFactoryReload04, NULL, NULL},
+ {"UtcDaliImageFactoryReload05", UtcDaliImageFactoryReload05, NULL, NULL},
+ {"UtcDaliImageFactoryReload06", UtcDaliImageFactoryReload06, NULL, NULL},
+ {"UtcDaliMaterialMethodNew01", UtcDaliMaterialMethodNew01, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMaterialMethodNew02", UtcDaliMaterialMethodNew02, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMaterialReadyTextureOffstage", UtcDaliMaterialReadyTextureOffstage, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMaterialUnreadyTextureOffstage", UtcDaliMaterialUnreadyTextureOffstage, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMaterialStaging01", UtcDaliMaterialStaging01, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMaterialStaging02", UtcDaliMaterialStaging02, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMaterialSetPropsWhilstStaged", UtcDaliMaterialSetPropsWhilstStaged, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMaterialSetTextureWhilstStaged", UtcDaliMaterialSetTextureWhilstStaged, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMaterialSetUnreadyTextureWhilstStaged", UtcDaliMaterialSetUnreadyTextureWhilstStaged, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMaterialIsOpaqueWithoutTexture", UtcDaliMaterialIsOpaqueWithoutTexture, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMaterialIsOpaqueWithTexture", UtcDaliMaterialIsOpaqueWithTexture, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMaterialIsOpaqueWithProps", UtcDaliMaterialIsOpaqueWithProps, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMaterialRender", UtcDaliMaterialRender, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliFontMeasureTextWidth", UtcDaliFontMeasureTextWidth, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliFontMeasureTextWidthNegative", UtcDaliFontMeasureTextWidthNegative, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliFontMeasureTextHeight", UtcDaliFontMeasureTextHeight, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliFontMeasureTextHeightNegative", UtcDaliFontMeasureTextHeightNegative, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalRequestResourceBitmapRequests01", UtcDaliInternalRequestResourceBitmapRequests01, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalRequestResourceBitmapRequests02", UtcDaliInternalRequestResourceBitmapRequests02, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalRequestResourceBitmapRequests03", UtcDaliInternalRequestResourceBitmapRequests03, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalRequestReloadBitmapRequests01", UtcDaliInternalRequestReloadBitmapRequests01, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalRequestReloadBitmapRequests02", UtcDaliInternalRequestReloadBitmapRequests02, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalRequestReloadBitmapRequests03", UtcDaliInternalRequestReloadBitmapRequests03, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalSaveResource01", UtcDaliInternalSaveResource01, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalSaveResource02", UtcDaliInternalSaveResource02, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalSaveResource03", UtcDaliInternalSaveResource03, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalSaveResource04", UtcDaliInternalSaveResource04, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalSaveResource05", UtcDaliInternalSaveResource05, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalRequestResourceTicket01", UtcDaliInternalRequestResourceTicket01, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalRequestResourceTicket02", UtcDaliInternalRequestResourceTicket02, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalLoadShaderRequest01", UtcDaliInternalLoadShaderRequest01, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalLoadShaderRequest02", UtcDaliInternalLoadShaderRequest02, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalAllocateBitmapImage01", UtcDaliInternalAllocateBitmapImage01, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalAddBitmapImage01", UtcDaliInternalAddBitmapImage01, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalAddBitmapImage02", UtcDaliInternalAddBitmapImage02, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalAddBitmapImage03", UtcDaliInternalAddBitmapImage03, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalGetBitmapImage01", UtcDaliInternalGetBitmapImage01, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalGetBitmapImage02", UtcDaliInternalGetBitmapImage02, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalGetBitmapImage03", UtcDaliInternalGetBitmapImage03, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalAllocateTexture01", UtcDaliInternalAllocateTexture01, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalAddNativeImage", UtcDaliInternalAddNativeImage, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalAddFrameBufferImage", UtcDaliInternalAddFrameBufferImage, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliInternalAllocateMesh01", UtcDaliInternalAllocateMesh01, utc_dali_material_startup, utc_dali_material_cleanup},
+ {NULL, NULL}
+};
+
+#endif // __TCT_DALI_INTERNAL_CORE_H__
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+// Internal headers are allowed here
+#include <dali/internal/event/common/thread-local-storage.h>
+#include <dali/internal/event/images/image-factory.h>
+#include <dali/internal/event/resources/resource-ticket.h>
+
+using namespace Dali;
+
+using Internal::ResourceTicketPtr;
+using Internal::ImageFactory;
+using Internal::ImageFactoryCache::RequestPtr;
+
+
+namespace
+{
+
+static const char* gTestImageFilename = "icon_wrt.png";
+
+static void EmulateImageLoaded( TestApplication& application, unsigned int width, unsigned int height )
+{
+ // emulate load success
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource( bitmap );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, width, height, width, height );
+ if( request )
+ {
+ application.GetPlatform().SetResourceLoaded( request->GetId(), request->GetType()->id, resource );
+ }
+
+ application.SendNotification();
+ application.Render();
+
+ application.SendNotification();
+ application.Render();
+}
+
+} //anonymous namespace
+
+
+// High-level test for image factory request cache
+int UtcDaliImageFactoryUseCachedRequest01(void)
+{
+ TestApplication application;
+
+ tet_infoline( "UtcDaliImageFactoryCachedRequest01 - Request same image more than once" );
+
+ Image image = Image::New( gTestImageFilename );
+
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+ application.GetPlatform().ResetTrace();
+
+ Image image2 = Image::New( gTestImageFilename );
+
+ application.SendNotification();
+ application.Render();
+
+ // check resource is not loaded twice
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+ application.GetPlatform().ResetTrace();
+
+ Image image3 = Image::New( gTestImageFilename );
+
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+ END_TEST;
+}
+
+// High-level test for image factory request cache
+int UtcDaliImageFactoryUseCachedRequest02(void)
+{
+ TestApplication application;
+
+ // testing resource deletion when taken off stage
+ tet_infoline( "UtcDaliImageFactoryCachedRequest02 - Discard previously requested resource" );
+
+ Image image = Image::New( gTestImageFilename, Image::Immediate, Image::Unused );
+ ImageActor actor = ImageActor::New( image );
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+ application.GetPlatform().ResetTrace();
+
+ // Add actor to stage
+ Stage::GetCurrent().Add( actor );
+
+ application.Render();
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+
+ // Release the resource, request is still cached
+ Stage::GetCurrent().Remove( actor );
+ application.Render();
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+
+ // Should find stale request in cache, so load image from filesystem
+ Image image2 = Image::New( gTestImageFilename );
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+ application.GetPlatform().ResetTrace();
+
+ // Resource is reloaded
+ Image image3 = Image::New( gTestImageFilename );
+
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+ END_TEST;
+}
+
+// Low-level test for image factory request cache
+int UtcDaliImageFactoryUseCachedRequest03(void)
+{
+ TestApplication application;
+ tet_infoline( "UtcDaliImageFactoryCachedRequest03 - Request same image more than once - Request Ids" );
+
+ ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory();
+
+ RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, NULL );
+ ResourceTicketPtr ticket = imageFactory.Load( req.Get() );
+
+ RequestPtr req2 = imageFactory.RegisterRequest( gTestImageFilename, NULL );
+ ResourceTicketPtr ticket2 = imageFactory.Load( req2.Get() );
+ DALI_TEST_EQUALS( req, req2, TEST_LOCATION );
+ DALI_TEST_EQUALS( ticket, ticket2, TEST_LOCATION );
+
+ req2 = imageFactory.RegisterRequest( gTestImageFilename, NULL );
+ ResourceTicketPtr ticket3 = imageFactory.Load( req2.Get() );
+ DALI_TEST_EQUALS( req, req2, TEST_LOCATION );
+ DALI_TEST_EQUALS( ticket, ticket3, TEST_LOCATION );
+
+ // request differs in scaled size - not default size
+ ImageAttributes attr = ImageAttributes::New( 80, 160, Pixel::BGR8888 );
+ req2 = imageFactory.RegisterRequest( gTestImageFilename, &attr );
+ ResourceTicketPtr ticket4 = imageFactory.Load( req2.Get() );
+ DALI_TEST_CHECK( req != req2 );
+ END_TEST;
+}
+
+// Low-level test for image factory request cache
+int UtcDaliImageFactoryUseCachedRequest04(void)
+{
+ TestApplication application;
+ tet_infoline( "UtcDaliImageFactoryCachedRequest04 - Request same image with different Image objects - Request Ids" );
+
+ ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory();
+
+ ImageAttributes attr = ImageAttributes::New( 80, 160, Pixel::BGR8888 );
+ RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, &attr );
+
+ ImageAttributes attr2 = ImageAttributes::New( 80, 160, Pixel::BGR8888 );
+ RequestPtr req2 = imageFactory.RegisterRequest( gTestImageFilename, &attr2 );
+ DALI_TEST_EQUALS( req, req2, TEST_LOCATION );
+ END_TEST;
+}
+
+// Different requests, compatible resource
+int UtcDaliImageFactoryCompatibleResource01(void)
+{
+ TestApplication application;
+ tet_infoline( "UtcDaliImageFactoryCompatibleResource01 - Two requests mapping to same resource" );
+
+ ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory();
+
+ Vector2 testSize(80.0f, 80.0f);
+ application.GetPlatform().SetClosestImageSize(testSize);
+
+ // request with default attributes ( size is 0,0 )
+ RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, NULL );
+ ResourceTicketPtr ticket = imageFactory.Load( req.Get() );
+
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+
+ // emulate load success
+ EmulateImageLoaded( application, 80, 80 );
+
+ ImageAttributes attr = ImageAttributes::New();
+ attr.SetSize( 80, 80 );
+ RequestPtr req2 = imageFactory.RegisterRequest( gTestImageFilename, &attr );
+ ResourceTicketPtr ticket2 = imageFactory.Load( req2.Get() );
+
+ DALI_TEST_CHECK( req != req2 ); // different requests
+ DALI_TEST_EQUALS( ticket->GetId(), ticket2->GetId(), TEST_LOCATION ); // same resource
+ END_TEST;
+}
+
+// Different requests, compatible resource
+int UtcDaliImageFactoryCompatibleResource02(void)
+{
+ TestApplication application;
+ tet_infoline( "UtcDaliImageFactoryCompatibleResource02 - Two requests mapping to same resource." );
+
+ ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory();
+
+ Vector2 testSize(80.0f, 80.0f);
+ application.GetPlatform().SetClosestImageSize(testSize);
+
+ // request with default attributes ( size is 0,0 )
+ RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, NULL );
+ ResourceTicketPtr ticket = imageFactory.Load( req.Get() );
+
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+
+ // emulate load success
+ EmulateImageLoaded( application, 80, 80 );
+
+ // Request bigger size than actual image.
+ // This will load the same resource.
+ // However if image size changes later on to eg. 512*512 (file is overwritten),
+ // reissuing these two requests will load different resources.
+ // See UtcDaliImageFactoryReload06
+ ImageAttributes attr = ImageAttributes::New();
+ attr.SetSize( 92, 92 );
+ RequestPtr req2 = imageFactory.RegisterRequest( gTestImageFilename, &attr );
+ ResourceTicketPtr ticket2 = imageFactory.Load( req2.Get() );
+
+ DALI_TEST_CHECK( req != req2 ); // different requests
+ DALI_TEST_EQUALS( ticket->GetId(), ticket2->GetId(), TEST_LOCATION ); // same resource
+ END_TEST;
+}
+
+// Different requests, compatible resource
+int UtcDaliImageFactoryCompatibleResource03(void)
+{
+ TestApplication application;
+ tet_infoline( "UtcDaliImageFactoryCompatibleResource03 - Two requests mapping to same resource" );
+
+ ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory();
+
+ Vector2 testSize(80.0f, 80.0f);
+ application.GetPlatform().SetClosestImageSize(testSize);
+
+ // this time use defined attributes, nut just NULL
+ ImageAttributes attr = ImageAttributes::New();
+ attr.SetSize( 120, 120 );
+
+ // request with default attributes ( size is 0,0 )
+ RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, &attr );
+ ResourceTicketPtr ticket = imageFactory.Load( req.Get() );
+
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+
+ // emulate load success
+ EmulateImageLoaded( application, 80, 80 );
+
+ ImageAttributes attr2 = ImageAttributes::New();
+ attr2.SetSize( 80, 80 );
+ RequestPtr req2 = imageFactory.RegisterRequest( gTestImageFilename, &attr2 );
+ ResourceTicketPtr ticket2 = imageFactory.Load( req2.Get() );
+
+ DALI_TEST_CHECK( req != req2 ); // different requests
+ DALI_TEST_EQUALS( ticket->GetId(), ticket2->GetId(), TEST_LOCATION ); // same resource
+ END_TEST;
+}
+
+// Test for reloading image
+int UtcDaliImageFactoryReload01(void)
+{
+ TestApplication application;
+ tet_infoline( "UtcDaliImageFactoryReload01 - Reload unchanged image" );
+
+ Vector2 testSize(80.0f, 80.0f);
+ application.GetPlatform().SetClosestImageSize(testSize);
+
+ ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory();
+
+ RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, NULL );
+ ResourceTicketPtr ticket = imageFactory.Load( req.Get() );
+
+ ResourceTicketPtr ticket2 = imageFactory.Reload( req.Get() );
+ DALI_TEST_EQUALS( ticket, ticket2, TEST_LOCATION );
+
+ ResourceTicketPtr ticket3 = imageFactory.Reload( req.Get() );
+ DALI_TEST_EQUALS( ticket, ticket3, TEST_LOCATION );
+ END_TEST;
+}
+
+// Testing file system access when reloading image
+int UtcDaliImageFactoryReload02(void)
+{
+ TestApplication application;
+ tet_infoline( "UtcDaliImageFactoryReload02 - Reload unchanged image" );
+
+ ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory();
+
+ Vector2 testSize(80.0f, 80.0f);
+ application.GetPlatform().SetClosestImageSize(testSize);
+
+ RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, NULL );
+ ResourceTicketPtr ticket = imageFactory.Load( req.Get() );
+
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+ application.GetPlatform().ResetTrace();
+
+ ResourceTicketPtr ticket2 = imageFactory.Reload( req.Get() );
+
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( ticket, ticket2, TEST_LOCATION );
+ // resource is still loading, do not issue another request
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+
+ // emulate load success
+ EmulateImageLoaded( application, 80, 80 );
+
+ ResourceTicketPtr ticket3 = imageFactory.Reload( req.Get() );
+
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( ticket, ticket3, TEST_LOCATION );
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+ application.GetPlatform().ResetTrace();
+
+ ticket3 = imageFactory.Reload( req.Get() );
+
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+ END_TEST;
+}
+
+// Test for reloading changed image
+int UtcDaliImageFactoryReload03(void)
+{
+ TestApplication application;
+ tet_infoline( "UtcDaliImageFactoryReload03 - Reload changed image" );
+
+ ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory();
+
+ Vector2 testSize( 80.0f, 80.0f );
+ application.GetPlatform().SetClosestImageSize( testSize );
+
+ RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, NULL );
+ ResourceTicketPtr ticket = imageFactory.Load( req.Get() );
+
+ application.SendNotification();
+ application.Render();
+
+ // emulate load success
+ EmulateImageLoaded( application, 80, 80 );
+
+ Vector2 newSize( 192.0f, 192.0f );
+ application.GetPlatform().SetClosestImageSize( newSize );
+
+ // Image file changed size, new resource request should be issued
+ ResourceTicketPtr ticket2 = imageFactory.Reload( req.Get() );
+ DALI_TEST_CHECK( ticket != ticket2 );
+
+ ResourceTicketPtr ticket3 = imageFactory.Reload( req.Get() );
+ DALI_TEST_EQUALS( ticket2, ticket3, TEST_LOCATION );
+ END_TEST;
+}
+
+// Testing file system access when reloading image
+int UtcDaliImageFactoryReload04(void)
+{
+ TestApplication application;
+ tet_infoline( "UtcDaliImageFactoryReload04 - Reload unchanged image" );
+
+ ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory();
+
+ Vector2 testSize(80.0f, 80.0f);
+ application.GetPlatform().SetClosestImageSize(testSize);
+
+ RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, NULL );
+ ResourceTicketPtr ticket = imageFactory.Load( req.Get() );
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+ application.GetPlatform().ResetTrace();
+
+ ResourceTicketPtr ticket2 = imageFactory.Reload( req.Get() );
+
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( ticket, ticket2, TEST_LOCATION );
+ // resource is still loading, do not issue another request
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+
+ // emulate load success
+ EmulateImageLoaded( application, 80, 80 );
+
+ ResourceTicketPtr ticket3 = imageFactory.Reload( req.Get() );
+
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+
+ // size didn't change, using same ticket
+ DALI_TEST_EQUALS( ticket, ticket3, TEST_LOCATION );
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+ application.GetPlatform().ResetTrace();
+
+ // still loading
+ ticket3 = imageFactory.Reload( req.Get() );
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+ END_TEST;
+}
+
+// Testing OnDemand + Reload
+// Reload should have no effect if OnDemand Image is not loaded yet, as stated in the API documentation
+int UtcDaliImageFactoryReload05(void)
+{
+ TestApplication application;
+
+ tet_infoline( "UtcDaliImageFactoryReload05 - Reload OnDemand image" );
+
+ ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory();
+
+ Vector2 testSize(80.0f, 80.0f);
+ application.GetPlatform().SetClosestImageSize(testSize);
+
+ RequestPtr req;
+ ImageAttributes attr = ImageAttributes::New();
+ attr.SetSize( 80, 80 );
+
+ // this happens first when loading Image OnDemand
+ req = imageFactory.RegisterRequest( gTestImageFilename, &attr );
+
+ application.SendNotification();
+ application.Render();
+
+ ResourceTicketPtr ticket = imageFactory.Reload( req.Get() );
+
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+ DALI_TEST_CHECK( !ticket );
+
+ // this happens when Image is put on stage
+ ticket = imageFactory.Load( req.Get() );
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+ DALI_TEST_CHECK( ticket );
+ application.GetPlatform().ResetTrace();
+
+ ticket = imageFactory.Reload( req.Get() );
+
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+
+ // still loading, no new request
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+
+ // emulate load success
+ EmulateImageLoaded( application, 80, 80 );
+
+ ticket = imageFactory.Reload( req.Get() );
+
+ application.SendNotification();
+ application.Render();
+
+ application.SendNotification();
+ application.Render();
+
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) );
+ END_TEST;
+}
+
+// Initally two different requests map to same resource.
+// After overwriting the file, they load different image resources.
+int UtcDaliImageFactoryReload06(void)
+{
+ TestApplication application;
+ tet_infoline( "UtcDaliImageFactoryReload06 - Two requests first mapping to same resource, then different resources." );
+
+ ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory();
+
+ Vector2 testSize(80.0f, 80.0f);
+ application.GetPlatform().SetClosestImageSize(testSize);
+
+ // request with default attributes ( size is 0,0 )
+ RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, NULL );
+ ResourceTicketPtr ticket = imageFactory.Load( req.Get() );
+
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+
+ // emulate load success
+ EmulateImageLoaded( application, 80, 80 );
+
+ // Request bigger size than actual image.
+ // This will load the same resource.
+ // However if image size changes later on to eg. 512*512 (file is overwritten),
+ // reissuing these two requests will load different resources.
+ ImageAttributes attr = ImageAttributes::New();
+ attr.SetSize( 92, 92 );
+ RequestPtr req2 = imageFactory.RegisterRequest( gTestImageFilename, &attr );
+ ResourceTicketPtr ticket2 = imageFactory.Load( req2.Get() );
+
+ DALI_TEST_CHECK( req != req2 ); // different requests
+ DALI_TEST_EQUALS( ticket->GetId(), ticket2->GetId(), TEST_LOCATION ); // same resource
+
+ Vector2 newSize(512.0f, 512.0f);
+ application.GetPlatform().SetClosestImageSize(newSize);
+
+ // reload fixed size (192,192) request
+ ticket2 = imageFactory.Reload( req2.Get() );
+
+ // emulate load success
+ // note: this is the only way to emulate what size is loaded by platform abstraction
+ EmulateImageLoaded( application, 92, 92 );
+
+ // reload default size request
+ ticket = imageFactory.Reload( req.Get() );
+
+ DALI_TEST_CHECK( ticket->GetId() != ticket2->GetId() ); // different resources
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+#include <mesh-builder.h>
+
+#include <dali/internal/event/common/thread-local-storage.h>
+#include <dali/internal/update/resources/resource-manager.h>
+#include <dali/internal/update/manager/update-manager.h>
+#include <dali/internal/event/resources/resource-client.h>
+#include <dali/internal/event/resources/resource-ticket.h>
+#include <dali/internal/event/resources/image-ticket.h>
+#include <dali/internal/event/resources/resource-ticket-observer.h>
+#include <dali/internal/event/images/image-impl.h>
+#include <dali/internal/event/modeling/model-data-impl.h>
+#include <dali/integration-api/resource-cache.h>
+#include <dali/internal/event/modeling/material-impl.h>
+#include <dali/internal/update/modeling/scene-graph-material.h>
+#include <dali/internal/render/renderers/render-material.h>
+#include <dali/internal/render/gl-resources/context.h>
+#include <dali/internal/render/shaders/program.h>
+
+namespace
+{
+Dali::Internal::MaterialProperties TEST_PROPS;
+}
+
+// Called only once before first test is run.
+void utc_dali_material_startup(void)
+{
+ TEST_PROPS.mOpacity = 0.4f;
+ TEST_PROPS.mShininess = 0.27f;
+ TEST_PROPS.mDiffuseColor = Color::MAGENTA;
+ TEST_PROPS.mAmbientColor = Color::GREEN;
+ TEST_PROPS.mSpecularColor = Color::BLUE;
+ TEST_PROPS.mEmissiveColor = Color::RED;
+ test_return_value = TET_UNDEF;
+}
+
+// Called only once after last test is run
+void utc_dali_material_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+class TestProgram
+{
+public:
+ TestProgram( TestApplication& application )
+ : app(application)
+ {
+ Internal::Context* testContext = new Internal::Context( application.GetGlAbstraction() );
+ Integration::ShaderDataPtr shaderData = new Integration::ShaderData("123", "132");
+ shaderData->AllocateBuffer(10);
+
+ Integration::ResourceId resourceId = 100;
+ program = Internal::Program::New(resourceId, shaderData.Get(), *testContext);
+ programId = app.GetGlAbstraction().GetLastProgramCreated();
+ program->Use();
+ }
+
+ virtual ~TestProgram()
+ {
+ }
+
+ Internal::Program& GetProgram()
+ {
+ return *program;
+ }
+
+ float GetUniformF(std::string uniform)
+ {
+ GLint uniformLoc = program->GetUniformLocation( program->RegisterUniform( uniform ) );
+ float value=0.0f;
+ if(app.GetGlAbstraction().GetUniformValue( programId, (GLuint) uniformLoc, value))
+ {
+ return value;
+ }
+ return 0.0f;
+ }
+
+ Vector4 GetUniformV(std::string uniform)
+ {
+ GLint uniformLoc = program->GetUniformLocation( program->RegisterUniform( uniform ) );
+ Vector4 value;
+ if(app.GetGlAbstraction().GetUniformValue( programId, (GLuint) uniformLoc, value))
+ {
+ return value;
+ }
+ return Vector4();
+ }
+
+ float GetOpacity() { return GetUniformF("uMaterial.mOpacity"); }
+ float GetShininess() { return GetUniformF("uMaterial.mShininess"); }
+ Vector4 GetAmbientColor() { return GetUniformV("uMaterial.mAmbient"); }
+ Vector4 GetDiffuseColor() { return GetUniformV("uMaterial.mDiffuse"); }
+ Vector4 GetSpecularColor() { return GetUniformV("uMaterial.mSpecular"); }
+ Vector4 GetEmissiveColor() { return GetUniformV("uMaterial.mEmissive"); }
+
+ TestApplication& app;
+ GLuint programId;
+ Internal::Program* program;
+ Integration::ShaderDataPtr shaderData;
+};
+
+
+class TestBoundTextures
+{
+public:
+ TestBoundTextures(TestApplication& application)
+ : app(application)
+ {
+ std::vector<GLuint> ids;
+ ids.push_back( 8 ); // 8 = actor1
+ ids.push_back( 9 ); // 9 = actor2
+ ids.push_back( 10 ); // 10 = actor3
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+ }
+
+ std::size_t GetNumBoundTextures()
+ {
+ const std::vector<GLuint>& boundTextures = app.GetGlAbstraction().GetBoundTextures();
+ return boundTextures.size();
+ }
+
+ bool CheckFirstTextureBound( GLuint activeTextureUnit )
+ {
+ bool bound=false;
+ const std::vector<GLuint>& boundTextures = app.GetGlAbstraction().GetBoundTextures( activeTextureUnit );
+
+ if ( boundTextures.size() == 1 )
+ {
+ if( boundTextures[0] == 8u )
+ {
+ bound = true;
+ }
+ }
+ return bound;
+ }
+
+ bool CheckFirstTextureDeleted()
+ {
+ return ( app.GetGlAbstraction().CheckTextureDeleted( 8u ));
+ }
+
+ TestApplication& app;
+};
+
+
+Internal::ResourceTicketPtr CheckLoadBitmap(TestApplication& application, const char* name, int w, int h)
+{
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ ImageAttributes attr;
+ Integration::BitmapResourceType bitmapRequest(attr);
+ Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, name );
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, w, h, w, h );
+ Integration::ResourcePointer resourcePtr(bitmap); // reference it
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+ DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoadingSucceeded );
+ application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
+ req=NULL;
+ application.GetPlatform().ResetTrace();
+
+ return ticket;
+}
+
+Internal::ImagePtr LoadImage(TestApplication& application, const char* name)
+{
+ Internal::ImagePtr image = Internal::Image::New(name);
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 80,80,80,80 );
+ Integration::ResourcePointer resourcePtr(bitmap); // reference it
+
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+ application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
+ req=NULL;
+ application.GetPlatform().ResetTrace();
+ return image;
+}
+
+} // Anonymous Namespace
+
+/********************************************************************************/
+/********************************************************************************/
+/********************************************************************************/
+
+// Test new with no parameters sets up default object
+int UtcDaliMaterialMethodNew01(void)
+{
+ TestApplication application;
+
+ Internal::SceneGraph::Material* sceneObject = Internal::SceneGraph::Material::New();
+ Internal::MaterialProperties props = sceneObject->GetProperties(); // copy.
+ DALI_TEST_CHECK(props.mOpacity == Dali::Material::DEFAULT_OPACITY);
+ DALI_TEST_CHECK(props.mShininess == Dali::Material::DEFAULT_SHININESS);
+ DALI_TEST_CHECK(props.mAmbientColor == Dali::Material::DEFAULT_AMBIENT_COLOR);
+ DALI_TEST_CHECK(props.mDiffuseColor == Dali::Material::DEFAULT_DIFFUSE_COLOR);
+ DALI_TEST_CHECK(props.mSpecularColor == Dali::Material::DEFAULT_SPECULAR_COLOR);
+ DALI_TEST_CHECK(props.mEmissiveColor == Dali::Material::DEFAULT_EMISSIVE_COLOR);
+
+ Internal::ResourceId textureId = sceneObject->GetDiffuseTextureId();
+ DALI_TEST_CHECK( !textureId );
+ textureId = sceneObject->GetOpacityTextureId();
+ DALI_TEST_CHECK( !textureId );
+ textureId = sceneObject->GetNormalMapId();
+ DALI_TEST_CHECK( !textureId );
+
+ DALI_TEST_CHECK(! sceneObject->HasDiffuseTexture());
+ DALI_TEST_CHECK(! sceneObject->HasOpacityTexture());
+ DALI_TEST_CHECK(! sceneObject->HasNormalMap());
+ END_TEST;
+}
+
+// Test new with event object sets up parameters appropriately
+int UtcDaliMaterialMethodNew02(void)
+{
+ TestApplication application;
+
+ Internal::Material* material = Internal::Material::New("cloth");
+ DALI_TEST_CHECK(material->GetShininess() == Dali::Material::DEFAULT_SHININESS);
+ DALI_TEST_CHECK(material->GetAmbientColor() == Dali::Material::DEFAULT_AMBIENT_COLOR);
+ material->SetOpacity(0.4f);
+ material->SetDiffuseColor(Color::MAGENTA);
+
+ // Create directly
+ Internal::SceneGraph::Material* sceneObject = Internal::SceneGraph::Material::New(material);
+ Internal::MaterialProperties props = sceneObject->GetProperties(); // copy.
+ DALI_TEST_CHECK(props.mOpacity == 0.4f);
+ DALI_TEST_CHECK(props.mDiffuseColor == Color::MAGENTA);
+ DALI_TEST_CHECK(props.mShininess == Dali::Material::DEFAULT_SHININESS);
+ DALI_TEST_CHECK(props.mAmbientColor == Dali::Material::DEFAULT_AMBIENT_COLOR);
+ DALI_TEST_CHECK(props.mSpecularColor == Dali::Material::DEFAULT_SPECULAR_COLOR);
+ DALI_TEST_CHECK(props.mEmissiveColor == Dali::Material::DEFAULT_EMISSIVE_COLOR);
+
+ Internal::ResourceId textureId = sceneObject->GetDiffuseTextureId();
+ DALI_TEST_CHECK( !textureId );
+ textureId = sceneObject->GetOpacityTextureId();
+ DALI_TEST_CHECK( !textureId );
+ textureId = sceneObject->GetNormalMapId();
+ DALI_TEST_CHECK( !textureId );
+
+ DALI_TEST_CHECK(! sceneObject->HasDiffuseTexture());
+ DALI_TEST_CHECK(! sceneObject->HasOpacityTexture());
+ DALI_TEST_CHECK(! sceneObject->HasNormalMap());
+
+ // Create indirectly
+ const Internal::SceneGraph::Material* sceneObject2 = material->GetSceneObject();
+ DALI_TEST_CHECK( sceneObject2 != NULL );
+ Internal::MaterialProperties props2 = sceneObject2->GetProperties(); // copy.
+ DALI_TEST_CHECK(props2.mOpacity == 0.4f);
+ DALI_TEST_CHECK(props2.mDiffuseColor == Color::MAGENTA);
+ DALI_TEST_CHECK(props2.mShininess == Dali::Material::DEFAULT_SHININESS);
+ DALI_TEST_CHECK(props2.mAmbientColor == Dali::Material::DEFAULT_AMBIENT_COLOR);
+ DALI_TEST_CHECK(props2.mSpecularColor == Dali::Material::DEFAULT_SPECULAR_COLOR);
+ DALI_TEST_CHECK(props2.mEmissiveColor == Dali::Material::DEFAULT_EMISSIVE_COLOR);
+
+ DALI_TEST_CHECK(! sceneObject2->GetDiffuseTextureId());
+ DALI_TEST_CHECK(! sceneObject2->GetOpacityTextureId());
+ DALI_TEST_CHECK(! sceneObject2->GetNormalMapId());
+
+ DALI_TEST_CHECK(! sceneObject2->HasDiffuseTexture());
+ DALI_TEST_CHECK(! sceneObject2->HasOpacityTexture());
+ DALI_TEST_CHECK(! sceneObject2->HasNormalMap());
+ END_TEST;
+}
+
+// Test setting ready texture off stage
+int UtcDaliMaterialReadyTextureOffstage(void)
+{
+ TestApplication application;
+
+ Internal::ResourceTicketPtr ticket = CheckLoadBitmap(application, "diffuse.png", 80, 80);
+ Internal::SceneGraph::Material* sceneObject = Internal::SceneGraph::Material::New();
+ sceneObject->SetDiffuseTextureId(ticket->GetId());
+
+ DALI_TEST_EQUALS( sceneObject->GetDiffuseTextureId(), ticket->GetId(), TEST_LOCATION );
+ END_TEST;
+}
+
+// Test setting unready texture offstage, becoming ready
+int UtcDaliMaterialUnreadyTextureOffstage(void)
+{
+ TestApplication application;
+
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ ImageAttributes attr;
+ Integration::BitmapResourceType bitmapRequest(attr);
+ Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, "image.png" );
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+
+ // Ticket is valid, but no resource yet
+ Internal::SceneGraph::Material* sceneObject = Internal::SceneGraph::Material::New();
+ Internal::ResourceId textureId = ticket->GetId();
+ sceneObject->SetDiffuseTextureId(textureId);
+ Internal::ResourceId textureId2 = sceneObject->GetDiffuseTextureId();
+ DALI_TEST_CHECK( textureId == textureId2 );
+
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 80, 80, 80, 80 );
+ Integration::ResourcePointer resourcePtr(bitmap); // reference it
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+ DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoadingSucceeded );
+
+ Internal::ResourceId textureId3 = sceneObject->GetDiffuseTextureId();
+ DALI_TEST_CHECK( textureId3 );
+ DALI_TEST_CHECK( textureId3 == textureId );
+ END_TEST;
+}
+
+// Test staging creates render material
+int UtcDaliMaterialStaging01(void)
+{
+ TestApplication application;
+ TestBoundTextures boundTextures(application);
+ TestProgram testProgram(application);
+
+ // Create object and set some properties
+ Internal::SceneGraph::Material* sceneObject = Internal::SceneGraph::Material::New();
+ DALI_TEST_CHECK( sceneObject != NULL );
+ sceneObject->SetProperties(TEST_PROPS);
+
+ // Stage the object
+ Internal::SceneGraph::UpdateManager& updateManager = Internal::ThreadLocalStorage::Get().GetUpdateManager();
+ AddMaterialMessage( updateManager, sceneObject );
+ application.SendNotification(); // Flush update Q
+
+ application.GetPlatform().IncrementGetTimeResult( 1 );
+ Integration::UpdateStatus status;
+ application.GetCore().Update( status );
+
+ // Check that a render object has been created
+ Internal::SceneGraph::RenderMaterial* renderMaterial = sceneObject->GetRenderMaterial();
+ DALI_TEST_CHECK(renderMaterial != NULL);
+ // Not on render manager, and should have default props
+
+ Internal::SceneGraph::RenderMaterialUniforms materialUniforms;
+ renderMaterial->SetUniforms( materialUniforms, testProgram.GetProgram(), Internal::SHADER_DEFAULT );
+
+ DALI_TEST_EQUALS( testProgram.GetOpacity(), 1.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testProgram.GetShininess(), 0.5f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testProgram.GetAmbientColor(), Vector4(0.2f, 0.2f, 0.2f, 1.0f), TEST_LOCATION);
+ DALI_TEST_EQUALS( testProgram.GetDiffuseColor(), Vector4(0.8f, 0.8f, 0.8f, 1.0f), TEST_LOCATION);
+ DALI_TEST_EQUALS( testProgram.GetSpecularColor(), Vector4(0.0f, 0.0f, 0.0f, 1.0f), TEST_LOCATION);
+ DALI_TEST_EQUALS( testProgram.GetEmissiveColor(), Vector4(0.0f, 0.0f, 0.0f, 1.0f), TEST_LOCATION);
+
+ application.Render(); //Process render Q stores & processes mat
+
+ renderMaterial->SetUniforms( materialUniforms, testProgram.GetProgram(), Internal::SHADER_DEFAULT );
+ renderMaterial->BindTextures( testProgram.GetProgram() );
+ DALI_TEST_CHECK( boundTextures.GetNumBoundTextures() == 0 );
+
+ DALI_TEST_EQUALS( testProgram.GetOpacity(), TEST_PROPS.mOpacity, TEST_LOCATION);
+ DALI_TEST_EQUALS( testProgram.GetShininess(), TEST_PROPS.mShininess, TEST_LOCATION );
+ DALI_TEST_EQUALS( testProgram.GetAmbientColor(), TEST_PROPS.mAmbientColor, TEST_LOCATION );
+ DALI_TEST_EQUALS( testProgram.GetDiffuseColor(), TEST_PROPS.mDiffuseColor, TEST_LOCATION );
+ DALI_TEST_EQUALS( testProgram.GetSpecularColor(), TEST_PROPS.mSpecularColor, TEST_LOCATION );
+ DALI_TEST_EQUALS( testProgram.GetEmissiveColor(), TEST_PROPS.mEmissiveColor, TEST_LOCATION );
+ END_TEST;
+}
+
+// Test staging creates render material
+int UtcDaliMaterialStaging02(void)
+{
+ TestApplication application;
+ TestBoundTextures boundTextures(application);
+ TestProgram testProgram(application);
+
+ Internal::Material* material = Internal::Material::New("cloth");
+ material->SetOpacity(0.4f);
+ material->SetDiffuseColor(Color::MAGENTA);
+
+ // Create object and set some properties
+ Internal::SceneGraph::Material* sceneObject = Internal::SceneGraph::Material::New(material);
+ DALI_TEST_CHECK( sceneObject != NULL );
+
+ // Stage the object
+ Internal::SceneGraph::UpdateManager& updateManager = Internal::ThreadLocalStorage::Get().GetUpdateManager();
+ AddMaterialMessage( updateManager, sceneObject );
+ application.SendNotification(); // Flush update Q
+
+ application.GetPlatform().IncrementGetTimeResult( 1 );
+ Integration::UpdateStatus status;
+ application.GetCore().Update( status );
+
+ // Check that a render object has been created
+ Internal::SceneGraph::RenderMaterial* renderMaterial = sceneObject->GetRenderMaterial();
+ DALI_TEST_CHECK(renderMaterial != NULL);
+ // Not on render manager, and should have default props
+
+ Internal::SceneGraph::RenderMaterialUniforms materialUniforms;
+ renderMaterial->SetUniforms( materialUniforms, testProgram.GetProgram(), Internal::SHADER_DEFAULT );
+
+ DALI_TEST_EQUALS( testProgram.GetOpacity(), 1.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testProgram.GetShininess(), 0.5f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testProgram.GetAmbientColor(), Vector4(0.2f, 0.2f, 0.2f, 1.0f), TEST_LOCATION);
+ DALI_TEST_EQUALS( testProgram.GetDiffuseColor(), Vector4(0.8f, 0.8f, 0.8f, 1.0f), TEST_LOCATION);
+ DALI_TEST_EQUALS( testProgram.GetSpecularColor(), Vector4(0.0f, 0.0f, 0.0f, 1.0f), TEST_LOCATION);
+ DALI_TEST_EQUALS( testProgram.GetEmissiveColor(), Vector4(0.0f, 0.0f, 0.0f, 1.0f), TEST_LOCATION);
+
+ application.Render(); //Process render Q stores & processes mat
+
+ renderMaterial->SetUniforms( materialUniforms, testProgram.GetProgram(), Internal::SHADER_DEFAULT );
+ renderMaterial->BindTextures( testProgram.GetProgram() );
+
+ DALI_TEST_CHECK( boundTextures.GetNumBoundTextures() == 0 );
+ DALI_TEST_EQUALS( testProgram.GetOpacity(), 0.4f, TEST_LOCATION);
+ DALI_TEST_EQUALS( testProgram.GetShininess(), Dali::Material::DEFAULT_SHININESS, TEST_LOCATION );
+ DALI_TEST_EQUALS( testProgram.GetAmbientColor(), Dali::Material::DEFAULT_AMBIENT_COLOR, TEST_LOCATION );
+ DALI_TEST_EQUALS( testProgram.GetDiffuseColor(), Color::MAGENTA, TEST_LOCATION );
+ DALI_TEST_EQUALS( testProgram.GetSpecularColor(), Dali::Material::DEFAULT_SPECULAR_COLOR, TEST_LOCATION );
+ DALI_TEST_EQUALS( testProgram.GetEmissiveColor(), Dali::Material::DEFAULT_EMISSIVE_COLOR, TEST_LOCATION );
+ END_TEST;
+}
+
+
+
+// Test setting properties on stage
+int UtcDaliMaterialSetPropsWhilstStaged(void)
+{
+ TestApplication application;
+ TestBoundTextures boundTextures(application);
+ TestProgram testProgram(application);
+
+ // Create object with default properties
+ Internal::SceneGraph::Material* sceneObject = Internal::SceneGraph::Material::New();
+ DALI_TEST_CHECK( sceneObject != NULL );
+
+ // Stage the object
+ Internal::SceneGraph::UpdateManager& updateManager = Internal::ThreadLocalStorage::Get().GetUpdateManager();
+ AddMaterialMessage( updateManager, sceneObject );
+ application.SendNotification(); // Flush update Q
+ application.Render(); // Process update message Q then create & post to render Q
+
+ // Check that a render object has been created
+ Internal::SceneGraph::RenderMaterial* renderMaterial = sceneObject->GetRenderMaterial();
+ DALI_TEST_CHECK(renderMaterial != NULL);
+ application.Render(); // Update & Prepare renderMat, Process render Q stores & processes mat
+
+ sceneObject->SetProperties(TEST_PROPS);
+ application.SendNotification(); // Flush update Q
+ application.Render(); // Update & Prepare material
+ application.Render(); // Process render Q
+
+ Internal::SceneGraph::RenderMaterialUniforms materialUniforms;
+ renderMaterial->SetUniforms( materialUniforms, testProgram.GetProgram(), Internal::SHADER_DEFAULT );
+ renderMaterial->BindTextures( testProgram.GetProgram() );
+
+ DALI_TEST_EQUALS( boundTextures.GetNumBoundTextures(), 0u, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( testProgram.GetOpacity(), TEST_PROPS.mOpacity, TEST_LOCATION);
+ DALI_TEST_EQUALS( testProgram.GetShininess(), TEST_PROPS.mShininess, TEST_LOCATION );
+ DALI_TEST_EQUALS( testProgram.GetAmbientColor(), TEST_PROPS.mAmbientColor, TEST_LOCATION );
+ DALI_TEST_EQUALS( testProgram.GetDiffuseColor(), TEST_PROPS.mDiffuseColor, TEST_LOCATION );
+ DALI_TEST_EQUALS( testProgram.GetSpecularColor(), TEST_PROPS.mSpecularColor, TEST_LOCATION );
+ DALI_TEST_EQUALS( testProgram.GetEmissiveColor(), TEST_PROPS.mEmissiveColor, TEST_LOCATION );
+ END_TEST;
+}
+
+// Test setting ready texture on stage
+int UtcDaliMaterialSetTextureWhilstStaged(void)
+{
+ TestApplication application;
+ TestBoundTextures boundTextures(application);
+ TestProgram testProgram(application);
+
+ Internal::ResourceTicketPtr ticket = CheckLoadBitmap(application, "diffuse.png", 80, 80);
+
+ // Create object with default properties
+ Internal::SceneGraph::Material* sceneObject = Internal::SceneGraph::Material::New();
+ DALI_TEST_CHECK( sceneObject != NULL );
+
+ // Stage the object
+ Internal::SceneGraph::UpdateManager& updateManager = Internal::ThreadLocalStorage::Get().GetUpdateManager();
+ AddMaterialMessage( updateManager, sceneObject );
+ application.SendNotification(); // Flush update Q
+ application.Render(); // Process update message Q then create & post to render Q
+
+ // Check that a render object has been created
+ Internal::SceneGraph::RenderMaterial* renderMaterial = sceneObject->GetRenderMaterial();
+ DALI_TEST_CHECK(renderMaterial != NULL);
+ application.Render(); // Update & Prepare renderMat, Process render Q stores & processes mat
+
+ sceneObject->SetDiffuseTextureId(ticket->GetId());
+ application.SendNotification(); // Flush update Q
+ application.Render(); // Update & Prepare material
+ application.Render(); // Process render Q
+
+ renderMaterial->BindTextures( testProgram.GetProgram() );
+ DALI_TEST_CHECK( boundTextures.CheckFirstTextureBound( GL_TEXTURE0 ) );
+ END_TEST;
+}
+
+// Test setting unready texture on stage, becoming ready
+int UtcDaliMaterialSetUnreadyTextureWhilstStaged(void)
+{
+ TestApplication application;
+ TestBoundTextures boundTextures(application);
+ TestProgram testProgram(application);
+
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ ImageAttributes attr;
+ Integration::BitmapResourceType bitmapRequest(attr);
+ Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, "image.png" );
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+
+
+ // Create object with default properties
+ Internal::SceneGraph::Material* sceneObject = Internal::SceneGraph::Material::New();
+ DALI_TEST_CHECK( sceneObject != NULL );
+
+ // Stage the object
+ Internal::SceneGraph::UpdateManager& updateManager = Internal::ThreadLocalStorage::Get().GetUpdateManager();
+ AddMaterialMessage( updateManager, sceneObject );
+ application.SendNotification(); // Flush update Q
+ application.Render(); // Process update message Q then create & post to render Q
+
+ // Check that a render object has been created
+ Internal::SceneGraph::RenderMaterial* renderMaterial = sceneObject->GetRenderMaterial();
+ DALI_TEST_CHECK(renderMaterial != NULL);
+ application.Render(); // Update & Prepare renderMat, Process render Q stores & processes mat
+
+ sceneObject->SetDiffuseTextureId(ticket->GetId());
+ application.SendNotification(); // Flush update Q
+ application.Render(); // Update & Prepare material
+ application.Render(); // Process render Q
+
+ renderMaterial->BindTextures( testProgram.GetProgram() );
+
+ DALI_TEST_EQUALS( boundTextures.GetNumBoundTextures(), 0u, TEST_LOCATION );
+
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 80, 80, 80, 80 );
+ Integration::ResourcePointer resourcePtr(bitmap); // reference it
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+
+ renderMaterial->BindTextures( testProgram.GetProgram() );
+ DALI_TEST_CHECK( boundTextures.CheckFirstTextureBound( GL_TEXTURE0 ) );
+ END_TEST;
+}
+
+// Test IsOpaque without texture, with unready texture, with ready texture
+
+int UtcDaliMaterialIsOpaqueWithoutTexture(void)
+{
+ TestApplication application;
+
+ // Create object with default properties
+ Internal::SceneGraph::Material* sceneObject = Internal::SceneGraph::Material::New();
+ DALI_TEST_CHECK( sceneObject != NULL );
+
+ // Stage the object
+ Internal::SceneGraph::UpdateManager& updateManager = Internal::ThreadLocalStorage::Get().GetUpdateManager();
+ AddMaterialMessage( updateManager, sceneObject );
+ application.SendNotification(); // Flush update Q
+ application.Render(); // Process update message Q then create & post to render Q
+
+ // Check that a render object has been created
+ Internal::SceneGraph::RenderMaterial* renderMaterial = sceneObject->GetRenderMaterial();
+ DALI_TEST_CHECK(renderMaterial != NULL);
+ application.Render(); // Update & Prepare renderMat, Process render Q stores & processes mat
+
+ DALI_TEST_CHECK( sceneObject->IsOpaque() );
+ END_TEST;
+}
+
+int UtcDaliMaterialIsOpaqueWithTexture(void)
+{
+ TestApplication application;
+
+ Internal::ResourceTicketPtr ticket = CheckLoadBitmap(application, "diffuse.png", 80, 80);
+
+ // Create object with default properties
+ Internal::SceneGraph::Material* sceneObject = Internal::SceneGraph::Material::New();
+ DALI_TEST_CHECK( sceneObject != NULL );
+
+ // Stage the object
+ Internal::SceneGraph::UpdateManager& updateManager = Internal::ThreadLocalStorage::Get().GetUpdateManager();
+ AddMaterialMessage( updateManager, sceneObject );
+ application.SendNotification(); // Flush update Q
+ application.Render(); // Process update message Q then create & post to render Q
+
+ // Check that a render object has been created
+ Internal::SceneGraph::RenderMaterial* renderMaterial = sceneObject->GetRenderMaterial();
+ DALI_TEST_CHECK(renderMaterial != NULL);
+ application.Render(); // Update & Prepare renderMat, Process render Q stores & processes mat
+
+ DALI_TEST_CHECK( sceneObject->IsOpaque() );
+
+ sceneObject->SetDiffuseTextureId(ticket->GetId());
+ application.SendNotification(); // Flush update Q
+ application.Render(); // Update & Prepare material
+ application.Render(); // Process render Q
+
+ DALI_TEST_CHECK( ! sceneObject->IsOpaque() );
+ END_TEST;
+}
+
+
+int UtcDaliMaterialIsOpaqueWithProps(void)
+{
+ TestApplication application;
+
+ // Create object with default properties
+ Internal::SceneGraph::Material* sceneObject = Internal::SceneGraph::Material::New();
+ DALI_TEST_CHECK( sceneObject != NULL );
+
+ // Stage the object
+ Internal::SceneGraph::UpdateManager& updateManager = Internal::ThreadLocalStorage::Get().GetUpdateManager();
+ AddMaterialMessage( updateManager, sceneObject );
+ application.SendNotification(); // Flush update Q
+ application.Render(); // Process update message Q then create & post to render Q
+
+ // Check that a render object has been created
+ Internal::SceneGraph::RenderMaterial* renderMaterial = sceneObject->GetRenderMaterial();
+ DALI_TEST_CHECK(renderMaterial != NULL);
+ application.Render(); // Update & Prepare renderMat, Process render Q stores & processes mat
+
+ DALI_TEST_CHECK( sceneObject->IsOpaque() );
+
+ sceneObject->SetProperties(TEST_PROPS);
+ application.SendNotification(); // Flush update Q
+ application.Render(); // Update & Prepare material
+ application.Render(); // Process render Q
+
+ DALI_TEST_CHECK( ! sceneObject->IsOpaque() );
+ END_TEST;
+}
+
+int UtcDaliMaterialRender(void)
+{
+ TestApplication application;
+ TestBoundTextures boundTextures(application);
+
+ {
+
+ MeshData meshData;
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 60);
+ ConstructFaces(vertices, faces);
+ Dali::Material material = ConstructMaterial();
+
+ Internal::ImagePtr image = LoadImage(application, "texture.png");
+ Image imageHandle(image.Get());
+ material.SetDiffuseTexture(imageHandle);
+ meshData.SetData(vertices, faces, bones, material);
+ Mesh mesh = Mesh::New(meshData);
+
+ MeshActor actor = MeshActor::New(mesh);
+ std::string name = "AMeshActor";
+ actor.SetName(name);
+ actor.SetAffectedByLighting(false);
+ Stage::GetCurrent().Add(actor);
+
+ material.SetOpacity(TEST_PROPS.mOpacity);
+ material.SetShininess(TEST_PROPS.mShininess);
+ material.SetAmbientColor(TEST_PROPS.mAmbientColor);
+ material.SetDiffuseColor(TEST_PROPS.mDiffuseColor);
+ material.SetSpecularColor(TEST_PROPS.mSpecularColor);
+ material.SetEmissiveColor(TEST_PROPS.mEmissiveColor);
+
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+
+ DALI_TEST_CHECK(application.GetGlAbstraction().CheckUniformValue("uMaterial.mOpacity", TEST_PROPS.mOpacity ) );
+ DALI_TEST_CHECK(application.GetGlAbstraction().CheckUniformValue("uMaterial.mShininess", TEST_PROPS.mShininess ) );
+ DALI_TEST_CHECK(application.GetGlAbstraction().CheckUniformValue("uMaterial.mAmbient", TEST_PROPS.mAmbientColor ) );
+ DALI_TEST_CHECK(application.GetGlAbstraction().CheckUniformValue("uMaterial.mDiffuse", TEST_PROPS.mDiffuseColor ) );
+ DALI_TEST_CHECK(application.GetGlAbstraction().CheckUniformValue("uMaterial.mSpecular", TEST_PROPS.mSpecularColor ) );
+ DALI_TEST_CHECK(application.GetGlAbstraction().CheckUniformValue("uMaterial.mEmissive", TEST_PROPS.mEmissiveColor ) );
+
+ DALI_TEST_CHECK(boundTextures.CheckFirstTextureBound( GL_TEXTURE0 ));
+
+ Stage::GetCurrent().Remove(actor);
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+ }
+ application.SendNotification();
+ application.Render();
+
+ // texture should have been removed:
+ DALI_TEST_CHECK( boundTextures.CheckFirstTextureDeleted() );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/integration-api/glyph-set.h>
+
+#include <dali-test-suite-utils.h>
+
+// Internal headers are allowed here
+
+#include <dali/internal/event/text/font-impl.h>
+#include <dali/internal/event/resources/resource-ticket.h>
+#include <dali/internal/event/common/thread-local-storage.h>
+
+using namespace Dali;
+
+// Called only once before first test is run.
+void utc_dali_internal_font_startup()
+{
+ test_return_value = TET_UNDEF;
+}
+
+// Called only once after last test is run
+void utc_dali_internal_font_cleanup()
+{
+ test_return_value = TET_PASS;
+}
+
+
+namespace
+{
+
+static const char* TestText = "Some text";
+
+
+Integration::GlyphMetrics characters[] =
+ {
+ {' ', 1, 0.0f, 0.0f, 0.0f, 0.0f, 10.0f},
+ {'S', 1, 10.0f, 20.0f, 0.0f, 1.0f, 12.0f},
+ {'o', 1, 11.0f, 20.0f, 0.0f, 1.0f, 13.0f},
+ {'m', 1, 12.0f, 20.0f, 0.0f, 1.0f, 14.0f},
+ {'e', 1, 13.0f, 20.0f, 0.0f, 1.0f, 15.0f},
+ {'t', 1, 14.0f, 20.0f, 0.0f, 1.0f, 16.0f},
+ {'x', 1, 15.0f, 20.0f, 0.0f, 1.0f, 17.0f} };
+
+static Integration::GlyphSet* BuildGlyphSet()
+{
+ Integration::GlyphSet* set = new Integration::GlyphSet();
+ Integration::BitmapPtr bitmapData;
+
+ for (unsigned int index = 0; index < sizeof(characters)/sizeof(characters[0]); index++)
+ {
+ set->AddCharacter(bitmapData, characters[index]);
+ }
+
+ set->mLineHeight = 20.0f;
+ set->mUnitsPerEM = 2048.0f/64.0f;
+
+ return set;
+}
+
+static Font CreateFont(TestApplication& application)
+{
+ Integration::GlyphSet* glyphSet = BuildGlyphSet();
+ Integration::ResourcePointer resourcePtr(glyphSet); // reference it
+
+ // Don't use a font which could be cached otherwise cached values will be used making measure text test to fail.
+ Font font = Font::New(FontParameters("TET-FreeSans", "Book", PointSize(8)));
+ application.SendNotification(); // Send to update thread
+ application.Render(16); // Process request
+ application.Render(16); // Resource complete
+ application.SendNotification(); // Update event objects
+ application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
+ return font;
+}
+
+} //anonymous namespace
+
+
+int UtcDaliFontMeasureTextWidth(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::MeasureTextWidth()");
+
+ Font testFont = CreateFont(application);
+ float width = testFont.MeasureTextWidth(TestText, 30.0f);
+
+ DALI_TEST_EQUALS(width, 270.0f, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliFontMeasureTextWidthNegative(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::MeasureTextWidth() with negative height");
+
+ Font testFont = CreateFont(application);
+ float width = testFont.MeasureTextWidth(TestText, -30.0f);
+
+ DALI_TEST_EQUALS(width, 0.0f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliFontMeasureTextHeight(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::MeasureTextHeight()");
+
+ Font testFont = CreateFont(application);
+ float height = testFont.MeasureTextHeight(TestText, 200.0f);
+
+ DALI_TEST_EQUALS(height, 22.2222f, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliFontMeasureTextHeightNegative(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::MeasureTextHeight() with negative width");
+
+ Font testFont = CreateFont(application);
+ float height = testFont.MeasureTextHeight(TestText, -200.0f);
+
+ DALI_TEST_EQUALS(height, 0.0f, TEST_LOCATION);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+#include <test-native-image.h>
+
+// Internal headers are allowed here
+
+#include <dali/internal/event/common/thread-local-storage.h>
+#include <dali/internal/update/resources/bitmap-metadata.h>
+#include <dali/internal/update/resources/resource-manager.h>
+#include <dali/internal/update/manager/update-manager.h>
+#include <dali/internal/event/resources/resource-client.h>
+#include <dali/internal/event/resources/resource-ticket.h>
+#include <dali/internal/event/resources/image-ticket.h>
+#include <dali/internal/event/resources/resource-ticket-observer.h>
+#include <dali/internal/event/images/image-impl.h>
+#include <dali/internal/event/modeling/model-data-impl.h>
+#include <dali/integration-api/resource-cache.h>
+#include <dali/internal/render/gl-resources/texture-declarations.h>
+#include <dali/internal/render/shaders/shader.h>
+#include <dali/internal/common/owner-pointer.h>
+#include <dali/public-api/shader-effects/shader-effect.h>
+
+
+using namespace Dali;
+#include <mesh-builder.h>
+
+namespace
+{
+
+class TestTicketObserver : public Internal::ResourceTicketObserver
+{
+public:
+ TestTicketObserver()
+ : mLoadingFailedCalled(0), mLoadingSucceededCalled(0),
+ mSavingFailedCalled(0), mSavingSucceededCalled(0),
+ mUploadedCount(0)
+ {}
+
+ int LoadFailedCalled() {
+ tet_printf("TicketObserver: LoadingFailed() called %d times", mLoadingFailedCalled);
+ return mLoadingFailedCalled;
+ }
+ int LoadSucceededCalled() {
+ tet_printf("TicketObserver: LoadingSucceeded() called %d times", mLoadingSucceededCalled);
+ return mLoadingSucceededCalled;
+ }
+ int SaveFailedCalled() {
+ tet_printf("TicketObserver: SavingFailed() called %d times", mSavingFailedCalled);
+ return mSavingFailedCalled;
+ }
+ int SaveSucceededCalled() {
+ tet_printf("TicketObserver: SavingSucceeded() called %d times", mSavingSucceededCalled);
+ return mSavingSucceededCalled;
+ }
+ int UploadCalled() {
+ tet_printf("TicketObserver: Uploaded() called %d times", mUploadedCount);
+ return mUploadedCount;
+ }
+ void Reset() {
+ mLoadingFailedCalled = 0;
+ mLoadingSucceededCalled = 0;
+ mSavingFailedCalled = 0;
+ mSavingSucceededCalled = 0;
+ mUploadedCount = 0;
+ }
+
+public: // From ResourceTicketObserver
+ virtual void ResourceLoadingFailed(const Internal::ResourceTicket& ticket) {mLoadingFailedCalled++;}
+ virtual void ResourceLoadingSucceeded(const Internal::ResourceTicket& ticket) {mLoadingSucceededCalled++;}
+ virtual void ResourceSavingFailed(const Internal::ResourceTicket& ticket) {mSavingFailedCalled++;}
+ virtual void ResourceSavingSucceeded(const Internal::ResourceTicket& ticket) {mSavingSucceededCalled++;}
+ virtual void ResourceUploaded(const Internal::ResourceTicket& ticket) {mUploadedCount++;}
+
+private:
+ int mLoadingFailedCalled;
+ int mLoadingSucceededCalled;
+ int mSavingFailedCalled;
+ int mSavingSucceededCalled;
+ int mUploadedCount;
+};
+
+class TestTicketLifetimeObserver : public Internal::ResourceTicketLifetimeObserver
+{
+public:
+ TestTicketLifetimeObserver() : resourceTicketDiscarded(false) {}
+
+ virtual void ResourceTicketDiscarded( const Internal::ResourceTicket& ticket )
+ { resourceTicketDiscarded = true; }
+
+ void Reset() { resourceTicketDiscarded = false; }
+ bool resourceTicketDiscarded;
+};
+
+static TestTicketObserver testTicketObserver;
+static TestTicketLifetimeObserver testTicketLifetimeObserver;
+
+
+Internal::ImagePtr LoadImage(TestApplication& application, char* name)
+{
+ Internal::ImagePtr image = Internal::Image::New(name);
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 80,80,80,80 );
+ Integration::ResourcePointer resourcePtr(bitmap); // reference it
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+ application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
+ req=NULL;
+ application.GetPlatform().ResetTrace();
+ return image;
+}
+
+
+Internal::ResourceTicketPtr CheckLoadBitmap(TestApplication& application, const char* name, int w, int h)
+{
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ ImageAttributes attr;
+ Integration::BitmapResourceType bitmapRequest(attr);
+ Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, name );
+ ticket->AddObserver(testTicketObserver);
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, w, h, w, h );
+ Integration::ResourcePointer resourcePtr(bitmap); // reference it
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+ DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoadingSucceeded );
+ application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
+ req=NULL;
+ application.GetPlatform().ResetTrace();
+
+ return ticket;
+}
+
+Internal::ResourceTicketPtr CheckLoadModel(TestApplication& application, const char* name)
+{
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( Integration::ModelResourceType(), name );
+ ticket->AddObserver(testTicketObserver);
+
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Dali::ModelData modelData = BuildTreeModel();
+ Internal::ModelData& modelDataImpl = GetImplementation(modelData);
+ Integration::ResourcePointer resourcePtr(&modelDataImpl);
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+ DALI_TEST_CHECK(ticket->GetLoadingState() == ResourceLoadingSucceeded);
+ application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
+ req=NULL;
+ application.GetPlatform().ResetTrace();
+
+ return ticket;
+}
+
+} //anonymous namespace
+
+
+void utc_dali_internal_resource_client_startup()
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_internal_resource_client_cleanup()
+{
+ test_return_value = TET_PASS;
+}
+
+// Load a bitmap resource successfully, then discard it's ticket
+int UtcDaliInternalRequestResourceBitmapRequests01(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ tet_infoline("Testing bitmap requests");
+
+ Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
+ ImageAttributes attr;
+ Integration::BitmapResourceType bitmapRequest (attr);
+ Internal::ResourceId id(0);
+
+ testTicketObserver.Reset();
+
+ {
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ /************************************************************
+ * FUNCTION UNDER TEST
+ ***********************************************************/
+ Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, "image.png" );
+ ticket->AddObserver(testTicketObserver);
+
+ // Update thread will request the bitmap resource:
+ // Sets application.GetPlatform().mRequest
+ application.SendNotification(); // Run flush update queue
+ application.Render(1); // Process update messages
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
+
+ application.SendNotification(); // Send any event messages
+ DALI_TEST_CHECK( testTicketObserver.LoadFailedCalled() == 0 );
+ DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
+ DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoading );
+
+ Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
+ DALI_TEST_CHECK( imageTicket );
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
+
+ // Create a resource
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 80, 80, 80, 80 );
+ Integration::ResourcePointer resourcePtr(bitmap); // reference it
+
+ // Set up platform abstraction to load it
+ id=req->GetId();
+ application.GetPlatform().SetResourceLoaded( id, Integration::ResourceBitmap, resourcePtr );
+
+ DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(req->GetId()) );
+
+ // load the cache, which will immediately have the loaded resource
+ application.Render(0);
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
+
+ DALI_TEST_CHECK( resourceManager.IsResourceLoaded(req->GetId()) );
+ Internal::BitmapMetadata bitmapData = resourceManager.GetBitmapMetadata(req->GetId());
+ DALI_TEST_CHECK( bitmapData.GetWidth() == 80 );
+ DALI_TEST_CHECK( bitmapData.GetHeight() == 80 );
+
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
+
+ // Trigger the event thread to process notify messages. Should then trigger the signals
+ // in the ticket observer
+ application.SendNotification();
+
+ DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoadingSucceeded );
+ DALI_TEST_EQUALS(testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
+
+ // Check that the image ticket was updated with the image attributes
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
+ } // Discard ticket
+
+ application.SendNotification(); // Flush update queue (with ticket discarded message
+ application.Render(1); // Process update messages
+ application.SendNotification(); // Send event notifications
+ application.Render(1); // Process update messages
+
+ // Resource should have been discarded.
+ DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::CancelLoadFunc ) );
+ DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
+
+ DALI_TEST_EQUALS(testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
+ DALI_TEST_EQUALS(testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
+ END_TEST;
+}
+
+// Starting Loading a bitmap resource, then discard it's ticket before loading complete.
+int UtcDaliInternalRequestResourceBitmapRequests02(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ tet_infoline("Testing bitmap request ticket discard before load complete");
+
+ Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
+ ImageAttributes attr;
+ Integration::BitmapResourceType bitmapRequest (attr);
+ Internal::ResourceId id(0);
+
+ testTicketObserver.Reset();
+
+ {
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ /************************************************************
+ * FUNCTION UNDER TEST
+ ***********************************************************/
+ Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, "image.png" );
+ ticket->AddObserver(testTicketObserver);
+ Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
+ DALI_TEST_CHECK( imageTicket );
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
+
+ // Update thread will request the bitmap resource:
+ // Sets application.GetPlatform().mRequest
+ application.SendNotification(); // Run flush update queue
+ application.Render(1);
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ id=req->GetId();
+
+ application.SendNotification(); // Should produce no messages
+ DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
+
+ DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
+
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
+ DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoading );
+
+ } // Discard ticket
+
+ // Ensure ticket discarded message is sent to update thread
+ application.SendNotification(); // Flush update queue
+ application.Render(0); // Process update messages
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::CancelLoadFunc ) );
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
+
+ DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
+
+ // Trigger the event thread to process notify messages. Should then trigger the signals
+ // in the ticket observer
+ application.SendNotification();
+
+ DALI_TEST_EQUALS(testTicketObserver.LoadSucceededCalled(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS(testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
+ END_TEST;
+}
+
+// start loading a bitmap resource that doesn't exist, then discard it's ticket after failure
+int UtcDaliInternalRequestResourceBitmapRequests03(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ tet_infoline("Load bitmap that doesn't exist, followed by ticket discard. Expect LoadingFailed");
+
+ Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
+ ImageAttributes attr;
+ Integration::BitmapResourceType bitmapRequest (attr);
+ Internal::ResourceId id(0);
+
+ testTicketObserver.Reset();
+ { // Scope lifetime of ticket
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+
+ /************************************************************
+ * FUNCTION UNDER TEST
+ ***********************************************************/
+ Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, "image.png" );
+ ticket->AddObserver(testTicketObserver);
+ Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
+ DALI_TEST_CHECK( imageTicket );
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
+
+ // Update thread will request the bitmap resource:
+ // Sets application.GetPlatform().mRequest
+ application.SendNotification(); // Run flush update queue
+ application.Render(1); // process update messages
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ id=req->GetId();
+ application.SendNotification(); // Should produce no messages
+ DALI_TEST_CHECK( testTicketObserver.LoadFailedCalled() == 0 );
+ DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
+
+ DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
+
+ application.GetPlatform().SetResourceLoadFailed(id, Integration::FailureFileNotFound );
+
+ application.Render(0); // Get failed result
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
+ application.SendNotification(); // send failed
+ DALI_TEST_CHECK( testTicketObserver.LoadFailedCalled() != 0 );
+ DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoadingFailed );
+
+ DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
+
+ DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
+ } // Discard ticket
+
+ application.Render(0); // Send DiscardTicket
+ application.SendNotification();
+
+ DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
+ END_TEST;
+}
+
+
+
+// Load a bitmap resource successfully, then reload it
+int UtcDaliInternalRequestReloadBitmapRequests01(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ tet_infoline("Testing bitmap reload after successful load");
+
+ Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+
+ Internal::ResourceId id(0);
+ testTicketObserver.Reset();
+
+ {
+ Internal::ResourceTicketPtr ticket = CheckLoadBitmap( application, "image.png", 80, 80 );
+ Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
+ id = ticket->GetId();
+
+ // Reset call statistics - test that resource is reloaded
+ application.GetPlatform().ResetTrace();
+
+ /************************************************************
+ * FUNCTION UNDER TEST
+ ***********************************************************/
+ resourceClient.ReloadResource( ticket->GetId() );
+
+ DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
+ application.SendNotification(); // Flush update messages
+ application.Render(0); // Process update messages
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
+ application.SendNotification(); // Process event messages
+
+ DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoading, TEST_LOCATION );
+ DALI_TEST_EQUALS( testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
+
+ // Create a new resource - the image size could have changed in the meantime
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap2 = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap2->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 120, 120, 120, 120 );
+ Integration::ResourcePointer resourcePtr2(bitmap2); // reference it
+ DALI_TEST_CHECK( req->GetId() == ticket->GetId() );
+ application.GetPlatform().SetResourceLoaded(id, Integration::ResourceBitmap, resourcePtr2);
+
+ application.Render(0); // Process update messages / UpdateCache
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
+
+ DALI_TEST_CHECK( resourceManager.IsResourceLoaded(id));
+ Internal::BitmapMetadata bitmapData = resourceManager.GetBitmapMetadata(id);
+ DALI_TEST_CHECK( bitmapData.GetWidth() == 120 );
+ DALI_TEST_CHECK( bitmapData.GetHeight() == 120 );
+
+ // Ticket can't have been updated yet - it should still have old values
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
+
+ application.SendNotification(); // Process event messages
+ application.Render(0); // Process update messages / UpdateCache
+ application.SendNotification(); // Process event messages
+
+ DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 2, TEST_LOCATION );
+ DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 120, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 120, TEST_LOCATION );
+
+ } // Discard ticket
+
+ application.SendNotification(); // Flush update queue (with ticket discarded message
+ application.Render(1); // Process update messages
+ application.SendNotification(); // Send event notifications
+ application.Render(1); // Process update messages
+
+ // Resource should have been discarded.
+ DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::CancelLoadFunc ) );
+ DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
+
+ DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 2, TEST_LOCATION );
+ DALI_TEST_EQUALS( testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
+ END_TEST;
+}
+
+
+int UtcDaliInternalRequestReloadBitmapRequests02(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ tet_infoline("Testing bitmap reload during first load");
+
+ Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
+ ImageAttributes attr;
+ Integration::BitmapResourceType bitmapRequest (attr);
+ Internal::ResourceId id(0);
+
+ testTicketObserver.Reset();
+
+ {
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, "image.png" );
+ ticket->AddObserver(testTicketObserver);
+
+ // Update thread will request the bitmap resource:
+ // Sets application.GetPlatform().mRequest
+ application.SendNotification(); // Run flush update queue
+ application.Render(1); // Process update messages
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
+
+ application.SendNotification(); // Send any event messages
+ DALI_TEST_CHECK( testTicketObserver.LoadFailedCalled() == 0 );
+ DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
+
+ Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
+ DALI_TEST_CHECK( imageTicket );
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
+
+
+ /************************************************************
+ * FUNCTION UNDER TEST
+ ***********************************************************/
+ resourceClient.ReloadResource( ticket->GetId() );
+ /************************************************************
+ * Expected result - current load completes as usual, no reload requested
+ ************************************************************/
+
+ application.SendNotification(); // Flush update methods
+
+ // Reset call statistics - test that resource is not reloaded
+ application.GetPlatform().ResetTrace();
+
+ application.Render(0); // Process reload message (nothing for UpdateCache yet)
+
+ DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
+ // Create a resource
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 80, 80, 80, 80 );
+ Integration::ResourcePointer resourcePtr(bitmap); // reference it
+
+ // Set up platform abstraction to load it
+ id=req->GetId();
+
+ application.GetPlatform().SetResourceLoaded(id, Integration::ResourceBitmap, resourcePtr);
+
+ DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
+
+ application.GetPlatform().ResetTrace();
+ // load the cache, which will immediately have the loaded resource
+ application.Render(0);
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
+ DALI_TEST_CHECK( resourceManager.IsResourceLoaded(id));
+ Internal::BitmapMetadata bitmapData = resourceManager.GetBitmapMetadata(id);
+ DALI_TEST_CHECK( bitmapData.GetWidth() == 80 );
+ DALI_TEST_CHECK( bitmapData.GetHeight() == 80 );
+
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
+
+ // Trigger the event thread to process notify messages. Should then trigger the signals
+ // in the ticket observer
+ application.SendNotification();
+
+ DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
+
+ // Check that the image ticket was updated with the image attributes
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
+
+ DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
+
+ application.SendNotification(); // Flush update messages
+ application.Render(0); // Process update messages
+
+ // There should be no reload
+ DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
+ application.SendNotification(); // Process event messages
+
+ DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
+ DALI_TEST_EQUALS( testTicketObserver.LoadFailedCalled(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
+
+ DALI_TEST_CHECK( resourceManager.IsResourceLoaded(id));
+ bitmapData = resourceManager.GetBitmapMetadata(id);
+ DALI_TEST_CHECK( bitmapData.GetWidth() == 80 );
+ DALI_TEST_CHECK( bitmapData.GetHeight() == 80 );
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
+
+ } // Discard ticket
+ END_TEST;
+}
+
+
+int UtcDaliInternalRequestReloadBitmapRequests03(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ tet_infoline("Testing bitmap reload at end of first load");
+
+ Internal::ResourceManager& resourceManager = Internal::ThreadLocalStorage::Get().GetResourceManager();
+ ImageAttributes attr;
+ Integration::BitmapResourceType bitmapRequest (attr);
+ Internal::ResourceId id(0);
+
+ testTicketObserver.Reset();
+
+ {
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( bitmapRequest, "image.png" );
+ ticket->AddObserver(testTicketObserver);
+
+ // Update thread will request the bitmap resource:
+ // Sets application.GetPlatform().mRequest
+ application.SendNotification(); // Run flush update queue
+ application.Render(1); // Process update messages
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
+
+ application.SendNotification(); // Send any event messages
+ DALI_TEST_CHECK( testTicketObserver.LoadFailedCalled() == 0 );
+ DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
+
+ Internal::ImageTicketPtr imageTicket(dynamic_cast<Internal::ImageTicket*>(ticket.Get()));
+ DALI_TEST_CHECK( imageTicket );
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
+
+
+ /************************************************************
+ * FUNCTION UNDER TEST
+ ***********************************************************/
+ resourceClient.ReloadResource( ticket->GetId() );
+ /************************************************************
+ * Expected result - current load completes as usual, no reload requested
+ ************************************************************/
+
+ application.SendNotification(); // Flush update methods
+
+ // Reset call statistics - test that resource is not reloaded
+ application.GetPlatform().ResetTrace();
+
+ // Create a resource
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 80, 80, 80, 80 );
+ Integration::ResourcePointer resourcePtr(bitmap); // reference it
+
+ // Set up platform abstraction to load it
+ id=req->GetId();
+
+ application.GetPlatform().SetResourceLoaded(id, Integration::ResourceBitmap, resourcePtr);
+
+ DALI_TEST_CHECK( ! resourceManager.IsResourceLoaded(id));
+
+ application.GetPlatform().ResetTrace();
+ // load the cache, which will immediately have the loaded resource
+ application.Render(0);
+
+ // UpdateCache runs before ProcessMessages, so the loading resource completes before
+ // the reload request is handled.
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc ) );
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetResourcesFunc ) );
+
+ DALI_TEST_CHECK( resourceManager.IsResourceLoaded(id));
+ Internal::BitmapMetadata bitmapData = resourceManager.GetBitmapMetadata(id);
+ DALI_TEST_CHECK( bitmapData.GetWidth() == 80 );
+ DALI_TEST_CHECK( bitmapData.GetHeight() == 80 );
+
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 0, TEST_LOCATION );
+
+ // Trigger the event thread to process notify messages. Should then trigger the signals
+ // in the ticket observer
+ application.SendNotification();
+
+ DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoading, TEST_LOCATION );
+
+ // Check that the image ticket was updated with the image attributes
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( resourceManager.ResourcesToProcess(), true, TEST_LOCATION );
+
+ // Create a new resource - the image size could have changed in the meantime
+ req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap2 = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap2->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 120, 120, 120, 120 );
+ Integration::ResourcePointer resourcePtr2(bitmap2); // reference it
+ DALI_TEST_CHECK( req->GetId() == id );
+ application.GetPlatform().SetResourceLoaded(id, Integration::ResourceBitmap, resourcePtr2);
+
+ application.Render(0); // Process update messages / UpdateCache
+
+ DALI_TEST_CHECK( resourceManager.IsResourceLoaded(id));
+ bitmapData = resourceManager.GetBitmapMetadata(id);
+ DALI_TEST_CHECK( bitmapData.GetWidth() == 120 );
+ DALI_TEST_CHECK( bitmapData.GetHeight() == 120 );
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 80, TEST_LOCATION );
+
+ application.SendNotification(); // Process event messages
+
+ DALI_TEST_EQUALS( testTicketObserver.LoadSucceededCalled(), 2, TEST_LOCATION );
+
+ // Not staged - no GL upload
+ DALI_TEST_EQUALS( testTicketObserver.UploadCalled(), 0, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetWidth(), 120, TEST_LOCATION );
+ DALI_TEST_EQUALS( imageTicket->GetHeight(), 120, TEST_LOCATION );
+ DALI_TEST_EQUALS( resourceManager.ResourcesToProcess(), false, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+
+int UtcDaliInternalSaveResource01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing SaveResource() with valid id, and valid filename");
+
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+
+ Dali::ModelData modelData = BuildTreeModel();
+ testTicketObserver.Reset();
+
+ Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( Integration::ModelResourceType(), "model.dae" );
+ ticket->AddObserver(testTicketObserver);
+
+ // First, load a model resource
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Internal::ModelData& modelDataImpl = GetImplementation(modelData);
+ Integration::ResourcePointer resourcePtr(&modelDataImpl);
+
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+ DALI_TEST_CHECK( ticket->GetLoadingState() == ResourceLoadingSucceeded );
+
+ // Try saving it
+ resourceClient.SaveResource( ticket, "model.dali-bin" );
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process save resource request
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::SaveResourceFunc ) );
+ req = application.GetPlatform().GetRequest();
+ DALI_TEST_CHECK( req->GetType()->id == Integration::ResourceModel );
+ DALI_TEST_CHECK( req->GetPath().compare("model.dali-bin") == 0 );
+
+ // Set up success response
+ application.GetPlatform().SetResourceSaved(req->GetId(), req->GetType()->id);
+ application.Render(); // GetResources --> SaveComplete
+ application.SendNotification(); // Send event messages
+
+ DALI_TEST_CHECK( testTicketObserver.SaveSucceededCalled() == 1 );
+ DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION )
+;
+ END_TEST;
+}
+
+
+int UtcDaliInternalSaveResource02(void)
+{
+ TestApplication application;
+ tet_infoline("Testing SaveResource() with invalid id");
+ testTicketObserver.Reset();
+
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+
+ Dali::ModelData modelData = BuildTreeModel();
+
+ Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( Integration::ModelResourceType(), "model.dae" );
+ ticket->AddObserver(testTicketObserver);
+
+ // First, load a model resource
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Internal::ModelData& modelDataImpl = GetImplementation(modelData);
+ Integration::ResourcePointer resourcePtr(&modelDataImpl);
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+ DALI_TEST_CHECK(ticket->GetLoadingState() == ResourceLoadingSucceeded);
+ application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
+
+ Internal::ResourceTypePath typePath(Integration::ModelResourceType(), "");
+ Internal::ResourceTicketPtr aTicket = new Internal::ResourceTicket( testTicketLifetimeObserver, 2000, typePath );
+ try
+ {
+ resourceClient.SaveResource( aTicket, "model.dali-bin" ); // Should be outside range of valid resources!
+ } catch (DaliException& e)
+ {
+ // Tests that a negative test of an assertion succeeds
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+
+ DALI_TEST_ASSERT(e, "mImpl->mTickets.find(ticket->GetId()) != mImpl->mTickets.end()", TEST_LOCATION );
+ }
+
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process save resource request
+
+ // Ensure no request sent to platform abstraction
+ DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::SaveResourceFunc ) );
+ req = application.GetPlatform().GetRequest();
+ DALI_TEST_CHECK ( req == NULL );
+ END_TEST;
+}
+
+int UtcDaliInternalSaveResource03(void)
+{
+ TestApplication application;
+ tet_infoline("Testing SaveResource() with invalid id");
+ testTicketObserver.Reset();
+
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+
+ Dali::ModelData modelData = BuildTreeModel();
+
+ Internal::ResourceTicketPtr ticket = resourceClient.RequestResource( Integration::ModelResourceType(), "model.dae" );
+ ticket->AddObserver(testTicketObserver);
+
+ // First, load a model resource
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Internal::ModelData& modelDataImpl = GetImplementation(modelData);
+ Integration::ResourcePointer resourcePtr(&modelDataImpl);
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+ DALI_TEST_CHECK(ticket->GetLoadingState() == ResourceLoadingSucceeded);
+ application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
+
+ Internal::ResourceTicketPtr aTicket;
+ try
+ {
+ resourceClient.SaveResource( aTicket, "model.dali-bin" ); // Should be outside range of valid resources!
+ } catch (DaliException& e)
+ {
+ // Tests that a negative test of an assertion succeeds
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+
+ DALI_TEST_EQUALS(e.mCondition, "ticket", TEST_LOCATION);
+ }
+
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process save resource request
+
+ // Ensure no request sent to platform abstraction
+ DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::SaveResourceFunc ) );
+ req = application.GetPlatform().GetRequest();
+ DALI_TEST_CHECK ( req == NULL );
+ END_TEST;
+}
+
+
+int UtcDaliInternalSaveResource04(void)
+{
+ TestApplication application;
+ tet_infoline("Testing SaveResource() with valid id, but invalid filename");
+ testTicketObserver.Reset();
+
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+
+ // First, load a model resource
+ Internal::ResourceTicketPtr ticket = CheckLoadModel(application, "model.dae");
+
+ resourceClient.SaveResource( ticket, "model.dali-bin" );
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process save resource request
+
+ // Set up fail response
+ application.GetPlatform().SetResourceSaveFailed(ticket->GetId(), Integration::FailureInvalidPath );
+ application.Render(); // GetResources --> SaveFailed
+ application.SendNotification(); // Send event messages
+
+ DALI_TEST_CHECK( testTicketObserver.SaveSucceededCalled() == 0 );
+ DALI_TEST_CHECK( testTicketObserver.SaveFailedCalled() == 1 );
+ DALI_TEST_EQUALS( ticket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION )
+;
+ END_TEST;
+}
+
+int UtcDaliInternalSaveResource05(void)
+{
+ TestApplication application;
+ tet_infoline("Testing SaveResource() with valid id, but invalid resource type");
+ testTicketObserver.Reset();
+
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+
+ // First, load a bitmap resource
+ Internal::ResourceTicketPtr ticket = CheckLoadBitmap(application, "bitmap.jpg", 80, 80);
+
+ // Try saving it
+ resourceClient.SaveResource( ticket, "bitmap.png" );
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process save resource request
+
+ DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::SaveResourceFunc ) );
+ END_TEST;
+}
+
+int UtcDaliInternalRequestResourceTicket01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing RequestResourceTicket() with valid id");
+
+ testTicketObserver.Reset();
+
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+
+ // First, load a bitmap resource
+ Internal::ResourceTicketPtr ticket = CheckLoadBitmap(application, "bitmap.jpg", 80, 80);
+
+ Internal::ResourceTicketPtr newTicket = resourceClient.RequestResourceTicket( ticket->GetId() );
+ DALI_TEST_CHECK( newTicket );
+ DALI_TEST_CHECK( newTicket->GetId() == ticket->GetId() );
+ DALI_TEST_CHECK( newTicket->GetTypePath().type->id == ticket->GetTypePath().type->id );
+ END_TEST;
+}
+
+int UtcDaliInternalRequestResourceTicket02(void)
+{
+ TestApplication application;
+ tet_infoline("Testing RequestResourceTicket() with invalid id");
+
+ testTicketObserver.Reset();
+
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+
+ // First, load a bitmap resource
+ Internal::ResourceTicketPtr ticket = CheckLoadBitmap(application, "bitmap.jpg", 80, 80);
+
+ Internal::ResourceTicketPtr newTicket = resourceClient.RequestResourceTicket( ticket->GetId() + 2000 );
+ DALI_TEST_CHECK( ! newTicket );
+ END_TEST;
+}
+
+int UtcDaliInternalLoadShaderRequest01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing LoadShader() success");
+ testTicketObserver.Reset();
+
+ // Clear through all of the outstanding shader load requests from the default shader effect
+ std::vector< unsigned char > buffer;
+ for( int i=0; i<10; i++ )
+ {
+ buffer.push_back((unsigned char)i);
+ }
+ application.GetPlatform().SetLoadFileResult( true, buffer );
+ application.GetGlAbstraction().SetLinkStatus(1);
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process load shader request (immediately)
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+
+ Integration::ShaderResourceType shaderRequest(123, "vertex src", "frag src");
+ std::string shaderBinaryFile("shader.bin");
+ Internal::ResourceTicketPtr ticket = resourceClient.LoadShader(shaderRequest, shaderBinaryFile);
+ DALI_TEST_CHECK( ticket );
+
+ application.GetPlatform().SetLoadFileResult( true, buffer );
+ application.GetGlAbstraction().EnableShaderCallTrace( true );
+ application.GetGlAbstraction().SetLinkStatus(1);
+
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process load shader request (immediately)
+
+ application.SendNotification();
+ application.Render();
+
+ application.SendNotification();
+ application.Render();
+
+ // If shader program loads OK, we shouldn't see any calls to CompileShader or SaveResource
+ TraceCallStack& shaderTrace = application.GetGlAbstraction().GetShaderTrace();
+ DALI_TEST_CHECK( ! shaderTrace.FindMethod("CompileShader") );
+
+ // Ensure no request sent to platform abstraction
+ DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::SaveResourceFunc ) );
+ END_TEST;
+}
+
+int UtcDaliInternalLoadShaderRequest02(void)
+{
+ TestApplication application;
+ tet_infoline("Testing LoadShader() failure");
+ testTicketObserver.Reset();
+
+ // Clear through all of the outstanding shader load requests from the default shader effect
+ std::vector< unsigned char > buffer;
+ for( int i=0; i<10; i++ )
+ {
+ buffer.push_back((unsigned char)i);
+ }
+ application.GetPlatform().SetLoadFileResult( true, buffer );
+ application.GetGlAbstraction().SetLinkStatus(1);
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process load shader request (immediately)
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ Internal::SceneGraph::UpdateManager& updateManager = Internal::ThreadLocalStorage::Get().GetUpdateManager();
+
+ Integration::ShaderResourceType shaderRequest(123, "vertex src", "frag src");
+ std::string shaderBinaryFile("shader.bin");
+ Internal::ResourceTicketPtr ticket = resourceClient.LoadShader(shaderRequest, shaderBinaryFile);
+ ticket->AddObserver(testTicketObserver);
+
+ ShaderEffect::GeometryHints hints = ShaderEffect::HINT_NONE;
+ Internal::SceneGraph::Shader* sceneObject = new Internal::SceneGraph::Shader( hints );
+ AddShaderMessage( updateManager, *sceneObject );
+
+ size_t shaderHash=0;
+ SetShaderProgramMessage( updateManager, *sceneObject, GEOMETRY_TYPE_IMAGE, Internal::SHADER_DEFAULT, ticket->GetId(), shaderHash );
+
+ DALI_TEST_CHECK( ticket );
+
+ buffer.clear();
+ DALI_TEST_CHECK(buffer.size() == 0);
+
+ application.GetPlatform().SetLoadFileResult( true, buffer );
+ application.GetGlAbstraction().ResetShaderCallStack();
+ application.GetGlAbstraction().EnableShaderCallTrace( true );
+ application.GetGlAbstraction().SetLinkStatus(1);
+ application.GetGlAbstraction().SetProgramBinaryLength(20);
+ application.GetPlatform().SetResourceSaved (ticket->GetId(), Integration::ResourceShader );
+
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process load shader request (immediately), add responses
+ // to post process q
+ application.Render(); // this update will process old post-process-q
+ application.Render(); // this update will process new post-process-q
+ application.SendNotification(); // Send save request to event thread
+ application.Render(); // this update will process save request
+ application.Render(); // this update will get SaveComplete
+ application.SendNotification(); // Send save request response
+
+ TraceCallStack& shaderTrace = application.GetGlAbstraction().GetShaderTrace();
+ DALI_TEST_CHECK( shaderTrace.FindMethod("CompileShader") );
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::SaveResourceFunc ) );
+ DALI_TEST_CHECK( testTicketObserver.SaveSucceededCalled() );
+ END_TEST;
+}
+
+int UtcDaliInternalAllocateBitmapImage01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing AllocateBitmapImage()");
+ testTicketObserver.Reset();
+
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ Internal::ImageTicketPtr imageTicket = resourceClient.AllocateBitmapImage(80, 80, 80, 80, Pixel::RGB565);
+ imageTicket->AddObserver( testTicketObserver );
+
+ DALI_TEST_CHECK( imageTicket );
+ DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetWidth(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetAttributes().GetPixelFormat(), Pixel::RGB565, TEST_LOCATION );
+
+ application.SendNotification(); // Flush update queue
+ application.Render(0); // Process message
+ application.SendNotification(); // Send message to tickets
+
+ DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
+ DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetWidth(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetAttributes().GetPixelFormat(), Pixel::RGB565, TEST_LOCATION );
+
+ Integration::Bitmap* bitmap = resourceClient.GetBitmap(imageTicket);
+ DALI_TEST_CHECK ( bitmap != NULL );
+ DALI_TEST_EQUALS ( bitmap->GetImageWidth(), 80u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetImageHeight(), 80u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferWidth(), 80u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferHeight(), 80u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetPixelFormat(), Pixel::RGB565, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliInternalAddBitmapImage01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing AddBitmap with reserved buffer()");
+ testTicketObserver.Reset();
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGB565, 80, 80, 80, 80 );
+
+ Internal::ImageTicketPtr imageTicket = resourceClient.AddBitmapImage( bitmap );
+ DALI_TEST_CHECK( imageTicket );
+ imageTicket->AddObserver( testTicketObserver );
+
+ DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetWidth(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetAttributes().GetPixelFormat(), Pixel::RGB565, TEST_LOCATION );
+
+ application.SendNotification(); // Flush update queue
+ application.Render(0); // Process message
+ application.SendNotification(); // Send message to tickets
+
+ DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
+ DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetWidth(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetAttributes().GetPixelFormat(), Pixel::RGB565, TEST_LOCATION );
+
+ Integration::Bitmap* theBitmap = resourceClient.GetBitmap(imageTicket);
+ DALI_TEST_CHECK ( theBitmap != NULL );
+ DALI_TEST_CHECK ( bitmap == theBitmap );
+ DALI_TEST_EQUALS ( bitmap->GetImageWidth(), 80u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetImageHeight(), 80u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferWidth(), 80u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferHeight(), 80u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetPixelFormat(), Pixel::RGB565, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliInternalAddBitmapImage02(void)
+{
+ TestApplication application;
+ tet_infoline("Testing AddBitmap without reserved buffer()");
+ testTicketObserver.Reset();
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+
+ Internal::ImageTicketPtr imageTicket = resourceClient.AddBitmapImage( bitmap );
+ DALI_TEST_CHECK( imageTicket );
+ imageTicket->AddObserver( testTicketObserver );
+
+ DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetWidth(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetHeight(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetAttributes().GetPixelFormat(), Pixel::RGBA8888, TEST_LOCATION );
+ DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
+
+ application.SendNotification(); // Flush update queue
+ application.Render(0); // Process message
+ application.SendNotification(); // Send message to tickets
+
+ DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetWidth(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetHeight(), 0, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetAttributes().GetPixelFormat(), Pixel::RGBA8888, TEST_LOCATION );
+ DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
+
+ Integration::Bitmap* theBitmap = resourceClient.GetBitmap(imageTicket);
+ DALI_TEST_CHECK ( theBitmap != NULL );
+ DALI_TEST_CHECK ( bitmap == theBitmap );
+ DALI_TEST_EQUALS ( bitmap->GetImageWidth(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetImageHeight(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferWidth(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferHeight(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetPixelFormat(), Pixel::RGBA8888, TEST_LOCATION );
+
+ // There is no way for the ticket's image attributes to be updated if the bitmap
+ // reserves a buffer after ticket generation.
+ // Probably not an issue - there is no public API in BufferImage to change the image size.
+ END_TEST;
+}
+
+
+int UtcDaliInternalAddBitmapImage03(void)
+{
+ TestApplication application;
+ tet_infoline("Testing AddBitmap() with invalid bitmap");
+ testTicketObserver.Reset();
+
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ Internal::ImageTicketPtr imageTicket;
+ bool exceptionRaised=false;
+ try
+ {
+ imageTicket = resourceClient.AddBitmapImage( NULL );
+ }
+ catch( DaliException& e )
+ {
+ exceptionRaised = true;
+ }
+ DALI_TEST_CHECK( exceptionRaised );
+ DALI_TEST_CHECK( ! imageTicket );
+ END_TEST;
+}
+
+int UtcDaliInternalGetBitmapImage01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing GetBitmap() with valid ticket");
+ testTicketObserver.Reset();
+
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 20, 20, 80, 80 );
+ Internal::ImageTicketPtr imageTicket = resourceClient.AddBitmapImage( bitmap );
+
+ Integration::Bitmap* theBitmap = resourceClient.GetBitmap(imageTicket);
+ DALI_TEST_CHECK ( theBitmap != NULL );
+ DALI_TEST_CHECK ( bitmap == theBitmap );
+ DALI_TEST_EQUALS ( bitmap->GetImageWidth(), 20u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetImageHeight(), 20u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferWidth(), 80u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferHeight(), 80u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetPixelFormat(), Pixel::RGBA8888, TEST_LOCATION );
+
+ imageTicket->AddObserver( testTicketObserver );
+ application.SendNotification(); // Flush update queue
+ application.Render(0); // Process message
+ application.SendNotification(); // Send message to tickets
+
+ theBitmap = resourceClient.GetBitmap(imageTicket);
+ DALI_TEST_CHECK ( theBitmap != NULL );
+ DALI_TEST_CHECK ( bitmap == theBitmap );
+ DALI_TEST_EQUALS ( bitmap->GetImageWidth(), 20u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetImageHeight(), 20u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferWidth(), 80u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetPackedPixelsProfile()->GetBufferHeight(), 80u, TEST_LOCATION );
+ DALI_TEST_EQUALS ( bitmap->GetPixelFormat(), Pixel::RGBA8888, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliInternalGetBitmapImage02(void)
+{
+ TestApplication application;
+ tet_infoline("Testing GetBitmap() with invalid ticket");
+
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ Internal::ImageTicketPtr imageTicket;
+ Integration::Bitmap* theBitmap = NULL;
+ bool exceptionRaised = false;
+ try
+ {
+ theBitmap = resourceClient.GetBitmap(imageTicket);
+ } catch (DaliException& e)
+ {
+ exceptionRaised = true;
+ }
+ DALI_TEST_CHECK( exceptionRaised );
+ DALI_TEST_CHECK( ! theBitmap );
+ END_TEST;
+}
+
+int UtcDaliInternalGetBitmapImage03(void)
+{
+ TestApplication application;
+ tet_infoline("Testing GetBitmap() with valid ticket for incorrect type");
+
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient(); Internal::ResourceTicketPtr imageTicket = CheckLoadBitmap( application, "Stuff.png", 100, 100 );
+ Internal::ResourceTicketPtr modelTicket = CheckLoadModel( application, "Stuff.dae");
+
+ Integration::Bitmap* theBitmap = NULL;
+ theBitmap = resourceClient.GetBitmap(imageTicket);
+ DALI_TEST_CHECK( ! theBitmap );
+
+ theBitmap = resourceClient.GetBitmap(modelTicket);
+ DALI_TEST_CHECK( ! theBitmap );
+ END_TEST;
+}
+
+int UtcDaliInternalAllocateTexture01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing AllocateTexture()");
+ testTicketObserver.Reset();
+
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ Internal::ResourceTicketPtr resourceTicket = resourceClient.AllocateTexture(80, 80, Pixel::L8 );
+ resourceTicket->AddObserver( testTicketObserver );
+
+ DALI_TEST_CHECK( resourceTicket );
+ DALI_TEST_EQUALS ( resourceTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
+ DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
+
+ application.SendNotification(); // Flush update queue
+ application.Render(0); // Process message
+ application.SendNotification(); // Send message to tickets
+
+ DALI_TEST_EQUALS ( resourceTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
+ DALI_TEST_CHECK( testTicketObserver.LoadSucceededCalled() == 0 );
+ END_TEST;
+}
+
+int UtcDaliInternalAddNativeImage(void)
+{
+ TestApplication application;
+ tet_infoline("Testing AddNativeImage()");
+
+ testTicketObserver.Reset();
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ Internal::ResourceTicketPtr ticket;
+ Internal::ImageTicketPtr imageTicket;
+ { // Test image going out of scope after ticket creation (message to Update thread holds a ref)
+ TestNativeImagePointer nativeImage = TestNativeImage::New( 80, 80 );
+ ticket = resourceClient.AddNativeImage( *nativeImage );
+ imageTicket = dynamic_cast<Internal::ImageTicket*>(ticket.Get());
+ DALI_TEST_CHECK( imageTicket );
+ imageTicket->AddObserver( testTicketObserver );
+ }
+
+ DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetWidth(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
+ DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
+
+ application.SendNotification(); // Flush update queue
+ application.Render(0); // Process message
+ application.SendNotification(); // Send message to tickets
+
+ DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetWidth(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
+ DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
+
+ Integration::Bitmap* theBitmap = NULL;
+ theBitmap = resourceClient.GetBitmap(imageTicket);
+
+ DALI_TEST_CHECK ( theBitmap == NULL );
+ END_TEST;
+}
+
+int UtcDaliInternalAddFrameBufferImage(void)
+{
+ TestApplication application;
+ tet_infoline("Testing AddFrameBufferImage()");
+
+ testTicketObserver.Reset();
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ Internal::ImageTicketPtr imageTicket = resourceClient.AddFrameBufferImage(80, 80, Pixel::A8 );
+ DALI_TEST_CHECK( imageTicket );
+ imageTicket->AddObserver( testTicketObserver );
+
+ DALI_TEST_EQUALS ( imageTicket->GetWidth(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetAttributes().GetPixelFormat(), Pixel::A8, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
+ DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
+
+ application.SendNotification(); // Flush update queue
+ application.Render(0); // Process message
+ application.SendNotification(); // Send message to tickets
+
+ DALI_TEST_EQUALS ( imageTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetWidth(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetHeight(), 80, TEST_LOCATION );
+ DALI_TEST_EQUALS ( imageTicket->GetAttributes().GetPixelFormat(), Pixel::A8, TEST_LOCATION );
+ DALI_TEST_CHECK ( 0 == testTicketObserver.LoadSucceededCalled() ); // Check no message was sent
+
+ Integration::Bitmap* theBitmap = NULL;
+ theBitmap = resourceClient.GetBitmap(imageTicket);
+ DALI_TEST_CHECK ( theBitmap == NULL );
+ END_TEST;
+}
+
+int UtcDaliInternalAllocateMesh01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing AllocateMesh() with vald mesh data");
+
+ MeshData publicMeshData;
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 60);
+ ConstructFaces(vertices, faces);
+ Material customMaterial = ConstructMaterial();
+ publicMeshData.SetData(vertices, faces, bones, customMaterial);
+ publicMeshData.SetHasNormals(true);
+ publicMeshData.SetHasTextureCoords(true);
+
+ testTicketObserver.Reset();
+ Internal::ResourceClient& resourceClient = Internal::ThreadLocalStorage::Get().GetResourceClient();
+ Internal::OwnerPointer<Internal::MeshData> meshDataPtr( new Internal::MeshData( publicMeshData, true, true ) );
+ Internal::ResourceTicketPtr meshTicket = resourceClient.AllocateMesh(meshDataPtr);
+ DALI_TEST_CHECK( meshTicket );
+ meshTicket->AddObserver( testTicketObserver );
+
+ DALI_TEST_EQUALS ( meshTicket->GetLoadingState(), ResourceLoading, TEST_LOCATION );
+
+ application.SendNotification(); // Flush update queue
+ application.Render(0); // Process message
+ application.SendNotification(); // Send message to tickets
+
+ DALI_TEST_EQUALS ( meshTicket->GetLoadingState(), ResourceLoadingSucceeded, TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+SET(PKG_NAME "dali-unmanaged")
+
+SET(EXEC_NAME "tct-${PKG_NAME}-core")
+SET(RPM_NAME "core-${PKG_NAME}-tests")
+
+SET(CAPI_LIB "dali-unmanaged")
+
+SET(TC_SOURCES
+ utc-Dali-Constrainable.cpp
+ utc-Dali-Context.cpp
+ utc-Dali-CustomActor.cpp
+ utc-Dali-DistanceField.cpp
+ utc-Dali-DynamicsBody.cpp
+ utc-Dali-DynamicsBodyConfig.cpp
+ utc-Dali-DynamicsJoint.cpp
+ utc-Dali-DynamicsShape.cpp
+ utc-Dali-DynamicsWorld.cpp
+ utc-Dali-DynamicsWorldConfig.cpp
+ utc-Dali-EncodedBufferImage.cpp
+ utc-Dali-HitTestAlgorithm.cpp
+ utc-Dali-LightActor.cpp
+ utc-Dali-LocklessBuffer.cpp
+ utc-Dali-MeshActor.cpp
+ utc-Dali-MeshData.cpp
+ utc-Dali-Model.cpp
+ utc-Dali-MouseWheelEvent.cpp
+ utc-Dali-ObjectRegistry.cpp
+ utc-Dali-Random.cpp
+ utc-Dali-RenderTask.cpp
+ utc-Dali-ShaderEffect.cpp
+ utc-Dali-Scripting.cpp
+ utc-Dali-Spline.cpp
+ utc-Dali-TypeRegistry.cpp
+ utc-Dali-Utf8.cpp
+ utc-Dali-Vector.cpp
+)
+
+LIST(APPEND TC_SOURCES
+ dali-test-suite-utils/mesh-builder.cpp
+ dali-test-suite-utils/test-dynamics.cpp
+ dali-test-suite-utils/test-platform-abstraction.cpp
+ ../dali/dali-test-suite-utils/dali-test-suite-utils.cpp
+ ../dali/dali-test-suite-utils/test-application.cpp
+ ../dali/dali-test-suite-utils/test-gesture-manager.cpp
+ ../dali/dali-test-suite-utils/test-gl-abstraction.cpp
+ ../dali/dali-test-suite-utils/test-gl-sync-abstraction.cpp
+ ../dali/dali-test-suite-utils/test-native-image.cpp
+ ../dali/dali-test-suite-utils/test-render-controller.cpp
+ ../dali/dali-test-suite-utils/test-trace-call-stack.cpp
+)
+
+PKG_CHECK_MODULES(${CAPI_LIB} REQUIRED
+ dali-core
+)
+
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -ggdb --coverage -DDEBUG_ENABLED")
+
+FOREACH(directory ${${CAPI_LIB}_LIBRARY_DIRS})
+ SET(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -L${directory}")
+ENDFOREACH(directory ${CAPI_LIB_LIBRARY_DIRS})
+
+INCLUDE_DIRECTORIES(
+ ${${CAPI_LIB}_INCLUDE_DIRS}
+ dali-test-suite-utils
+ ../dali/dali-test-suite-utils
+)
+
+ADD_EXECUTABLE(${EXEC_NAME} ${EXEC_NAME}.cpp ${TC_SOURCES})
+TARGET_LINK_LIBRARIES(${EXEC_NAME}
+ ${${CAPI_LIB}_LIBRARIES}
+)
+
+INSTALL(PROGRAMS ${EXEC_NAME}
+ DESTINATION ${BIN_DIR}/${EXEC_NAME}
+)
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#include "mesh-builder.h"
+
+namespace Dali
+{
+
+void AddVertex( MeshData::VertexContainer& verts, Vector3 V, Vector2 UV )
+{
+ MeshData::Vertex meshVertex;
+ meshVertex.x = V.x;
+ meshVertex.y = V.y;
+ meshVertex.z = V.z;
+ meshVertex.u = UV.x;
+ meshVertex.v = UV.y;
+ verts.push_back(meshVertex);
+}
+
+void SetNormal( MeshData::VertexContainer& verts, size_t vertIdx, Vector3 normal )
+{
+ verts[vertIdx].nX = normal.x;
+ verts[vertIdx].nY = normal.y;
+ verts[vertIdx].nZ = normal.z;
+}
+
+void SetBone( MeshData::VertexContainer& verts, size_t vertIdx, size_t index, size_t boneIndex, float weight)
+{
+ verts[vertIdx].boneIndices[index] = boneIndex;
+ verts[vertIdx].boneWeights[index] = weight;
+}
+
+void SetBones(MeshData::VertexContainer& verts)
+{
+ // Set all verts in one corner to be affected fully by bone 0
+ SetBone(verts, 0, 0, 0, 1.0f);
+ SetBone(verts, 1, 0, 0, 1.0f);
+ SetBone(verts, 2, 0, 0, 1.0f);
+
+ // Set all verts in next corner to be affected by bone 1 and bone 2 equally
+ SetBone(verts, 3, 0, 1, 0.5f);
+ SetBone(verts, 4, 0, 1, 0.5f);
+ SetBone(verts, 5, 0, 1, 0.5f);
+
+ SetBone(verts, 3, 1, 2, 0.5f);
+ SetBone(verts, 4, 1, 2, 0.5f);
+ SetBone(verts, 5, 1, 2, 0.5f);
+}
+
+void ConstructBones(BoneContainer& bones)
+{
+ bones.push_back(Bone("Bone1", Matrix::IDENTITY));
+ bones.push_back(Bone("Bone2", Matrix::IDENTITY));
+ bones.push_back(Bone("Bone3", Matrix::IDENTITY));
+}
+
+void CopyVertex( MeshData::Vertex& vert, Vector3& vector )
+{
+ vector.x = vert.x;
+ vector.y = vert.y;
+ vector.z = vert.z;
+}
+
+void AddTriangle( MeshData::VertexContainer& verts,
+ MeshData::FaceIndices& faces,
+ size_t v0, size_t v1, size_t v2 )
+{
+ faces.push_back(v0);
+ faces.push_back(v1);
+ faces.push_back(v2);
+
+ // Calculate normal...
+ Vector3 vert0, vert1, vert2;
+ CopyVertex(verts[v0], vert0);
+ CopyVertex(verts[v1], vert1);
+ CopyVertex(verts[v2], vert2);
+ Vector3 e0 = vert1 - vert0;
+ Vector3 e1 = vert2 - vert1;
+ Vector3 normal = e0.Cross(e1);
+ normal.Normalize();
+ SetNormal(verts, v0, normal);
+ SetNormal(verts, v1, normal);
+ SetNormal(verts, v2, normal);
+}
+
+void ConstructVertices( MeshData::VertexContainer& vertices, float sz )
+{
+ // back
+ AddVertex(vertices, Vector3( 0.0f, -sz, 0.0f), Vector2(0.50f, 0.50f)); // 0a 0
+ AddVertex(vertices, Vector3( 0.0f, -sz, 0.0f), Vector2(0.50f, 0.50f)); // 0b 1
+ AddVertex(vertices, Vector3( 0.0f, -sz, 0.0f), Vector2(0.50f, 0.50f)); // 0c 2
+
+ // left
+ AddVertex(vertices, Vector3(-sz*0.5f, sz*0.3f, sz*0.5f), Vector2(0.25f, 0.50f)); // 1a 3
+ AddVertex(vertices, Vector3(-sz*0.5f, sz*0.3f, sz*0.5f), Vector2(0.25f, 0.50f)); // 1b 4
+ AddVertex(vertices, Vector3(-sz*0.5f, sz*0.3f, sz*0.5f), Vector2(0.25f, 0.50f)); // 1c 5
+
+ // right
+ AddVertex(vertices, Vector3( sz*0.5f, sz*0.3f, sz*0.5f), Vector2(0.50f, 0.25f)); // 2a 6
+ AddVertex(vertices, Vector3( sz*0.5f, sz*0.3f, sz*0.5f), Vector2(0.50f, 0.25f)); // 2b 7
+ AddVertex(vertices, Vector3( sz*0.5f, sz*0.3f, sz*0.5f), Vector2(0.50f, 0.25f)); // 2c 8
+
+ // top
+ AddVertex(vertices, Vector3( 0.0f, sz*0.3f, -sz*0.7f), Vector2(0.25f, 0.25f)); // 3a 9
+ AddVertex(vertices, Vector3( 0.0f, sz*0.3f, -sz*0.7f), Vector2(0.25f, 0.25f)); // 3b 10
+ AddVertex(vertices, Vector3( 0.0f, sz*0.3f, -sz*0.7f), Vector2(0.25f, 0.25f)); // 3c 11
+}
+
+void ConstructFaces(MeshData::VertexContainer& vertices, MeshData::FaceIndices& faces)
+{
+ AddTriangle(vertices, faces, 0, 6, 3); // 0, 2, 1 back, right, left (ac)
+ AddTriangle(vertices, faces, 1, 9, 7); // 0, 3, 2 back, top , right (ac)
+ AddTriangle(vertices, faces, 2, 4, 10); // 0, 1, 3 back, left, top (ac)
+ AddTriangle(vertices, faces, 11, 5, 8); // 3, 1, 2 top, left, right (ac)
+}
+
+Material ConstructMaterial()
+{
+ Material customMaterial = Material::New("CustomMaterial");
+ customMaterial.SetOpacity(.76f);
+ customMaterial.SetDiffuseColor(Vector4(0.8f, 0.0f, 0.4f, 1.0f));
+ customMaterial.SetAmbientColor(Vector4(0.2f, 1.0f, 0.6f, 1.0f));
+ customMaterial.SetSpecularColor(Vector4(0.5f, 0.6f, 0.7f, 1.0f));
+ return customMaterial;
+}
+
+
+Mesh ConstructMesh( float sz )
+{
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ ConstructVertices( vertices, sz );
+ ConstructFaces(vertices, faces);
+ Material customMaterial = ConstructMaterial();
+
+ MeshData meshData;
+ BoneContainer bones;
+ meshData.SetData(vertices, faces, bones, customMaterial);
+ meshData.SetHasNormals(true);
+ meshData.SetHasTextureCoords(true);
+
+ Mesh mesh = Mesh::New(meshData);
+ return mesh;
+}
+
+
+void AddBone(Dali::BoneContainer& bones, const std::string& name, const Dali::Matrix& offsetMatrix)
+{
+ bones.push_back(Bone(name, offsetMatrix));
+}
+
+void CreateMeshData(MeshData& meshData)
+{
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ Dali::BoneContainer bones;
+ AddBone(bones, "trunk", Matrix::IDENTITY);
+ AddBone(bones, "branch", Matrix::IDENTITY);
+ AddBone(bones, "twig", Matrix::IDENTITY);
+ ConstructVertices( vertices, 50 );
+ ConstructFaces(vertices, faces);
+ Material customMaterial = ConstructMaterial();
+ meshData.SetData(vertices, faces, bones, customMaterial);
+ meshData.SetHasNormals(true);
+ meshData.SetHasTextureCoords(true);
+}
+
+Dali::ModelData BuildTreeModel()
+{
+ Dali::ModelData modelData = Dali::ModelData::New("TreeModel");
+
+ MeshData meshData;
+ CreateMeshData(meshData);
+ modelData.AddMesh(meshData);
+
+ Dali::Entity rootEntity = Dali::Entity::New("root");
+ Dali::Entity e1 = Dali::Entity::New("trunk");
+ Dali::Entity e2 = Dali::Entity::New("branch");
+ Dali::Entity e3 = Dali::Entity::New("twig");
+ Dali::Entity e4 = Dali::Entity::New("leaf");
+
+ rootEntity.SetType(Dali::Entity::OBJECT);
+ e1.SetType(Dali::Entity::OBJECT);
+ e2.SetType(Dali::Entity::OBJECT);
+ e3.SetType(Dali::Entity::OBJECT);
+ e4.SetType(Dali::Entity::OBJECT);
+ e4.AddMeshIndex(0);
+
+ modelData.SetRootEntity(rootEntity);
+ rootEntity.Add(e1);
+ e1.Add(e2);
+ e2.Add(e3);
+ e2.Add(e4);
+
+ EntityAnimatorMap twigAnimator("TwigAnim");
+ twigAnimator.SetEntityName("twig");
+
+ KeyFrames pKF1 = KeyFrames::New();
+ pKF1.Add(0.0f, Vector3(2.0f, 1.0f, 0.0f));
+ pKF1.Add(0.5f, Vector3(3.0f, 1.0f, 5.0f));
+ pKF1.Add(1.0f, Vector3(4.0f, 1.0f, 10.0f));
+ twigAnimator.SetPositionKeyFrames(pKF1);
+
+ EntityAnimatorMap branchAnimator("BranchAnim");
+ branchAnimator.SetEntityName("branch");
+
+ KeyFrames pKF2 = KeyFrames::New();
+ pKF2.Add(0.0f, Vector3(0.0f, 1.0f, 0.0f));
+ pKF2.Add(0.25f, Vector3(-1.0f,1.0f, 5.0f));
+ pKF2.Add(0.5f, Vector3(0.0f, 1.0f, 10.0f));
+ pKF2.Add(0.75f, Vector3(1.0f, 1.0f, 5.0f));
+ pKF2.Add(1.0f, Vector3(0.0f, 1.0f, 10.0f));
+ branchAnimator.SetPositionKeyFrames(pKF2);
+
+ ModelAnimationMap modelAnim;
+ modelAnim.name = "Anim1";
+ modelAnim.duration = 10.0f;
+ modelAnim.animators.push_back(branchAnimator);
+ modelAnim.animators.push_back(twigAnimator);
+
+ modelData.GetAnimationMapContainer().push_back(modelAnim);
+
+ return modelData;
+}
+
+} // namespace Dali
--- /dev/null
+#ifndef MESH_BUILDER_H
+#define MESH_BUILDER_H
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+
+namespace Dali
+{
+
+void AddVertex( MeshData::VertexContainer& verts, Vector3 V, Vector2 UV );
+void SetNormal( MeshData::VertexContainer& verts, size_t vertIdx, Vector3 normal );
+void SetBone( MeshData::VertexContainer& verts, size_t vertIdx, size_t index, size_t boneIndex, float weight);
+void SetBones(MeshData::VertexContainer& verts);
+void ConstructBones(BoneContainer& bones);
+void CopyVertex( MeshData::Vertex& vert, Vector3& vector );
+void AddTriangle( MeshData::VertexContainer& verts,
+ MeshData::FaceIndices& faces,
+ size_t v0, size_t v1, size_t v2 );
+void ConstructVertices( MeshData::VertexContainer& vertices, float sz );
+void ConstructFaces(MeshData::VertexContainer& vertices, MeshData::FaceIndices& faces);
+Material ConstructMaterial();
+Mesh ConstructMesh( float sz );
+void AddBone(Dali::BoneContainer& bones, const std::string& name, const Dali::Matrix& offsetMatrix);
+void CreateMeshData(MeshData& meshData);
+Dali::ModelData BuildTreeModel();
+
+}
+
+#endif // MESH_BUILDER_H
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "test-dynamics.h"
+
+using namespace Dali;
+
+namespace Dali
+{
+
+
+TestDynamicsJoint::TestDynamicsJoint( TraceCallStack& trace )
+: mTrace( trace )
+{
+ mTrace.PushCall( "DynamicsJoint::DynamicsJoint", "" );
+}
+
+TestDynamicsJoint::~TestDynamicsJoint()
+{
+ mTrace.PushCall( "DynamicsJoint::~DynamicsJoint", "" );
+}
+
+void TestDynamicsJoint::Initialize(
+ Integration::DynamicsBody* bodyA, const Vector3& positionA, const Quaternion& rotationA, const Vector3& offsetA,
+ Integration::DynamicsBody* bodyB, const Vector3& positionB, const Quaternion& rotationB, const Vector3& offsetB )
+{
+ mTrace.PushCall( "DynamicsJoint::Initialize", "" );
+}
+
+void TestDynamicsJoint::SetLimit( const int axisIndex, const float lowerLimit, const float upperLimit )
+{
+ mTrace.PushCall( "DynamicsJoint::SetLimit", "" );
+}
+
+void TestDynamicsJoint::EnableSpring( int axisIndex, bool flag )
+{
+ mTrace.PushCall( "DynamicsJoint::EnableSpring", "" );
+}
+
+void TestDynamicsJoint::SetSpringStiffness( int axisIndex, float stiffness )
+{
+ mTrace.PushCall( "DynamicsJoint::SetSpringStiffness", "" );
+}
+
+void TestDynamicsJoint::SetSpringDamping( int axisIndex, float damping )
+{
+ mTrace.PushCall( "DynamicsJoint::SetSpringDamping", "" );
+}
+
+void TestDynamicsJoint::SetSpringCenterPoint( int axisIndex, float ratio )
+{
+ mTrace.PushCall( "DynamicsJoint::SetSpringCenterPoint", "" );
+}
+
+void TestDynamicsJoint::EnableMotor( int axisIndex, bool flag )
+{
+ mTrace.PushCall( "DynamicsJoint::EnableMotor", "" );
+}
+
+void TestDynamicsJoint::SetMotorVelocity( int axisIndex, float velocity )
+{
+ mTrace.PushCall( "DynamicsJoint::SetMotorVelocity", "" );
+}
+
+void TestDynamicsJoint::SetMotorForce( int axisIndex, float force )
+{
+ mTrace.PushCall( "DynamicsJoint::SetMotorForce", "" );
+}
+
+
+TestDynamicsShape::TestDynamicsShape( TraceCallStack& trace )
+: mVertices( NULL ),
+ mFaces( NULL ),
+ mTrace( trace )
+{
+ mTrace.PushCall( "DynamicsShape::DynamicsShape", "" );
+}
+
+TestDynamicsShape::~TestDynamicsShape()
+{
+ mTrace.PushCall( "DynamicsShape::~DynamicsShape", "" );
+}
+
+void TestDynamicsShape::Initialize( int type, const Vector3& dimensions )
+{
+ mTrace.PushCall( "DynamicsShape::Initialize", "" );
+}
+
+void TestDynamicsShape::Initialize( int type, const MeshData::VertexContainer& vertices, const MeshData::FaceIndices& faceIndices )
+{
+ mTrace.PushCall( "DynamicsShape::Initialize", "mesh" );
+}
+
+TestDynamicsBody::TestDynamicsBody( TraceCallStack& trace )
+: mSettings( NULL ),
+ mConserveVolume( false ),
+ mConserveShape( false ),
+ mKinematic( false ),
+ mActivationState( true ),
+ mCollisionGroup( 0 ),
+ mCollisionMask( 0 ),
+ mTrace( trace )
+{
+ mTrace.PushCall( "DynamicsBody::DynamicsBody", "" );
+}
+
+TestDynamicsBody::~TestDynamicsBody()
+{
+ mTrace.PushCall( "DynamicsBody::~DynamicsBody", "" );
+}
+
+TestDynamicsWorld::TestDynamicsWorld( TraceCallStack& trace )
+: mSettings( NULL ),
+ mTrace( trace )
+{
+ mTrace.PushCall( "DynamicsWorld::DynamicsWorld", "" );
+}
+
+TestDynamicsWorld::~TestDynamicsWorld()
+{
+ mTrace.PushCall( "DynamicsWorld::~DynamicsWorld", "" );
+}
+
+
+TestDynamicsFactory::TestDynamicsFactory( TraceCallStack& trace ) : mTrace( trace )
+{
+}
+
+TestDynamicsFactory::~TestDynamicsFactory()
+{
+}
+
+bool TestDynamicsFactory::InitializeDynamics( const Integration::DynamicsWorldSettings& worldSettings )
+{
+ mTrace.PushCall( "DynamicsFactory::InitializeDynamics", "" );
+ return true;
+}
+
+void TestDynamicsFactory::TerminateDynamics()
+{
+ mTrace.PushCall( "DynamicsFactory::InitializeDynamics", "" );
+}
+
+Integration::DynamicsWorld* TestDynamicsFactory::CreateDynamicsWorld()
+{
+ mTrace.PushCall( "DynamicsFactory::CreateDynamicsWorld", "" );
+ return new TestDynamicsWorld( mTrace );
+}
+
+Integration::DynamicsBody* TestDynamicsFactory::CreateDynamicsBody()
+{
+ mTrace.PushCall( "DynamicsFactory::CreateDynamicsBody", "" );
+ return new TestDynamicsBody( mTrace );
+}
+
+Integration::DynamicsJoint* TestDynamicsFactory::CreateDynamicsJoint()
+{
+ mTrace.PushCall( "DynamicsFactory::CreateDynamicsJoint", "" );
+ return new TestDynamicsJoint( mTrace );
+}
+
+Integration::DynamicsShape* TestDynamicsFactory::CreateDynamicsShape()
+{
+ mTrace.PushCall( "DynamicsFactory::CreateDynamicsShape", "" );
+ return new TestDynamicsShape( mTrace );
+}
+
+
+} //namespace Dali
--- /dev/null
+#ifndef __TEST_DYNAMICS_H__
+#define __TEST_DYNAMICS_H__
+
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <dali/integration-api/dynamics/dynamics-body-intf.h>
+#include <dali/integration-api/dynamics/dynamics-body-settings.h>
+#include <dali/integration-api/dynamics/dynamics-joint-intf.h>
+#include <dali/integration-api/dynamics/dynamics-shape-intf.h>
+#include <dali/integration-api/dynamics/dynamics-world-intf.h>
+#include <dali/integration-api/dynamics/dynamics-world-settings.h>
+#include <dali/integration-api/dynamics/dynamics-factory-intf.h>
+
+#include <test-trace-call-stack.h>
+
+namespace Dali
+{
+
+class TestDynamicsJoint : public Integration::DynamicsJoint
+{
+public:
+ TestDynamicsJoint( TraceCallStack& trace );
+ virtual ~TestDynamicsJoint();
+
+public: // From Dali::Integration::DynamicsJoint
+
+ void Initialize( Integration::DynamicsBody* bodyA, const Vector3& positionA, const Quaternion& rotationA, const Vector3& offsetA,
+ Integration::DynamicsBody* bodyB, const Vector3& positionB, const Quaternion& rotationB, const Vector3& offsetB );
+ void SetLimit( const int axisIndex, const float lowerLimit, const float upperLimit );
+ void EnableSpring( int axisIndex, bool flag );
+ void SetSpringStiffness( int axisIndex, float stiffness );
+ void SetSpringDamping( int axisIndex, float damping );
+ void SetSpringCenterPoint( int axisIndex, float ratio );
+ void EnableMotor( int axisIndex, bool flag );
+ void SetMotorVelocity( int axisIndex, float velocity );
+ void SetMotorForce( int axisIndex, float force );
+
+private:
+
+ TraceCallStack& mTrace;
+
+}; // class TestDynamicsJoint
+
+class TestDynamicsShape : public Integration::DynamicsShape
+{
+public:
+
+ TestDynamicsShape( TraceCallStack& trace );
+ virtual ~TestDynamicsShape();
+
+public:
+ void Initialize( int type, const Vector3& dimensions );
+
+ void Initialize( int type, const MeshData::VertexContainer& vertices, const MeshData::FaceIndices& faceIndices );
+
+public:
+
+ MeshData::VertexContainer* mVertices;
+ MeshData::FaceIndices* mFaces;
+
+private:
+
+ TraceCallStack& mTrace;
+
+}; // class TestDynamicsShape
+
+class TestDynamicsBody : public Integration::DynamicsBody
+{
+public:
+ TestDynamicsBody( TraceCallStack& trace );
+
+ virtual ~TestDynamicsBody();
+
+public: // From Dali::Integration::DynamicsBody
+
+ inline void Initialize( const Integration::DynamicsBodySettings& bodySettings, Integration::DynamicsShape* shape,
+ Integration::DynamicsWorld& dynamicsWorld,
+ const Vector3& startPosition, const Quaternion& startRotation )
+ {
+ mTrace.PushCall( "DynamicsBody::~DynamicsBody", "" );
+ }
+
+ inline void SetMass( float mass )
+ {
+ mTrace.PushCall( "DynamicsBody::SetMass", "" );
+ }
+
+ inline void SetElasticity( float elasticity )
+ {
+ mTrace.PushCall( "DynamicsBody::SetElasticity", "" );
+ }
+
+ inline void SetLinearVelocity( const Vector3& velocity )
+ {
+ mTrace.PushCall( "DynamicsBody::SetLinearVelocity", "" );
+ }
+
+ inline Vector3 GetLinearVelocity() const
+ {
+ mTrace.PushCall( "DynamicsBody::GetLinearVelocity", "" );
+ return Vector3::ZERO;
+ }
+
+ inline void SetAngularVelocity( const Vector3& velocity )
+ {
+ mTrace.PushCall( "DynamicsBody::SetAngularVelocity", "" );
+ }
+
+ inline Vector3 GetAngularVelocity() const
+ {
+ mTrace.PushCall( "DynamicsBody::GetAngularVelocity", "" );
+ return Vector3::ZERO;
+ }
+
+ inline void SetKinematic( bool flag )
+ {
+ mTrace.PushCall( "DynamicsBody::SetKinematic", "" );
+ }
+
+ inline bool IsKinematic() const
+ {
+ mTrace.PushCall( "DynamicsBody::IsKinematic", "" );
+ return mKinematic;
+ }
+
+ inline void SetSleepEnabled( bool flag )
+ {
+ mTrace.PushCall( "DynamicsBody::SetSleepEnabled", "" );
+ }
+
+ inline void WakeUp()
+ {
+ mTrace.PushCall( "DynamicsBody::WakeUp", "" );
+ }
+
+ inline void AddAnchor( unsigned int index, const Integration::DynamicsBody* anchorBody, bool collisions )
+ {
+ mTrace.PushCall( "DynamicsBody::AddAnchor", "" );
+ }
+
+ inline void ConserveVolume( bool flag )
+ {
+ mTrace.PushCall( "DynamicsBody::ConserveVolume", "" );
+ }
+
+ inline void ConserveShape( bool flag )
+ {
+ mTrace.PushCall( "DynamicsBody::ConserveShape", "" );
+ }
+
+ inline short int GetCollisionGroup() const
+ {
+ mTrace.PushCall( "DynamicsBody::GetCollisionGroup", "" );
+ return mCollisionGroup;
+ }
+
+ inline void SetCollisionGroup( short int collisionGroup )
+ {
+ mTrace.PushCall( "DynamicsBody::SetCollisionGroup", "" );
+ mCollisionGroup = collisionGroup;
+ }
+
+ inline short int GetCollisionMask() const
+ {
+ mTrace.PushCall( "DynamicsBody::GetCollisionMask", "" );
+ return mCollisionMask;
+ }
+
+ inline void SetCollisionMask( short int collisionMask )
+ {
+ mTrace.PushCall( "DynamicsBody::SetCollisionMask", "" );
+ mCollisionMask = collisionMask;
+ }
+
+ inline int GetType() const
+ {
+ mTrace.PushCall( "DynamicsBody::GetType", "" );
+ return mSettings->type;
+ }
+
+ inline bool IsActive() const
+ {
+ mTrace.PushCall( "DynamicsBody::IsActive", "" );
+ return mActivationState;
+ }
+
+ inline void SetTransform( const Vector3& position, const Quaternion& rotation )
+ {
+ mTrace.PushCall( "DynamicsBody::SetTransform", "" );
+ }
+
+ inline void GetTransform( Vector3& position, Quaternion& rotation )
+ {
+ mTrace.PushCall( "DynamicsBody::GetTransform", "" );
+ }
+
+ inline void GetSoftVertices( MeshData::VertexContainer& vertices ) const
+ {
+ mTrace.PushCall( "DynamicsBody::GetSoftVertices", "" );
+ }
+
+private:
+ Dali::Integration::DynamicsBodySettings* mSettings;
+ bool mConserveVolume:1;
+ bool mConserveShape:1;
+ bool mKinematic:1;
+ bool mActivationState:1;
+
+ short int mCollisionGroup;
+ short int mCollisionMask;
+
+ TraceCallStack& mTrace;
+}; // class TestDynamicsBody
+
+class TestDynamicsWorld : public Dali::Integration::DynamicsWorld
+{
+public:
+
+ TestDynamicsWorld( TraceCallStack& trace );
+
+ virtual ~TestDynamicsWorld();
+
+ inline void Initialize( const Dali::Integration::DynamicsWorldSettings& worldSettings )
+ {
+
+ mTrace.PushCall( "DynamicsWorld::Initialize", "" );
+ }
+
+ inline void AddBody( Dali::Integration::DynamicsBody* body )
+ {
+ mTrace.PushCall( "DynamicsWorld::AddBody", "" );
+ }
+
+ inline void RemoveBody( Dali::Integration::DynamicsBody* body )
+ {
+ mTrace.PushCall( "DynamicsWorld::RemoveBody", "" );
+ }
+
+ inline void AddJoint( Dali::Integration::DynamicsJoint* joint )
+ {
+ mTrace.PushCall( "DynamicsWorld::AddJoint", "" );
+ }
+
+ inline void RemoveJoint( Dali::Integration::DynamicsJoint* joint )
+ {
+ mTrace.PushCall( "DynamicsWorld::RemoveJoint", "" );
+ }
+
+ inline void SetGravity( const Vector3& gravity )
+ {
+ mTrace.PushCall( "DynamicsWorld::SetGravity", "" );
+ }
+
+ inline void SetDebugDrawMode(int mode)
+ {
+ mTrace.PushCall( "DynamicsWorld::SetDebugDrawMode", "" );
+ }
+
+ inline const Integration::DynamicsDebugVertexContainer& DebugDraw()
+ {
+ mTrace.PushCall( "DynamicsWorld::DebugDraw", "" );
+ return mDebugVertices;
+ }
+
+ inline void Update( float elapsedSeconds )
+ {
+ mTrace.PushCall( "DynamicsWorld::Update", "" );
+ }
+
+ inline void CheckForCollisions( Integration::CollisionDataContainer& contacts )
+ {
+ mTrace.PushCall( "DynamicsWorld::CheckForCollisions", "" );
+ }
+
+private:
+ Dali::Integration::DynamicsWorldSettings* mSettings;
+ Dali::Integration::DynamicsDebugVertexContainer mDebugVertices;
+
+ TraceCallStack& mTrace;
+
+}; // class TestDynamicsWorld
+
+class TestDynamicsFactory : public Integration::DynamicsFactory
+{
+
+public:
+
+ TestDynamicsFactory( TraceCallStack& trace );
+
+ virtual ~TestDynamicsFactory();
+
+ virtual bool InitializeDynamics( const Integration::DynamicsWorldSettings& worldSettings );
+
+ virtual void TerminateDynamics();
+
+ virtual Integration::DynamicsWorld* CreateDynamicsWorld();
+ virtual Integration::DynamicsBody* CreateDynamicsBody();
+
+ virtual Integration::DynamicsJoint* CreateDynamicsJoint();
+
+ virtual Integration::DynamicsShape* CreateDynamicsShape();
+
+ TraceCallStack& mTrace;
+}; // class TestDynamicsFactory
+
+} // Dali
+
+#endif // __TEST_DYNAMICS_H__
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "test-platform-abstraction.h"
+#include "dali-test-suite-utils.h"
+#include <dali/integration-api/bitmap.h>
+
+namespace Dali
+{
+
+/**
+ * Constructor
+ */
+TestPlatformAbstraction::TestPlatformAbstraction()
+: mRequest(0),
+ mDynamicsFactory(NULL)
+{
+ Initialize();
+}
+
+/**
+ * Destructor
+ */
+TestPlatformAbstraction::~TestPlatformAbstraction()
+{
+ delete mDynamicsFactory;
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetTimeMicroseconds()
+ */
+void TestPlatformAbstraction::GetTimeMicroseconds(unsigned int &seconds, unsigned int µSeconds)
+{
+ seconds = mSeconds;
+ microSeconds = mMicroSeconds;
+ mTrace.PushCall("GetTimeMicroseconds", "");
+}
+
+/**
+ * @copydoc PlatformAbstraction::Suspend()
+ */
+void TestPlatformAbstraction::Suspend()
+{
+ mTrace.PushCall("Suspend", "");
+}
+
+/**
+ * @copydoc PlatformAbstraction::Resume()
+ */
+void TestPlatformAbstraction::Resume()
+{
+ mTrace.PushCall("Resume", "");
+}
+
+void TestPlatformAbstraction::GetClosestImageSize( const std::string& filename,
+ const ImageAttributes& attributes,
+ Vector2& closestSize)
+{
+ closestSize = mClosestSize;
+ mTrace.PushCall("GetClosestImageSize", "");
+}
+
+void TestPlatformAbstraction::GetClosestImageSize( Integration::ResourcePointer resourceBuffer,
+ const ImageAttributes& attributes,
+ Vector2& closestSize)
+{
+ closestSize = mClosestSize;
+ mTrace.PushCall("GetClosestImageSize", "");
+}
+
+
+/**
+ * @copydoc PlatformAbstraction::LoadResource()
+ */
+void TestPlatformAbstraction::LoadResource(const Integration::ResourceRequest& request)
+{
+ mTrace.PushCall("LoadResource", "");
+ if(mRequest != NULL)
+ {
+ delete mRequest;
+ tet_infoline ("Warning: multiple resource requests not handled by Test Suite. You may see unexpected errors");
+ }
+ mRequest = new Integration::ResourceRequest(request);
+}
+
+Integration::ResourcePointer TestPlatformAbstraction::LoadResourceSynchronously( const Integration::ResourceType& resourceType, const std::string& resourcePath)
+{
+ mTrace.PushCall("LoadResourceSynchronously", "");
+ return mResources.loadedResource;
+}
+
+/**
+ * @copydoc PlatformAbstraction::SaveResource()
+ */
+void TestPlatformAbstraction::SaveResource(const Integration::ResourceRequest& request)
+{
+ mTrace.PushCall("SaveResource", "");
+ if(mRequest != NULL)
+ {
+ delete mRequest;
+ tet_infoline ("Warning: multiple resource requests not handled by Test Suite. You may see unexpected errors");
+ }
+ mRequest = new Integration::ResourceRequest(request);
+}
+
+/**
+ * @copydoc PlatformAbstraction::CancelLoad()
+ */
+void TestPlatformAbstraction::CancelLoad(Integration::ResourceId id, Integration::ResourceTypeId typeId)
+{
+ mTrace.PushCall("CancelLoad", "");
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetResources()
+ */
+void TestPlatformAbstraction::GetResources(Integration::ResourceCache& cache)
+{
+ mTrace.PushCall("GetResources", "");
+
+ if(mResources.loaded)
+ {
+ cache.LoadResponse( mResources.loadedId, mResources.loadedType, mResources.loadedResource, Integration::RESOURCE_COMPLETELY_LOADED );
+ }
+ if(mResources.loadFailed)
+ {
+ cache.LoadFailed( mResources.loadFailedId, mResources.loadFailure );
+ }
+ if(mResources.saved)
+ {
+ cache.SaveComplete( mResources.savedId, mResources.savedType );
+ }
+ if(mResources.saveFailed)
+ {
+ cache.SaveFailed( mResources.saveFailedId, mResources.saveFailure );
+ }
+}
+
+/**
+ * @copydoc PlatformAbstraction::IsLoading()
+ */
+bool TestPlatformAbstraction::IsLoading()
+{
+ mTrace.PushCall("IsLoading", "");
+ return mIsLoadingResult;
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetDefaultFontFamily()
+ */
+std::string TestPlatformAbstraction::GetDefaultFontFamily() const
+{
+ mTrace.PushCall("GetDefaultFontFamily", "");
+ return mGetDefaultFontFamilyResult;
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetDefaultFontSize()
+ */
+const float TestPlatformAbstraction::GetDefaultFontSize() const
+{
+ mTrace.PushCall("GetDefaultFontSize", "");
+ return mGetDefaultFontSizeResult;
+}
+
+const PixelSize TestPlatformAbstraction::GetFontLineHeightFromCapsHeight(const std::string& fontFamily, const std::string& fontStyle, const CapsHeight& capsHeight) const
+{
+ mTrace.PushCall("GetFontLineHeightFromCapsHeight", "");
+ // LineHeight will be bigger than CapsHeight, so return capsHeight + 1
+ return PixelSize(capsHeight + 1);
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetGlyphData()
+ */
+
+Integration::GlyphSet* TestPlatformAbstraction::GetGlyphData ( const Integration::TextResourceType& textRequest,
+ const std::string& fontFamily,
+ bool getBitmap) const
+{
+ if( getBitmap )
+ {
+ mTrace.PushCall("GetGlyphData", "getBitmap:true");
+ }
+ else
+ {
+ mTrace.PushCall("GetGlyphData", "getBitmap:false");
+ }
+
+ // It creates fake metrics for the received characters.
+
+ Integration::GlyphSet* set = new Dali::Integration::GlyphSet();
+ Integration::BitmapPtr bitmapData;
+
+ std::set<uint32_t> characters;
+
+ for( Integration::TextResourceType::CharacterList::const_iterator it = textRequest.mCharacterList.begin(), endIt = textRequest.mCharacterList.end(); it != endIt; ++it )
+ {
+ if( characters.find( it->character ) == characters.end() )
+ {
+ characters.insert( it->character );
+ Integration::GlyphMetrics character = {it->character, Integration::GlyphMetrics::LOW_QUALITY, 10.0f, 10.0f, 9.0f, 1.0f, 10.0f, it->xPosition, it->yPosition };
+
+ if( getBitmap )
+ {
+ bitmapData = Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true);
+ bitmapData->GetPackedPixelsProfile()->ReserveBuffer(Pixel::A8, 64, 64);
+ PixelBuffer* pixelBuffer = bitmapData->GetBuffer();
+ memset( pixelBuffer, it->character, 64*64 );
+ }
+
+ set->AddCharacter(bitmapData, character);
+ }
+ }
+
+ set->mLineHeight = 10.0f;
+ set->mAscender = 9.0f;
+ set->mUnitsPerEM = 2048.0f/64.0f;
+ set->SetAtlasResourceId( textRequest.mTextureAtlasId );
+ set->mFontHash = textRequest.mFontHash;
+
+ return set;
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetCachedGlyphData()
+ */
+
+Integration::GlyphSet* TestPlatformAbstraction::GetCachedGlyphData( const Integration::TextResourceType& textRequest,
+ const std::string& fontFamily ) const
+{
+ mTrace.PushCall("GetCachedGlyphData", "");
+
+ // It creates fake metrics and bitmap for received numeric characters '0' through '9'.
+ Integration::GlyphSet* set = new Dali::Integration::GlyphSet();
+ Integration::BitmapPtr bitmapData;
+
+ std::set<uint32_t> characters;
+
+ for( Integration::TextResourceType::CharacterList::const_iterator it = textRequest.mCharacterList.begin(), endIt = textRequest.mCharacterList.end(); it != endIt; ++it )
+ {
+ if( it->character >= '0' && it->character <= '9' && characters.find( it->character ) == characters.end() )
+ {
+ characters.insert( it->character );
+ Integration::GlyphMetrics character = {it->character, Integration::GlyphMetrics::HIGH_QUALITY, 10.0f, 10.0f, 9.0f, 1.0f, 10.0f, it->xPosition, it->yPosition };
+
+ bitmapData = Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true);
+ bitmapData->GetPackedPixelsProfile()->ReserveBuffer(Pixel::A8, 64, 64);
+ PixelBuffer* pixelBuffer = bitmapData->GetBuffer();
+ memset( pixelBuffer, it->character, 64*64 );
+ set->AddCharacter(bitmapData, character);
+ }
+ }
+
+ set->mLineHeight = 10.0f;
+ set->mAscender = 9.0f;
+ set->mUnitsPerEM = 2048.0f/64.0f;
+ set->SetAtlasResourceId( textRequest.mTextureAtlasId );
+ set->mFontHash = textRequest.mFontHash;
+
+ return set;
+}
+
+
+/**
+ * @copydoc PlatformAbstraction::GetGlobalMetrics()
+ */
+void TestPlatformAbstraction::GetGlobalMetrics( const std::string& fontFamily,
+ const std::string& fontStyle,
+ Integration::GlobalMetrics& globalMetrics ) const
+{
+ globalMetrics.lineHeight = 10.0f;
+ globalMetrics.ascender = 9.0f;
+ globalMetrics.unitsPerEM = 2048.0f/64.0f;
+ globalMetrics.underlineThickness = 2.f;
+ globalMetrics.underlinePosition = 1.f;
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetFontPath()
+ */
+std::string TestPlatformAbstraction::GetFontPath(const std::string& family, bool bold, bool italic) const
+{
+ mTrace.PushCall("GetFontPath", "");
+ return mGetFontPathResult;
+
+ // Do nothing with arguments
+}
+
+/**
+ * @copydoc PlatformAbstraction::SetDpi()
+ */
+void TestPlatformAbstraction::SetDpi (unsigned int dpiHorizontal, unsigned int dpiVertical)
+{
+ mTrace.PushCall("SetDpi", "");
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetFontFamilyForChars()
+ */
+std::string TestPlatformAbstraction::GetFontFamilyForChars(const TextArray& charsRequested) const
+{
+ mTrace.PushCall("GetFontFamilyForChars", "");
+ return mGetDefaultFontFamilyResult;
+}
+
+/**
+ * @copydoc PlatformAbstraction::AllGlyphsSupported()
+ */
+bool TestPlatformAbstraction::AllGlyphsSupported(const std::string& name, const std::string& fontStyle, const TextArray& text) const
+{
+ mTrace.PushCall("AllGlyphsSupported", "");
+ return true;
+}
+
+/**
+ * @copydoc PlatformAbstraction::ValidateFontFamilyName()
+ */
+bool TestPlatformAbstraction::ValidateFontFamilyName(const std::string& fontFamily, const std::string& fontStyle, bool& isDefaultSystemFont, std::string& closestMatch, std::string& closestStyleMatch) const
+{
+ mTrace.PushCall("ValidateFontFamilyName", "");
+ return true;
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetFontList()
+ */
+std::vector<std::string> TestPlatformAbstraction::GetFontList( PlatformAbstraction::FontListMode mode ) const
+{
+ mFontListMode = mode;
+ mTrace.PushCall("ValidateGetFontList", "");
+ std::vector<std::string> fontList;
+ return fontList;
+}
+
+/**
+ * @copydoc PlatformAbstraction::LoadFile()
+ */
+bool TestPlatformAbstraction::LoadFile( const std::string& filename, std::vector< unsigned char >& buffer ) const
+{
+ mTrace.PushCall("LoadFile", "");
+ if( mLoadFileResult.loadResult )
+ {
+ buffer = mLoadFileResult.buffer;
+ }
+
+ return mLoadFileResult.loadResult;
+}
+
+/**
+ * @copydoc PlatformAbstraction::SaveFile()
+ */
+bool TestPlatformAbstraction::SaveFile(const std::string& filename, std::vector< unsigned char >& buffer) const
+{
+ mTrace.PushCall("SaveFile", "");
+ return false;
+}
+
+void TestPlatformAbstraction::JoinLoaderThreads()
+{
+ mTrace.PushCall("JoinLoaderThreads", "");
+}
+
+void TestPlatformAbstraction::UpdateDefaultsFromDevice()
+{
+ mTrace.PushCall("UpdateDefaultsFromDevice", "");
+ mGetDefaultFontFamilyResult+=1.0f;
+}
+
+Integration::DynamicsFactory* TestPlatformAbstraction::GetDynamicsFactory()
+{
+ mTrace.PushCall("GetDynamicsFactory", "");
+ if( mDynamicsFactory == NULL )
+ {
+ mDynamicsFactory = new TestDynamicsFactory( mTrace );
+ }
+ return mDynamicsFactory;
+}
+
+bool TestPlatformAbstraction::ReadGlobalMetricsFromCache( const std::string& fontFamily,
+ const std::string& fontStyle,
+ Integration::GlobalMetrics& globalMetrics )
+{
+ mTrace.PushCall("ReadGlobalMetricsFromCacheFile", "");
+ globalMetrics = mReadGlobalMetrics; // Want to copy contents...
+ return mReadGlobalMetricsResult; // Default false (will be set to true on subsequent write)
+}
+
+void TestPlatformAbstraction::WriteGlobalMetricsToCache( const std::string& fontFamily,
+ const std::string& fontStyle,
+ const Integration::GlobalMetrics& globalMetrics )
+{
+ // Copy so next read uses written values. TODO: Could add method
+ // to turn this behaviour off for more extensive testing.
+ mReadGlobalMetrics = globalMetrics;
+ mReadGlobalMetricsResult = true;
+
+ mTrace.PushCall("WriteGlobalMetricsToCacheFile", "");
+}
+
+bool TestPlatformAbstraction::ReadMetricsFromCache( const std::string& fontFamily,
+ const std::string& fontStyle,
+ std::vector<Integration::GlyphMetrics>& glyphMetricsContainer )
+{
+ mTrace.PushCall("ReadMetricsFromCacheFile", "");
+ glyphMetricsContainer = mReadMetrics;
+ return mReadMetricsResult; // Default false (will be set to true on subsequent write)
+}
+
+void TestPlatformAbstraction::WriteMetricsToCache( const std::string& fontFamily,
+ const std::string& fontStyle,
+ const Integration::GlyphSet& glyphSet )
+{
+ // Copy so next read uses written values. TODO: Could add method
+ // to turn this behaviour off for more extensive testing.
+ const Integration::GlyphSet::CharacterList& charList = glyphSet.GetCharacterList();
+ mReadMetrics.clear();
+ for(std::size_t i=0, end=charList.size(); i<end; ++i)
+ {
+ mReadMetrics.push_back(charList[i].second);
+ }
+ mReadMetricsResult = true;
+
+ mTrace.PushCall("WriteMetricsToCacheFile", "");
+}
+
+void TestPlatformAbstraction::GetFileNamesFromDirectory( const std::string& directoryName,
+ std::vector<std::string>& fileNames )
+{
+ fileNames.push_back( std::string( "u1f004.png" ) );
+ fileNames.push_back( std::string( "u1f0cf.png" ) );
+ fileNames.push_back( std::string( "u1f170.png" ) );
+ fileNames.push_back( std::string( "u1f601.png" ) );
+}
+
+Integration::BitmapPtr TestPlatformAbstraction::GetGlyphImage( const std::string& fontFamily, const std::string& fontStyle, float fontSize, uint32_t character ) const
+{
+ Integration::BitmapPtr image = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ image->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 1, 1 );
+
+ mTrace.PushCall("GetGlyphImage", "");
+
+ return image;
+}
+
+
+/** Call this every test */
+void TestPlatformAbstraction::Initialize()
+{
+ mTrace.Reset();
+ mTrace.Enable(true);
+ memset(&mResources, 0, sizeof(Resources));
+ memset(&mReadGlobalMetrics, 0, sizeof(Integration::GlobalMetrics));
+ mSeconds=0;
+ mMicroSeconds=0;
+ mIsLoadingResult=false;
+ mGetDefaultFontFamilyResult = "HelveticaNeue";
+ mGetDefaultFontSizeResult=12.0f;
+ mGetFontPathResult="helvetica-12";
+ mReadMetricsResult=false;
+ mReadGlobalMetricsResult=false;
+
+ if(mRequest)
+ {
+ delete mRequest;
+ mRequest = 0;
+ }
+}
+
+
+bool TestPlatformAbstraction::WasCalled(TestFuncEnum func)
+{
+ switch(func)
+ {
+ case GetTimeMicrosecondsFunc: return mTrace.FindMethod("GetTimeMicroseconds");
+ case SuspendFunc: return mTrace.FindMethod("Suspend");
+ case ResumeFunc: return mTrace.FindMethod("Resume");
+ case LoadResourceFunc: return mTrace.FindMethod("LoadResource");
+ case SaveResourceFunc: return mTrace.FindMethod("SaveResource");
+ case LoadFileFunc: return mTrace.FindMethod("LoadFile");
+ case SaveFileFunc: return mTrace.FindMethod("SaveFile");
+ case CancelLoadFunc: return mTrace.FindMethod("CancelLoad");
+ case GetResourcesFunc: return mTrace.FindMethod("GetResources");
+ case IsLoadingFunc: return mTrace.FindMethod("IsLoading");
+ case GetDefaultFontFamilyFunc: return mTrace.FindMethod("GetDefaultFontFamily");
+ case GetDefaultFontSizeFunc: return mTrace.FindMethod("GetDefaultFontSize");
+ case GetFontLineHeightFromCapsHeightFunc: return mTrace.FindMethod("GetFontLineHeightFromCapsHeight");
+ case GetGlyphDataFunc: return mTrace.FindMethod("GetGlyphData");
+ case GetCachedGlyphDataFunc: return mTrace.FindMethod("GetCachedGlyphData");
+ case GetFontPathFunc: return mTrace.FindMethod("GetFontPath");
+ case SetDpiFunc: return mTrace.FindMethod("SetDpi");
+ case JoinLoaderThreadsFunc: return mTrace.FindMethod("JoinLoaderThreads");
+ case GetFontFamilyForCharsFunc: return mTrace.FindMethod("GetFontFamilyForChars");
+ case AllGlyphsSupportedFunc: return mTrace.FindMethod("AllGlyphsSupported");
+ case ValidateFontFamilyNameFunc: return mTrace.FindMethod("ValidateFontFamilyName");
+ case UpdateDefaultsFromDeviceFunc: return mTrace.FindMethod("UpdateDefaultsFromDevice");
+ case GetDynamicsFactoryFunc: return mTrace.FindMethod("GetDynamicsFactory");
+ case ValidateGetFontListFunc: return mTrace.FindMethod("ValidateGetFontList");
+ case ReadGlobalMetricsFromCacheFileFunc: return mTrace.FindMethod("ReadGlobalMetricsFromCacheFile");
+ case WriteGlobalMetricsToCacheFileFunc: return mTrace.FindMethod("WriteGlobalMetricsToCacheFile");
+ case ReadMetricsFromCacheFileFunc: return mTrace.FindMethod("ReadMetricsFromCacheFile");
+ case WriteMetricsToCacheFileFunc: return mTrace.FindMethod("WriteMetricsToCacheFile");
+ }
+ return false;
+}
+
+void TestPlatformAbstraction::SetGetTimeMicrosecondsResult(size_t sec, size_t usec)
+{
+ mSeconds = sec;
+ mMicroSeconds = usec;
+}
+
+void TestPlatformAbstraction::IncrementGetTimeResult(size_t milliseconds)
+{
+ mMicroSeconds += milliseconds * 1000u;
+ unsigned int additionalSeconds = mMicroSeconds / 1000000u;
+
+ mSeconds += additionalSeconds;
+ mMicroSeconds -= additionalSeconds * 1000000u;
+}
+
+void TestPlatformAbstraction::SetIsLoadingResult(bool result)
+{
+ mIsLoadingResult = result;
+}
+
+void TestPlatformAbstraction::SetGetDefaultFontFamilyResult(std::string result)
+{
+ mGetDefaultFontFamilyResult = result;
+}
+
+void TestPlatformAbstraction::SetGetDefaultFontSizeResult(float result)
+{
+ mGetDefaultFontSizeResult = result;
+}
+
+void TestPlatformAbstraction::SetGetFontPathResult(std::string& result)
+{
+ mGetFontPathResult = result;
+}
+
+void TestPlatformAbstraction::ClearReadyResources()
+{
+ memset(&mResources, 0, sizeof(Resources));
+}
+
+void TestPlatformAbstraction::SetResourceLoaded(Integration::ResourceId loadedId,
+ Integration::ResourceTypeId loadedType,
+ Integration::ResourcePointer loadedResource)
+{
+ mResources.loaded = true;
+ mResources.loadedId = loadedId;
+ mResources.loadedType = loadedType;
+ mResources.loadedResource = loadedResource;
+}
+
+void TestPlatformAbstraction::SetResourceLoadFailed(Integration::ResourceId id,
+ Integration::ResourceFailure failure)
+{
+ mResources.loadFailed = true;
+ mResources.loadFailedId = id;
+ mResources.loadFailure = failure;
+}
+
+void TestPlatformAbstraction::SetResourceSaved(Integration::ResourceId savedId,
+ Integration::ResourceTypeId savedType)
+{
+ mResources.saved = true;
+ mResources.savedId = savedId;
+ mResources.savedType = savedType;
+}
+
+void TestPlatformAbstraction::SetResourceSaveFailed(Integration::ResourceId id,
+ Integration::ResourceFailure failure)
+{
+ mResources.saveFailed = true;
+ mResources.saveFailedId = id;
+ mResources.saveFailure = failure;
+}
+
+Integration::ResourceRequest* TestPlatformAbstraction::GetRequest()
+{
+ return mRequest;
+}
+
+void TestPlatformAbstraction::DiscardRequest()
+{
+ delete mRequest;
+ mRequest = NULL;
+}
+
+void TestPlatformAbstraction::SetClosestImageSize(const Vector2& size)
+{
+ mClosestSize = size;
+}
+
+void TestPlatformAbstraction::SetLoadFileResult( bool result, std::vector< unsigned char >& buffer )
+{
+ mLoadFileResult.loadResult = result;
+ if( result )
+ {
+ mLoadFileResult.buffer = buffer;
+ }
+}
+
+void TestPlatformAbstraction::SetSaveFileResult( bool result )
+{
+ mSaveFileResult = result;
+}
+
+Integration::PlatformAbstraction::FontListMode TestPlatformAbstraction::GetLastFontListMode( )
+{
+ return mFontListMode;
+}
+
+void TestPlatformAbstraction::SetReadGlobalMetricsResult( bool success, Integration::GlobalMetrics& globalMetrics )
+{
+ mReadGlobalMetricsResult = success;
+ mReadGlobalMetrics = globalMetrics;
+}
+
+void TestPlatformAbstraction::SetReadMetricsResult( bool success, std::vector<Integration::GlyphMetrics>& glyphMetricsContainer )
+{
+ mReadMetricsResult = success;
+ mReadMetrics = glyphMetricsContainer; // copy
+}
+
+} // namespace Dali
--- /dev/null
+#ifndef __DALI_TEST_PLATFORM_ABSTRACTION_H__
+#define __DALI_TEST_PLATFORM_ABSTRACTION_H__
+
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+// EXTERNAL INCLUDES
+#include <set>
+#include <stdint.h>
+#include <cstring>
+
+// INTERNAL INCLUDES
+#include <dali/integration-api/platform-abstraction.h>
+
+#include <dali/integration-api/glyph-set.h>
+#include "test-trace-call-stack.h"
+#include "test-dynamics.h"
+
+namespace Dali
+{
+
+/**
+ * Concrete implementation of the platform abstraction class.
+ */
+class DALI_IMPORT_API TestPlatformAbstraction : public Dali::Integration::PlatformAbstraction
+{
+
+public:
+
+ struct Resources
+ {
+ bool loaded;
+ Integration::ResourceId loadedId;
+ Integration::ResourceTypeId loadedType;
+ Integration::ResourcePointer loadedResource;
+
+ bool loadFailed;
+ Integration::ResourceId loadFailedId;
+ Integration::ResourceFailure loadFailure;
+
+ bool saved;
+ Integration::ResourceId savedId;
+ Integration::ResourceTypeId savedType;
+
+ bool saveFailed;
+ Integration::ResourceId saveFailedId;
+ Integration::ResourceFailure saveFailure;
+ };
+
+ struct LoadFileResult
+ {
+ inline LoadFileResult()
+ : loadResult(false)
+ {
+
+ }
+
+ bool loadResult;
+ std::vector< unsigned char> buffer;
+ };
+
+ /**
+ * Constructor
+ */
+ TestPlatformAbstraction();
+
+ /**
+ * Destructor
+ */
+ virtual ~TestPlatformAbstraction();
+
+ /**
+ * @copydoc PlatformAbstraction::GetTimeMicroseconds()
+ */
+ virtual void GetTimeMicroseconds(unsigned int &seconds, unsigned int µSeconds);
+
+ /**
+ * @copydoc PlatformAbstraction::Suspend()
+ */
+ virtual void Suspend();
+
+ /**
+ * @copydoc PlatformAbstraction::Resume()
+ */
+ virtual void Resume();
+
+ virtual void GetClosestImageSize( const std::string& filename,
+ const ImageAttributes& attributes,
+ Vector2& closestSize);
+
+ virtual void GetClosestImageSize( Integration::ResourcePointer resourceBuffer,
+ const ImageAttributes& attributes,
+ Vector2& closestSize);
+
+ /**
+ * @copydoc PlatformAbstraction::LoadResource()
+ */
+ virtual void LoadResource(const Integration::ResourceRequest& request);
+
+ virtual Integration::ResourcePointer LoadResourceSynchronously( const Integration::ResourceType& resourceType, const std::string& resourcePath);
+
+ /**
+ * @copydoc PlatformAbstraction::SaveResource()
+ */
+ virtual void SaveResource(const Integration::ResourceRequest& request);
+
+ /**
+ * @copydoc PlatformAbstraction::CancelLoad()
+ */
+ virtual void CancelLoad(Integration::ResourceId id, Integration::ResourceTypeId typeId);
+
+ /**
+ * @copydoc PlatformAbstraction::GetResources()
+ */
+ virtual void GetResources(Integration::ResourceCache& cache);
+
+ /**
+ * @copydoc PlatformAbstraction::IsLoading()
+ */
+ virtual bool IsLoading();
+
+ /**
+ * @copydoc PlatformAbstraction::GetDefaultFontFamily()
+ */
+ virtual std::string GetDefaultFontFamily() const;
+
+ /**
+ * @copydoc PlatformAbstraction::GetDefaultFontSize()
+ */
+ virtual const float GetDefaultFontSize() const;
+
+ virtual const PixelSize GetFontLineHeightFromCapsHeight(const std::string& fontFamily, const std::string& fontStyle, const CapsHeight& capsHeight) const;
+
+ /**
+ * @copydoc PlatformAbstraction::GetGlyphData()
+ */
+ virtual Integration::GlyphSet* GetGlyphData ( const Integration::TextResourceType& textRequest,
+ const std::string& fontFamily,
+ bool getBitmap) const;
+
+ /**
+ * @copydoc PlatformAbstraction::GetCachedGlyphData()
+ */
+ virtual Integration::GlyphSet* GetCachedGlyphData( const Integration::TextResourceType& textRequest,
+ const std::string& fontFamily ) const;
+
+
+ /**
+ * @copydoc PlatformAbstraction::GetGlobalMetrics()
+ */
+ virtual void GetGlobalMetrics( const std::string& fontFamily,
+ const std::string& fontStyle,
+ Integration::GlobalMetrics& globalMetrics ) const;
+
+ /**
+ * @copydoc PlatformAbstraction::GetFontPath()
+ */
+ virtual std::string GetFontPath(const std::string& family, bool bold, bool italic) const;
+
+ /**
+ * @copydoc PlatformAbstraction::SetDpi()
+ */
+ virtual void SetDpi (unsigned int dpiHorizontal, unsigned int dpiVertical);
+
+ /**
+ * @copydoc PlatformAbstraction::GetFontFamilyForChars()
+ */
+ virtual std::string GetFontFamilyForChars(const TextArray& charsRequested) const;
+
+ /**
+ * @copydoc PlatformAbstraction::AllGlyphsSupported()
+ */
+ virtual bool AllGlyphsSupported(const std::string& name, const std::string& fontStyle, const TextArray& text) const;
+
+ /**
+ * @copydoc PlatformAbstraction::ValidateFontFamilyName()
+ */
+ virtual bool ValidateFontFamilyName(const std::string& fontFamily, const std::string& fontStyle, bool& isDefaultSystemFont, std::string& closestMatch, std::string& closestStyleMatch) const;
+
+ /**
+ * @copydoc PlatformAbstraction::GetFontList()
+ */
+ virtual std::vector<std::string> GetFontList( PlatformAbstraction::FontListMode mode ) const;
+
+ /**
+ * @copydoc PlatformAbstraction::LoadFile()
+ */
+ virtual bool LoadFile( const std::string& filename, std::vector< unsigned char >& buffer ) const;
+
+ /**
+ * @copydoc PlatformAbstraction::SaveFile()
+ */
+ virtual bool SaveFile(const std::string& filename, std::vector< unsigned char >& buffer) const;
+
+ virtual void JoinLoaderThreads();
+
+ virtual void UpdateDefaultsFromDevice();
+
+ virtual Integration::DynamicsFactory* GetDynamicsFactory();
+
+ virtual bool ReadGlobalMetricsFromCache( const std::string& fontFamily,
+ const std::string& fontStyle,
+ Integration::GlobalMetrics& globalMetrics );
+
+ virtual void WriteGlobalMetricsToCache( const std::string& fontFamily,
+ const std::string& fontStyle,
+ const Integration::GlobalMetrics& globalMetrics );
+
+ virtual bool ReadMetricsFromCache( const std::string& fontFamily,
+ const std::string& fontStyle,
+ std::vector<Integration::GlyphMetrics>& glyphMetricsContainer );
+ virtual void WriteMetricsToCache( const std::string& fontFamily,
+ const std::string& fontStyle,
+ const Integration::GlyphSet& glyphSet );
+
+ virtual void GetFileNamesFromDirectory( const std::string& directoryName,
+ std::vector<std::string>& fileNames );
+
+ virtual Integration::BitmapPtr GetGlyphImage( const std::string& fontFamily, const std::string& fontStyle, float fontSize, uint32_t character ) const;
+
+
+public: // TEST FUNCTIONS
+
+ // Enumeration of Platform Abstraction methods
+ typedef enum
+ {
+ GetTimeMicrosecondsFunc,
+ SuspendFunc,
+ ResumeFunc,
+ LoadResourceFunc,
+ SaveResourceFunc,
+ SaveFileFunc,
+ LoadFileFunc,
+ CancelLoadFunc,
+ GetResourcesFunc,
+ IsLoadingFunc,
+ GetDefaultFontFamilyFunc,
+ GetDefaultFontSizeFunc,
+ GetFontLineHeightFromCapsHeightFunc,
+ GetGlyphDataFunc,
+ GetCachedGlyphDataFunc,
+ SetDpiFunc,
+ GetFontPathFunc,
+ JoinLoaderThreadsFunc,
+ GetFontFamilyForCharsFunc,
+ AllGlyphsSupportedFunc,
+ ValidateFontFamilyNameFunc,
+ UpdateDefaultsFromDeviceFunc,
+ GetDynamicsFactoryFunc,
+ ValidateGetFontListFunc,
+ ReadGlobalMetricsFromCacheFileFunc,
+ WriteGlobalMetricsToCacheFileFunc,
+ ReadMetricsFromCacheFileFunc,
+ WriteMetricsToCacheFileFunc,
+ } TestFuncEnum;
+
+ /** Call this every test */
+ void Initialize();
+
+ inline void EnableTrace(bool enable) { mTrace.Enable(enable); }
+ inline void ResetTrace() { mTrace.Reset(); }
+ inline TraceCallStack& GetTrace() { return mTrace; }
+
+ bool WasCalled(TestFuncEnum func);
+
+ void SetGetTimeMicrosecondsResult(size_t sec, size_t usec);
+
+ void IncrementGetTimeResult(size_t milliseconds);
+
+ void SetIsLoadingResult(bool result);
+
+ void SetGetDefaultFontFamilyResult(std::string result);
+
+ void SetGetDefaultFontSizeResult(float result);
+
+ void SetGetFontPathResult(std::string& result);
+
+ void ClearReadyResources();
+
+ void SetResourceLoaded(Integration::ResourceId loadedId,
+ Integration::ResourceTypeId loadedType,
+ Integration::ResourcePointer loadedResource);
+
+ void SetResourceLoadFailed(Integration::ResourceId id,
+ Integration::ResourceFailure failure);
+
+ void SetResourceSaved(Integration::ResourceId savedId,
+ Integration::ResourceTypeId savedType);
+
+ void SetResourceSaveFailed(Integration::ResourceId id,
+ Integration::ResourceFailure failure);
+
+ Integration::ResourceRequest* GetRequest();
+
+ void DiscardRequest();
+
+ void SetClosestImageSize(const Vector2& size);
+
+ void SetLoadFileResult( bool result, std::vector< unsigned char >& buffer );
+
+ void SetSaveFileResult( bool result );
+
+ PlatformAbstraction::FontListMode GetLastFontListMode( );
+
+ void SetReadGlobalMetricsResult( bool success, Integration::GlobalMetrics& globalMetrics );
+
+ void SetReadMetricsResult( bool success, std::vector<Integration::GlyphMetrics>& glyphMetricsContainer );
+
+
+private:
+ mutable TraceCallStack mTrace;
+ size_t mSeconds;
+ size_t mMicroSeconds;
+ bool mIsLoadingResult;
+ std::string mGetDefaultFontFamilyResult;
+ float mGetDefaultFontSizeResult;
+ std::string mGetFontPathResult;
+ Resources mResources;
+ Integration::ResourceRequest* mRequest;
+ Vector2 mSize;
+ Vector2 mClosestSize;
+ bool mReadGlobalMetricsResult;
+ bool mReadMetricsResult;
+ Integration::GlobalMetrics mReadGlobalMetrics;
+ std::vector<Integration::GlyphMetrics> mReadMetrics;
+
+ LoadFileResult mLoadFileResult;
+ bool mSaveFileResult;
+ mutable FontListMode mFontListMode;
+ TestDynamicsFactory* mDynamicsFactory;
+};
+
+} // Dali
+
+#endif /* __DALI_TET_PLATFORM_ABSTRACTION_H__ */
--- /dev/null
+#include <stdio.h>
+#include <string.h>
+#include "tct-dali-unmanaged-core.h"
+
+int main(int argc, const char *argv[])
+{
+ int result = -1;
+ int i;
+
+ if (argc != 2) {
+ printf("Usage: %s <testcase name>\n", argv[0]);
+ return 2;
+ }
+
+ for (i = 0; tc_array[i].name; i++) {
+ if (!strcmp(argv[1], tc_array[i].name)) {
+ if (tc_array[i].startup)
+ tc_array[i].startup();
+
+ result = tc_array[i].function();
+
+ if (tc_array[i].cleanup)
+ tc_array[i].cleanup();
+
+ return result;
+ }
+ }
+
+ printf("Unknown testcase name: \"%s\"\n", argv[1]);
+ return 2;
+}
--- /dev/null
+#ifndef __TCT_DALI_UNMANAGED_CORE_H__
+#define __TCT_DALI_UNMANAGED_CORE_H__
+
+#include "testcase.h"
+
+extern void utc_dali_unmanaged_startup(void);
+extern void utc_dali_unmanaged_cleanup(void);
+
+extern int UtcDaliConstrainableDownCast(void);
+extern int UtcDaliConstrainableDownCastNegative(void);
+extern int UtcDaliConstrainableCustomProperty(void);
+extern int UtcDaliContextVertexAttribStartup(void);
+extern int UtcDaliContextVertexAttribImageRendering(void);
+extern int UtcDaliContextVertexAttribImageAndModelRendering(void);
+extern int UtcDaliCustomActorDoAction(void);
+extern int UtcDaliGenerateDistanceField(void);
+extern int UtcDaliDynamicsBodyConstructor(void);
+extern int UtcDaliDynamicsBodyGetMass(void);
+extern int UtcDaliDynamicsBodyGetElasticity(void);
+extern int UtcDaliDynamicsBodySetLinearVelocity(void);
+extern int UtcDaliDynamicsBodySetAngularVelocity(void);
+extern int UtcDaliDynamicsBodySetKinematic(void);
+extern int UtcDaliDynamicsBodyIsKinematic(void);
+extern int UtcDaliDynamicsBodySetSleepEnabled(void);
+extern int UtcDaliDynamicsBodyGetSleepEnabled(void);
+extern int UtcDaliDynamicsBodyWakeUp(void);
+extern int UtcDaliDynamicsBodyAddAnchor(void);
+extern int UtcDaliDynamicsBodyConserveVolume(void);
+extern int UtcDaliDynamicsBodyConserveShape(void);
+extern int UtcDaliDynamicsBodyConfigNew(void);
+extern int UtcDaliDynamicsBodyConfigConstructor(void);
+extern int UtcDaliDynamicsBodyConfigType(void);
+extern int UtcDaliDynamicsBodyConfigSetShape01(void);
+extern int UtcDaliDynamicsBodyConfigSetShape02(void);
+extern int UtcDaliDynamicsBodyConfigGetShape(void);
+extern int UtcDaliDynamicsBodyConfigMass(void);
+extern int UtcDaliDynamicsBodyConfigElasticity(void);
+extern int UtcDaliDynamicsBodyConfigFriction(void);
+extern int UtcDaliDynamicsBodyConfigLinearDamping(void);
+extern int UtcDaliDynamicsBodyConfigAngularDamping(void);
+extern int UtcDaliDynamicsBodyConfigLinearSleepVelocity(void);
+extern int UtcDaliDynamicsBodyConfigAngularSleepVelocity(void);
+extern int UtcDaliDynamicsBodyConfigCollisionGroup(void);
+extern int UtcDaliDynamicsBodyConfigCollisionMask(void);
+extern int UtcDaliDynamicsBodyConfigAnchorHardness(void);
+extern int UtcDaliDynamicsBodyConfigVolumeConservation(void);
+extern int UtcDaliDynamicsBodyConfigShapeConservation(void);
+extern int UtcDaliDynamicsJointConstructor(void);
+extern int UtcDaliDynamicsJointLinearLimit(void);
+extern int UtcDaliDynamicsJointAngularLimit(void);
+extern int UtcDaliDynamicsJointEnableSpring(void);
+extern int UtcDaliDynamicsJointSetSpringStiffness(void);
+extern int UtcDaliDynamicsJointSetSpringCenterPoint(void);
+extern int UtcDaliDynamicsJointEnableMotor(void);
+extern int UtcDaliDynamicsJointSetMotorVelocity(void);
+extern int UtcDaliDynamicsJointSetMotorForce(void);
+extern int UtcDaliDynamicsJointGetActor(void);
+extern int UtcDaliDynamicsShapeConstructor(void);
+extern int UtcDaliDynamicsShapeNewCapsule(void);
+extern int UtcDaliDynamicsShapeNewCone(void);
+extern int UtcDaliDynamicsShapeNewCube(void);
+extern int UtcDaliDynamicsShapeNewCylinder(void);
+extern int UtcDaliDynamicsShapeNewMesh(void);
+extern int UtcDaliDynamicsShapeNewSphere(void);
+extern int UtcDaliDynamicsShapeGetType(void);
+extern int UtcDaliStageInitializeDynamics(void);
+extern int UtcDaliStageGetDynamicsWorld(void);
+extern int UtcDaliStageTerminateDynamics(void);
+extern int UtcDaliDynamicsWorldConstructor(void);
+extern int UtcDaliDynamicsWorldGravity(void);
+extern int UtcDaliDynamicsWorldDebugDrawMode(void);
+extern int UtcDaliDynamicsWorldRootActor(void);
+extern int UtcDaliDynamicsWorldConfigConstructor(void);
+extern int UtcDaliDynamicsWorldConfigNew(void);
+extern int UtcDaliDynamicsWorldConfigType(void);
+extern int UtcDaliEncodedBufferImageNew01(void);
+extern int UtcDaliEncodedBufferImageNew02(void);
+extern int UtcDaliEncodedBufferImageNew03(void);
+extern int UtcDaliHitTestAlgorithmWithFunctor(void);
+extern int UtcDaliHitTestAlgorithmWithFunctorOnRenderTask(void);
+extern int UtcDaliHitTestAlgorithmOrtho01(void);
+extern int UtcDaliHitTestAlgorithmOrtho02(void);
+extern int UtcDaliHitTestAlgorithmStencil(void);
+extern int UtcDaliLightActorConstructorVoid(void);
+extern int UtcDaliLightActorDestructor(void);
+extern int UtcDaliLightActorNew(void);
+extern int UtcDaliLightActorDownCast(void);
+extern int UtcDaliLightActorDownCast2(void);
+extern int UtcDaliLightActorSetGetLight(void);
+extern int UtcDaliLightActorSetGetActive(void);
+extern int UtcDaliLightActorMeshTest(void);
+extern int UtcDaliLightActorDefaultProperties(void);
+extern int UtcDaliLightActorPropertyIndices(void);
+extern int UtcDaliLocklessBufferWriteRead01(void);
+extern int UtcDaliLocklessBufferMultipleWrites01(void);
+extern int UtcDaliLocklessBufferGetSize01(void);
+extern int UtcDaliMeshActorNew02(void);
+extern int UtcDaliMeshActorCreateNoMeshData(void);
+extern int UtcDaliMeshActorCreateSetData01(void);
+extern int UtcDaliMeshActorCreateSetData02(void);
+extern int UtcDaliMeshActorCreateSetData03(void);
+extern int UtcDaliMeshActorCreateSetData04(void);
+extern int UtcDaliMeshActorDownCast(void);
+extern int UtcDaliMeshActorDownCast2(void);
+extern int UtcDaliMeshActorSetMaterial01(void);
+extern int UtcDaliMeshActorSetMaterial01b(void);
+extern int UtcDaliMeshActorSetMaterial02(void);
+extern int UtcDaliMeshActorSetMaterial02b(void);
+extern int UtcDaliMeshActorSetMaterial03(void);
+extern int UtcDaliMeshActorSetMaterial03b(void);
+extern int UtcDaliMeshActorGetMaterial01(void);
+extern int UtcDaliMeshActorGetMaterial02(void);
+extern int UtcDaliMeshActorSetLighting01(void);
+extern int UtcDaliMeshActorSetLighting02(void);
+extern int UtcDaliMeshActorBlend01(void);
+extern int UtcDaliMeshActorBlend02(void);
+extern int UtcDaliMeshActorBlend03(void);
+extern int UtcDaliMeshActorBlend04(void);
+extern int UtcDaliMeshActorBlend05(void);
+extern int UtcDaliMeshActorBlend06(void);
+extern int UtcDaliMeshActorBlend07(void);
+extern int UtcDaliMeshActorBlend08(void);
+extern int UtcDaliMeshActorBlend09(void);
+extern int UtcDaliMeshActorBoneUpdate01(void);
+extern int UtcDaliMeshActorIndices(void);
+extern int UtcDaliMeshDataNew(void);
+extern int UtcDaliMeshDataSetData(void);
+extern int UtcDaliMeshDataAddToBoundingVolume(void);
+extern int UtcDaliMeshDataBoundingBox(void);
+extern int UtcDaliMeshDataGetVertexCount(void);
+extern int UtcDaliMeshDataGetVertices(void);
+extern int UtcDaliMeshDataGetFaceCount(void);
+extern int UtcDaliMeshDataGetFaces(void);
+extern int UtcDaliMeshDataTextureCoords(void);
+extern int UtcDaliMeshDataNormals(void);
+extern int UtcDaliMeshDataGetMaterial(void);
+extern int UtcDaliMeshDataSetMaterial(void);
+extern int UtcDaliMeshDataGetBoneCount(void);
+extern int UtcDaliMeshDataGetBones(void);
+extern int UtcDaliModelConstructorVoid(void);
+extern int UtcDaliModelNew(void);
+extern int UtcDaliModelDownCast(void);
+extern int UtcDaliModelGetLoadingState01(void);
+extern int UtcDaliModelGetLoadingState02(void);
+extern int UtcDaliModelGetLoadingState03(void);
+extern int UtcDaliModelNumberOfAnimations(void);
+extern int UtcDaliModelActorFactory(void);
+extern int UtcDaliModelActorFactoryTwoMesh(void);
+extern int UtcDaliModelBuildAnimation01(void);
+extern int UtcDaliModelBuildAnimation02(void);
+extern int UtcDaliModelBuildAnimation03(void);
+extern int UtcDaliModelBuildAnimation04(void);
+extern int UtcDaliModelBuildAnimation05(void);
+extern int UtcDaliModelBuildAnimation06(void);
+extern int UtcDaliModelBuildAnimation07(void);
+extern int UtcDaliModelBuildAnimation08(void);
+extern int UtcDaliMouseWheelEventConstructor(void);
+extern int UtcDaliMouseWheelEventIsShiftModifier(void);
+extern int UtcDaliMouseWheelEventIsCtrlModifier(void);
+extern int UtcDaliMouseWheelEventIsAltModifier(void);
+extern int UtcDaliMouseWheelEventIsNotShiftModifier(void);
+extern int UtcDaliMouseWheelEventIsNotCtrlModifier(void);
+extern int UtcDaliMouseWheelEventIsNotAltModifier(void);
+extern int UtcDaliMouseWheelEventANDModifer(void);
+extern int UtcDaliMouseWheelEventORModifer(void);
+extern int UtcDaliMouseWheelEventSignalling(void);
+extern int UtcDaliObjectRegistryGet(void);
+extern int UtcDaliObjectRegistrySignalActorCreated(void);
+extern int UtcDaliObjectRegistrySignalCameraCreated(void);
+extern int UtcDaliObjectRegistrySignalImageActorCreated(void);
+extern int UtcDaliObjectRegistrySignalLayerCreated(void);
+extern int UtcDaliObjectRegistrySignalLightActorCreated(void);
+extern int UtcDaliObjectRegistrySignalMeshActorCreated(void);
+extern int UtcDaliObjectRegistrySignalModelCreated(void);
+extern int UtcDaliObjectRegistrySignalTextActorCreated(void);
+extern int UtcDaliObjectRegistrySignalAnimationCreated(void);
+extern int UtcDaliObjectRegistrySignalShaderEffectCreated(void);
+extern int UtcDaliRandomRangeMethod(void);
+extern int UtcDaliRandomAxisMethod(void);
+extern int UtcDaliRandomChanceMethod(void);
+extern int UtcDaliRenderTaskSetScreenToFrameBufferMappingActor(void);
+extern int UtcDaliShaderEffectFromProperties01(void);
+extern int UtcDaliShaderEffectFromProperties02(void);
+extern int UtcDaliShaderEffectFromProperties03(void);
+extern int UtcDaliShaderEffectPropertyIndices(void);
+extern int UtcDaliScriptingGetColorMode(void);
+extern int UtcDaliScriptingGetPositionInheritanceMode(void);
+extern int UtcDaliScriptingGetDrawMode(void);
+extern int UtcDaliScriptingGetAnchorConstant(void);
+extern int UtcDaliScriptingNewImageNegative(void);
+extern int UtcDaliScriptingNewImage(void);
+extern int UtcDaliScriptingNewShaderEffect(void);
+extern int UtcDaliScriptingNewActorNegative(void);
+extern int UtcDaliScriptingNewActorProperties(void);
+extern int UtcDaliScriptingNewActorChildren(void);
+extern int UtcDaliScriptingCreatePropertyMapActor(void);
+extern int UtcDaliScriptingCreatePropertyMapImage(void);
+extern int UtcDaliSplineGetYFromMonotonicX(void);
+extern int utcDaliSplineGetKnot01(void);
+extern int utcDaliSplineGetKnot02(void);
+extern int utcDaliSplineGetKnot03(void);
+extern int utcDaliSplineGetInTangent01(void);
+extern int utcDaliSplineGetInTangent02(void);
+extern int utcDaliSplineGetInTangent03(void);
+extern int utcDaliSplineGetOutTangent01(void);
+extern int utcDaliSplineGetOutTangent02(void);
+extern int utcDaliSplineGetOutTangent03(void);
+extern int utcDaliSplineGenerateControlPoints01(void);
+extern int utcDaliSplineGenerateControlPoints02(void);
+extern int utcDaliSplineGenerateControlPoints03(void);
+extern int UtcDaliSplineGetY01(void);
+extern int UtcDaliSplineGetY02(void);
+extern int UtcDaliSplineGetY02b(void);
+extern int UtcDaliSplineGetY03(void);
+extern int UtcDaliSplineGetY04(void);
+extern int UtcDaliSplineGetY04b(void);
+extern int UtcDaliSplineGetPoint01(void);
+extern int UtcDaliSplineGetPoint02(void);
+extern int UtcDaliSplineGetPoint03(void);
+extern int UtcDaliSplineGetPoint04(void);
+extern int UtcDaliSplineGetPoint05(void);
+extern int UtcDaliSplineGetPoint06(void);
+extern int UtcDaliTypeRegistryCreateDaliObjects(void);
+extern int UtcDaliTypeRegistryActionViaBaseHandle(void);
+extern int UtcDaliTypeRegistryNames(void);
+extern int UtcDaliTypeRegistryNameEquivalence(void);
+extern int UtcDaliTypeRegistryCustomActor(void);
+extern int UtcDaliTypeRegistryCustomSignalFailure(void);
+extern int UtcDaliTypeRegistryInitFunctions(void);
+extern int UtcDaliTypeRegistryNameInitFunctions(void);
+extern int UtcDaliPropertyRegistration(void);
+extern int UtcDaliPropertyRegistrationIndexOutOfBounds(void);
+extern int UtcDaliPropertyRegistrationFunctions(void);
+extern int UtcDaliPropertyRegistrationAddSameIndex(void);
+extern int UtcDaliPropertyRegistrationPropertyWritable(void);
+extern int UtcDaliPropertyRegistrationPropertyAnimatable(void);
+extern int UtcDaliPropertyRegistrationInvalidGetAndSet(void);
+extern int UtcDaliLongPressGestureDetectorTypeRegistry(void);
+extern int UtcDaliPanGestureDetectorTypeRegistry(void);
+extern int UtcDaliPinchGestureDetectorTypeRegistry(void);
+extern int UtcDaliTapGestureDetectorTypeRegistry(void);
+extern int UtcDaliUtf8SequenceLength(void);
+extern int UtcDaliEmptyVectorInt(void);
+extern int UtcDaliVectorInt(void);
+extern int UtcDaliVectorIntCopy(void);
+extern int UtcDaliVectorIntResize(void);
+extern int UtcDaliVectorIntErase(void);
+extern int UtcDaliVectorDoubleRemove(void);
+extern int UtcDaliVectorIntSwap(void);
+extern int UtcDaliVectorIterate(void);
+extern int UtcDaliVectorPair(void);
+extern int UtcDaliVectorAsserts(void);
+extern int UtcDaliVectorAcidTest(void);
+extern int UtcDaliVectorComplex(void);
+
+testcase tc_array[] = {
+ {"UtcDaliConstrainableDownCast", UtcDaliConstrainableDownCast, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliConstrainableDownCastNegative", UtcDaliConstrainableDownCastNegative, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliConstrainableCustomProperty", UtcDaliConstrainableCustomProperty, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliContextVertexAttribStartup", UtcDaliContextVertexAttribStartup, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliContextVertexAttribImageRendering", UtcDaliContextVertexAttribImageRendering, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliContextVertexAttribImageAndModelRendering", UtcDaliContextVertexAttribImageAndModelRendering, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliCustomActorDoAction", UtcDaliCustomActorDoAction, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliGenerateDistanceField", UtcDaliGenerateDistanceField, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConstructor", UtcDaliDynamicsBodyConstructor, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyGetMass", UtcDaliDynamicsBodyGetMass, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyGetElasticity", UtcDaliDynamicsBodyGetElasticity, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodySetLinearVelocity", UtcDaliDynamicsBodySetLinearVelocity, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodySetAngularVelocity", UtcDaliDynamicsBodySetAngularVelocity, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodySetKinematic", UtcDaliDynamicsBodySetKinematic, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyIsKinematic", UtcDaliDynamicsBodyIsKinematic, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodySetSleepEnabled", UtcDaliDynamicsBodySetSleepEnabled, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyGetSleepEnabled", UtcDaliDynamicsBodyGetSleepEnabled, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyWakeUp", UtcDaliDynamicsBodyWakeUp, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyAddAnchor", UtcDaliDynamicsBodyAddAnchor, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConserveVolume", UtcDaliDynamicsBodyConserveVolume, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConserveShape", UtcDaliDynamicsBodyConserveShape, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigNew", UtcDaliDynamicsBodyConfigNew, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigConstructor", UtcDaliDynamicsBodyConfigConstructor, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigType", UtcDaliDynamicsBodyConfigType, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigSetShape01", UtcDaliDynamicsBodyConfigSetShape01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigSetShape02", UtcDaliDynamicsBodyConfigSetShape02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigGetShape", UtcDaliDynamicsBodyConfigGetShape, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigMass", UtcDaliDynamicsBodyConfigMass, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigElasticity", UtcDaliDynamicsBodyConfigElasticity, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigFriction", UtcDaliDynamicsBodyConfigFriction, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigLinearDamping", UtcDaliDynamicsBodyConfigLinearDamping, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigAngularDamping", UtcDaliDynamicsBodyConfigAngularDamping, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigLinearSleepVelocity", UtcDaliDynamicsBodyConfigLinearSleepVelocity, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigAngularSleepVelocity", UtcDaliDynamicsBodyConfigAngularSleepVelocity, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigCollisionGroup", UtcDaliDynamicsBodyConfigCollisionGroup, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigCollisionMask", UtcDaliDynamicsBodyConfigCollisionMask, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigAnchorHardness", UtcDaliDynamicsBodyConfigAnchorHardness, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigVolumeConservation", UtcDaliDynamicsBodyConfigVolumeConservation, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsBodyConfigShapeConservation", UtcDaliDynamicsBodyConfigShapeConservation, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsJointConstructor", UtcDaliDynamicsJointConstructor, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsJointLinearLimit", UtcDaliDynamicsJointLinearLimit, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsJointAngularLimit", UtcDaliDynamicsJointAngularLimit, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsJointEnableSpring", UtcDaliDynamicsJointEnableSpring, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsJointSetSpringStiffness", UtcDaliDynamicsJointSetSpringStiffness, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsJointSetSpringCenterPoint", UtcDaliDynamicsJointSetSpringCenterPoint, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsJointEnableMotor", UtcDaliDynamicsJointEnableMotor, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsJointSetMotorVelocity", UtcDaliDynamicsJointSetMotorVelocity, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsJointSetMotorForce", UtcDaliDynamicsJointSetMotorForce, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsJointGetActor", UtcDaliDynamicsJointGetActor, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsShapeConstructor", UtcDaliDynamicsShapeConstructor, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsShapeNewCapsule", UtcDaliDynamicsShapeNewCapsule, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsShapeNewCone", UtcDaliDynamicsShapeNewCone, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsShapeNewCube", UtcDaliDynamicsShapeNewCube, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsShapeNewCylinder", UtcDaliDynamicsShapeNewCylinder, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsShapeNewMesh", UtcDaliDynamicsShapeNewMesh, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsShapeNewSphere", UtcDaliDynamicsShapeNewSphere, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsShapeGetType", UtcDaliDynamicsShapeGetType, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliStageInitializeDynamics", UtcDaliStageInitializeDynamics, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliStageGetDynamicsWorld", UtcDaliStageGetDynamicsWorld, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliStageTerminateDynamics", UtcDaliStageTerminateDynamics, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsWorldConstructor", UtcDaliDynamicsWorldConstructor, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsWorldGravity", UtcDaliDynamicsWorldGravity, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsWorldDebugDrawMode", UtcDaliDynamicsWorldDebugDrawMode, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsWorldRootActor", UtcDaliDynamicsWorldRootActor, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsWorldConfigConstructor", UtcDaliDynamicsWorldConfigConstructor, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsWorldConfigNew", UtcDaliDynamicsWorldConfigNew, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliDynamicsWorldConfigType", UtcDaliDynamicsWorldConfigType, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliEncodedBufferImageNew01", UtcDaliEncodedBufferImageNew01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliEncodedBufferImageNew02", UtcDaliEncodedBufferImageNew02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliEncodedBufferImageNew03", UtcDaliEncodedBufferImageNew03, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliHitTestAlgorithmWithFunctor", UtcDaliHitTestAlgorithmWithFunctor, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliHitTestAlgorithmWithFunctorOnRenderTask", UtcDaliHitTestAlgorithmWithFunctorOnRenderTask, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliHitTestAlgorithmOrtho01", UtcDaliHitTestAlgorithmOrtho01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliHitTestAlgorithmOrtho02", UtcDaliHitTestAlgorithmOrtho02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliHitTestAlgorithmStencil", UtcDaliHitTestAlgorithmStencil, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliLightActorConstructorVoid", UtcDaliLightActorConstructorVoid, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliLightActorDestructor", UtcDaliLightActorDestructor, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliLightActorNew", UtcDaliLightActorNew, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliLightActorDownCast", UtcDaliLightActorDownCast, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliLightActorDownCast2", UtcDaliLightActorDownCast2, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliLightActorSetGetLight", UtcDaliLightActorSetGetLight, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliLightActorSetGetActive", UtcDaliLightActorSetGetActive, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliLightActorMeshTest", UtcDaliLightActorMeshTest, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliLightActorDefaultProperties", UtcDaliLightActorDefaultProperties, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliLightActorPropertyIndices", UtcDaliLightActorPropertyIndices, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliLocklessBufferWriteRead01", UtcDaliLocklessBufferWriteRead01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliLocklessBufferMultipleWrites01", UtcDaliLocklessBufferMultipleWrites01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliLocklessBufferGetSize01", UtcDaliLocklessBufferGetSize01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorNew02", UtcDaliMeshActorNew02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorCreateNoMeshData", UtcDaliMeshActorCreateNoMeshData, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorCreateSetData01", UtcDaliMeshActorCreateSetData01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorCreateSetData02", UtcDaliMeshActorCreateSetData02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorCreateSetData03", UtcDaliMeshActorCreateSetData03, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorCreateSetData04", UtcDaliMeshActorCreateSetData04, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorDownCast", UtcDaliMeshActorDownCast, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorDownCast2", UtcDaliMeshActorDownCast2, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorSetMaterial01", UtcDaliMeshActorSetMaterial01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorSetMaterial01b", UtcDaliMeshActorSetMaterial01b, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorSetMaterial02", UtcDaliMeshActorSetMaterial02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorSetMaterial02b", UtcDaliMeshActorSetMaterial02b, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorSetMaterial03", UtcDaliMeshActorSetMaterial03, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorSetMaterial03b", UtcDaliMeshActorSetMaterial03b, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorGetMaterial01", UtcDaliMeshActorGetMaterial01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorGetMaterial02", UtcDaliMeshActorGetMaterial02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorSetLighting01", UtcDaliMeshActorSetLighting01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorSetLighting02", UtcDaliMeshActorSetLighting02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorBlend01", UtcDaliMeshActorBlend01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorBlend02", UtcDaliMeshActorBlend02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorBlend03", UtcDaliMeshActorBlend03, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorBlend04", UtcDaliMeshActorBlend04, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorBlend05", UtcDaliMeshActorBlend05, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorBlend06", UtcDaliMeshActorBlend06, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorBlend07", UtcDaliMeshActorBlend07, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorBlend08", UtcDaliMeshActorBlend08, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorBlend09", UtcDaliMeshActorBlend09, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorBoneUpdate01", UtcDaliMeshActorBoneUpdate01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshActorIndices", UtcDaliMeshActorIndices, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshDataNew", UtcDaliMeshDataNew, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshDataSetData", UtcDaliMeshDataSetData, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshDataAddToBoundingVolume", UtcDaliMeshDataAddToBoundingVolume, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshDataBoundingBox", UtcDaliMeshDataBoundingBox, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshDataGetVertexCount", UtcDaliMeshDataGetVertexCount, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshDataGetVertices", UtcDaliMeshDataGetVertices, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshDataGetFaceCount", UtcDaliMeshDataGetFaceCount, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshDataGetFaces", UtcDaliMeshDataGetFaces, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshDataTextureCoords", UtcDaliMeshDataTextureCoords, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshDataNormals", UtcDaliMeshDataNormals, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshDataGetMaterial", UtcDaliMeshDataGetMaterial, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshDataSetMaterial", UtcDaliMeshDataSetMaterial, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshDataGetBoneCount", UtcDaliMeshDataGetBoneCount, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMeshDataGetBones", UtcDaliMeshDataGetBones, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliModelConstructorVoid", UtcDaliModelConstructorVoid, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliModelNew", UtcDaliModelNew, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliModelDownCast", UtcDaliModelDownCast, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliModelGetLoadingState01", UtcDaliModelGetLoadingState01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliModelGetLoadingState02", UtcDaliModelGetLoadingState02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliModelGetLoadingState03", UtcDaliModelGetLoadingState03, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliModelNumberOfAnimations", UtcDaliModelNumberOfAnimations, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliModelActorFactory", UtcDaliModelActorFactory, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliModelActorFactoryTwoMesh", UtcDaliModelActorFactoryTwoMesh, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliModelBuildAnimation01", UtcDaliModelBuildAnimation01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliModelBuildAnimation02", UtcDaliModelBuildAnimation02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliModelBuildAnimation03", UtcDaliModelBuildAnimation03, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliModelBuildAnimation04", UtcDaliModelBuildAnimation04, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliModelBuildAnimation05", UtcDaliModelBuildAnimation05, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliModelBuildAnimation06", UtcDaliModelBuildAnimation06, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliModelBuildAnimation07", UtcDaliModelBuildAnimation07, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliModelBuildAnimation08", UtcDaliModelBuildAnimation08, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMouseWheelEventConstructor", UtcDaliMouseWheelEventConstructor, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMouseWheelEventIsShiftModifier", UtcDaliMouseWheelEventIsShiftModifier, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMouseWheelEventIsCtrlModifier", UtcDaliMouseWheelEventIsCtrlModifier, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMouseWheelEventIsAltModifier", UtcDaliMouseWheelEventIsAltModifier, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMouseWheelEventIsNotShiftModifier", UtcDaliMouseWheelEventIsNotShiftModifier, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMouseWheelEventIsNotCtrlModifier", UtcDaliMouseWheelEventIsNotCtrlModifier, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMouseWheelEventIsNotAltModifier", UtcDaliMouseWheelEventIsNotAltModifier, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMouseWheelEventANDModifer", UtcDaliMouseWheelEventANDModifer, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMouseWheelEventORModifer", UtcDaliMouseWheelEventORModifer, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliMouseWheelEventSignalling", UtcDaliMouseWheelEventSignalling, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliObjectRegistryGet", UtcDaliObjectRegistryGet, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliObjectRegistrySignalActorCreated", UtcDaliObjectRegistrySignalActorCreated, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliObjectRegistrySignalCameraCreated", UtcDaliObjectRegistrySignalCameraCreated, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliObjectRegistrySignalImageActorCreated", UtcDaliObjectRegistrySignalImageActorCreated, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliObjectRegistrySignalLayerCreated", UtcDaliObjectRegistrySignalLayerCreated, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliObjectRegistrySignalLightActorCreated", UtcDaliObjectRegistrySignalLightActorCreated, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliObjectRegistrySignalMeshActorCreated", UtcDaliObjectRegistrySignalMeshActorCreated, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliObjectRegistrySignalModelCreated", UtcDaliObjectRegistrySignalModelCreated, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliObjectRegistrySignalTextActorCreated", UtcDaliObjectRegistrySignalTextActorCreated, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliObjectRegistrySignalAnimationCreated", UtcDaliObjectRegistrySignalAnimationCreated, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliObjectRegistrySignalShaderEffectCreated", UtcDaliObjectRegistrySignalShaderEffectCreated, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliRandomRangeMethod", UtcDaliRandomRangeMethod, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliRandomAxisMethod", UtcDaliRandomAxisMethod, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliRandomChanceMethod", UtcDaliRandomChanceMethod, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliRenderTaskSetScreenToFrameBufferMappingActor", UtcDaliRenderTaskSetScreenToFrameBufferMappingActor, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliShaderEffectFromProperties01", UtcDaliShaderEffectFromProperties01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliShaderEffectFromProperties02", UtcDaliShaderEffectFromProperties02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliShaderEffectFromProperties03", UtcDaliShaderEffectFromProperties03, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliShaderEffectPropertyIndices", UtcDaliShaderEffectPropertyIndices, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliScriptingGetColorMode", UtcDaliScriptingGetColorMode, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliScriptingGetPositionInheritanceMode", UtcDaliScriptingGetPositionInheritanceMode, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliScriptingGetDrawMode", UtcDaliScriptingGetDrawMode, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliScriptingGetAnchorConstant", UtcDaliScriptingGetAnchorConstant, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliScriptingNewImageNegative", UtcDaliScriptingNewImageNegative, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliScriptingNewImage", UtcDaliScriptingNewImage, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliScriptingNewShaderEffect", UtcDaliScriptingNewShaderEffect, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliScriptingNewActorNegative", UtcDaliScriptingNewActorNegative, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliScriptingNewActorProperties", UtcDaliScriptingNewActorProperties, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliScriptingNewActorChildren", UtcDaliScriptingNewActorChildren, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliScriptingCreatePropertyMapActor", UtcDaliScriptingCreatePropertyMapActor, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliScriptingCreatePropertyMapImage", UtcDaliScriptingCreatePropertyMapImage, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliSplineGetYFromMonotonicX", UtcDaliSplineGetYFromMonotonicX, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"utcDaliSplineGetKnot01", utcDaliSplineGetKnot01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"utcDaliSplineGetKnot02", utcDaliSplineGetKnot02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"utcDaliSplineGetKnot03", utcDaliSplineGetKnot03, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"utcDaliSplineGetInTangent01", utcDaliSplineGetInTangent01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"utcDaliSplineGetInTangent02", utcDaliSplineGetInTangent02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"utcDaliSplineGetInTangent03", utcDaliSplineGetInTangent03, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"utcDaliSplineGetOutTangent01", utcDaliSplineGetOutTangent01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"utcDaliSplineGetOutTangent02", utcDaliSplineGetOutTangent02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"utcDaliSplineGetOutTangent03", utcDaliSplineGetOutTangent03, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"utcDaliSplineGenerateControlPoints01", utcDaliSplineGenerateControlPoints01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"utcDaliSplineGenerateControlPoints02", utcDaliSplineGenerateControlPoints02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"utcDaliSplineGenerateControlPoints03", utcDaliSplineGenerateControlPoints03, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliSplineGetY01", UtcDaliSplineGetY01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliSplineGetY02", UtcDaliSplineGetY02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliSplineGetY02b", UtcDaliSplineGetY02b, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliSplineGetY03", UtcDaliSplineGetY03, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliSplineGetY04", UtcDaliSplineGetY04, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliSplineGetY04b", UtcDaliSplineGetY04b, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliSplineGetPoint01", UtcDaliSplineGetPoint01, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliSplineGetPoint02", UtcDaliSplineGetPoint02, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliSplineGetPoint03", UtcDaliSplineGetPoint03, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliSplineGetPoint04", UtcDaliSplineGetPoint04, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliSplineGetPoint05", UtcDaliSplineGetPoint05, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliSplineGetPoint06", UtcDaliSplineGetPoint06, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliTypeRegistryCreateDaliObjects", UtcDaliTypeRegistryCreateDaliObjects, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliTypeRegistryActionViaBaseHandle", UtcDaliTypeRegistryActionViaBaseHandle, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliTypeRegistryNames", UtcDaliTypeRegistryNames, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliTypeRegistryNameEquivalence", UtcDaliTypeRegistryNameEquivalence, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliTypeRegistryCustomActor", UtcDaliTypeRegistryCustomActor, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliTypeRegistryCustomSignalFailure", UtcDaliTypeRegistryCustomSignalFailure, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliTypeRegistryInitFunctions", UtcDaliTypeRegistryInitFunctions, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliTypeRegistryNameInitFunctions", UtcDaliTypeRegistryNameInitFunctions, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliPropertyRegistration", UtcDaliPropertyRegistration, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliPropertyRegistrationIndexOutOfBounds", UtcDaliPropertyRegistrationIndexOutOfBounds, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliPropertyRegistrationFunctions", UtcDaliPropertyRegistrationFunctions, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliPropertyRegistrationAddSameIndex", UtcDaliPropertyRegistrationAddSameIndex, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliPropertyRegistrationPropertyWritable", UtcDaliPropertyRegistrationPropertyWritable, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliPropertyRegistrationPropertyAnimatable", UtcDaliPropertyRegistrationPropertyAnimatable, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliPropertyRegistrationInvalidGetAndSet", UtcDaliPropertyRegistrationInvalidGetAndSet, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliLongPressGestureDetectorTypeRegistry", UtcDaliLongPressGestureDetectorTypeRegistry, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliPanGestureDetectorTypeRegistry", UtcDaliPanGestureDetectorTypeRegistry, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliPinchGestureDetectorTypeRegistry", UtcDaliPinchGestureDetectorTypeRegistry, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliTapGestureDetectorTypeRegistry", UtcDaliTapGestureDetectorTypeRegistry, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliUtf8SequenceLength", UtcDaliUtf8SequenceLength, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliEmptyVectorInt", UtcDaliEmptyVectorInt, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliVectorInt", UtcDaliVectorInt, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliVectorIntCopy", UtcDaliVectorIntCopy, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliVectorIntResize", UtcDaliVectorIntResize, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliVectorIntErase", UtcDaliVectorIntErase, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliVectorDoubleRemove", UtcDaliVectorDoubleRemove, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliVectorIntSwap", UtcDaliVectorIntSwap, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliVectorIterate", UtcDaliVectorIterate, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliVectorPair", UtcDaliVectorPair, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliVectorAsserts", UtcDaliVectorAsserts, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliVectorAcidTest", UtcDaliVectorAcidTest, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {"UtcDaliVectorComplex", UtcDaliVectorComplex, utc_dali_unmanaged_startup, utc_dali_unmanaged_cleanup},
+ {NULL, NULL}
+};
+
+#endif // __TCT_DALI_UNMANAGED_CORE_H__
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <stdlib.h>
+
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_unmanaged_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_unmanaged_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+int UtcDaliConstrainableDownCast(void)
+{
+ TestApplication application;
+
+ Handle handle = Constrainable::New();
+
+ Constrainable customHandle1 = Constrainable::DownCast( handle );
+ DALI_TEST_CHECK( customHandle1 );
+
+ Constrainable customHandle2 = DownCast< Constrainable >( handle );
+ DALI_TEST_CHECK( customHandle2 );
+ END_TEST;
+}
+
+int UtcDaliConstrainableDownCastNegative(void)
+{
+ TestApplication application;
+
+ Image image = Image::New( "temp" );
+ Constrainable customHandle1 = Constrainable::DownCast( image );
+ DALI_TEST_CHECK( ! customHandle1 );
+
+ Constrainable empty;
+ Constrainable customHandle2 = Constrainable::DownCast( empty );
+ DALI_TEST_CHECK( ! customHandle2 );
+ END_TEST;
+}
+
+int UtcDaliConstrainableCustomProperty(void)
+{
+ TestApplication application;
+
+ Constrainable handle = Constrainable::New();
+
+ float startValue(1.0f);
+ Property::Index index = handle.RegisterProperty( "test-property", startValue );
+ DALI_TEST_CHECK( handle.GetProperty<float>(index) == startValue );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( handle.GetProperty<float>(index) == startValue );
+ application.Render(0);
+ DALI_TEST_CHECK( handle.GetProperty<float>(index) == startValue );
+
+ handle.SetProperty( index, 5.0f );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( handle.GetProperty<float>(index) == 5.0f );
+ application.Render(0);
+ DALI_TEST_CHECK( handle.GetProperty<float>(index) == 5.0f );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+#include "mesh-builder.h"
+
+
+namespace
+{
+// Size of the VertexAttributeArray enables
+// GLES specification states that there's minimum of
+const unsigned int TEST_MAX_ATTRIBUTE_CACHE_SIZE = 8;
+
+enum TestAttribType
+{
+ ATTRIB_UNKNOWN = -1,
+ ATTRIB_POSITION,
+ ATTRIB_NORMAL,
+ ATTRIB_TEXCOORD,
+ ATTRIB_COLOR,
+ ATTRIB_BONE_WEIGHTS,
+ ATTRIB_BONE_INDICES,
+ ATTRIB_TYPE_LAST
+};
+
+// Create bitmap image
+static BitmapImage CreateBitmapImage()
+{
+ BitmapImage image = BitmapImage::New(4,4,Pixel::RGBA8888);
+
+ return image;
+}
+
+static MeshActor CreateMeshActor()
+{
+ MeshData meshData;
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 60);
+ ConstructFaces(vertices, faces);
+ Material customMaterial = ConstructMaterial();
+ meshData.SetData(vertices, faces, bones, customMaterial);
+ meshData.SetHasNormals(true);
+ meshData.SetHasTextureCoords(true);
+
+ Mesh mesh = Mesh::New(meshData);
+ MeshActor actor = MeshActor::New(mesh);
+ actor.SetName("Test MeshActor");
+
+ return actor;
+}
+
+static LightActor CreateLight()
+{
+ Light light = Light::New("Light");
+ light.SetType( POINT );
+ light.SetAmbientColor( Vector3( 0.22f, 0.33f, 0.44f ) );
+ light.SetDiffuseColor( Vector3( 0.55f, 0.66f, 0.77f) );
+ light.SetSpecularColor( Vector3( 0.88f, 0.99f, 0.11f) );
+ LightActor lightActor = LightActor::New();
+ lightActor.SetParentOrigin( ParentOrigin::CENTER );
+ lightActor.SetPosition( 0.f, 0.f, 100.0f );
+ lightActor.SetLight( light );
+ lightActor.SetName( light.GetName() );
+
+ return lightActor;
+}
+
+static ImageActor CreateImageActor()
+{
+ BitmapImage image = CreateBitmapImage();
+ ImageActor actor = ImageActor::New( image );
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("Test ImageActor");
+ return actor;
+}
+
+} // anonymous namespace
+
+
+// Positive test case for a method
+int UtcDaliContextVertexAttribStartup(void)
+{
+ tet_infoline("Testing vertex attrib initial state in context");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ // context class should initially set the vertex attrib locations to disable
+ // Make sure it has been modified
+ DALI_TEST_CHECK(application.GetGlAbstraction().GetVertexAttribArrayChanged());
+
+ // check the locations
+ for (unsigned int i = 0; i < TEST_MAX_ATTRIBUTE_CACHE_SIZE; i++)
+ {
+ DALI_TEST_CHECK( application.GetGlAbstraction().GetVertexAttribArrayState(i) == false);
+ }
+
+ tet_result(TET_PASS);
+ END_TEST;
+}
+
+// Tests to make the attribs only get set once when continually rendering an image actor
+int UtcDaliContextVertexAttribImageRendering(void)
+{
+ tet_infoline("Testing vertex attrib rendering state in context with images");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ // the vertex attribs get modified on startup to set them to disabled
+ // clear the flag to say they've changed
+ application.GetGlAbstraction().ClearVertexAttribArrayChanged();
+
+
+ // create a test image actor
+ ImageActor imageActor(CreateImageActor());
+ Stage::GetCurrent().Add(imageActor);
+
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ // check to make sure the state has changed (the image renderer will enable some
+ // locations).
+ DALI_TEST_CHECK(application.GetGlAbstraction().GetVertexAttribArrayChanged());
+
+ // Now check to make sure the state is cached, and isn't being set each frame.
+ application.GetGlAbstraction().ClearVertexAttribArrayChanged();
+
+ application.Render();
+ application.Render();
+ application.Render();
+
+ // if it has changed then the caching has failed
+ DALI_TEST_CHECK(application.GetGlAbstraction().GetVertexAttribArrayChanged() == false);
+
+
+ tet_result(TET_PASS);
+ END_TEST;
+}
+
+// test to make sure the attribs change when rendering both image and mode actors
+int UtcDaliContextVertexAttribImageAndModelRendering(void)
+{
+ tet_infoline("Testing vertex attrib rendering state in context with images and models");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ // the vertex attribs get modified on startup to set them to disabled
+ // clear the flag to say they've changed
+ application.GetGlAbstraction().ClearVertexAttribArrayChanged();
+
+ // create a test light, image and mesh actor. (meshes won't render without light)
+
+ LightActor lightActor(CreateLight());
+ Stage::GetCurrent().Add(lightActor);
+ lightActor.SetActive(true);
+
+ MeshActor meshActor(CreateMeshActor());
+ Stage::GetCurrent().Add(meshActor);
+
+ ImageActor imageActor(CreateImageActor());
+ Stage::GetCurrent().Add(imageActor);
+
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ // check to make sure the state changes during the rendering of a frame
+ DALI_TEST_CHECK(application.GetGlAbstraction().GetVertexAttribArrayChanged());
+
+ // Now check to make sure the state is changing each frame.
+ application.GetGlAbstraction().ClearVertexAttribArrayChanged();
+
+ application.Render();
+ application.Render();
+ application.Render();
+
+ // make sure the state has changed
+ DALI_TEST_CHECK(application.GetGlAbstraction().GetVertexAttribArrayChanged());
+
+ // depending on the order of drawing, one of the attrib locations should be disabled
+ // Image uses locations 0 & 2 (position, texture)
+ // Model uses locations 0 & 1 (position, normals) -no textures
+ // so either location 1 or location 2 should be disabled after drawing.
+
+ // see if mesh was last to draw
+ if (application.GetGlAbstraction().GetVertexAttribArrayState(ATTRIB_NORMAL))
+ {
+ // texture should be disabled
+ DALI_TEST_CHECK( application.GetGlAbstraction().GetVertexAttribArrayState(ATTRIB_TEXCOORD) == false)
+ }
+ else
+ {
+ // image was to draw so, normals should be disabled
+ DALI_TEST_CHECK( application.GetGlAbstraction().GetVertexAttribArrayState(ATTRIB_NORMAL) == false)
+ }
+
+ tet_result(TET_PASS);
+
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+
+#include <dali/integration-api/events/touch-event-integ.h>
+#include <dali/integration-api/events/mouse-wheel-event-integ.h>
+#include <dali/integration-api/events/key-event-integ.h>
+
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+namespace
+{
+std::vector< std::string > MasterCallStack;
+}
+
+// TypeRegistry needs custom actor Implementations to have the same name (namespaces are ignored so we use one here)
+namespace Impl
+{
+
+struct TestCustomActor : public CustomActorImpl
+{
+ /**
+ * Constructor
+ */
+ TestCustomActor()
+ : CustomActorImpl( true ), // requires touch
+ mDaliProperty( Property::INVALID_INDEX ),
+ mSizeSet( Vector3::ZERO ),
+ mTargetSize( Vector3::ZERO )
+ {
+ SetRequiresMouseWheelEvents(true);
+ }
+
+ /**
+ * Destructor
+ */
+ virtual ~TestCustomActor()
+ {
+ }
+
+ void Initialize( const char* name = NULL )
+ {
+ mDaliProperty = Self().RegisterProperty( "Dali", std::string("no"), Property::READ_WRITE);
+
+ OnInitialize( name );
+ }
+
+ virtual void OnInitialize( const char* name ) {}
+
+ /**
+ * Resets the call stack
+ */
+ void ResetCallStack()
+ {
+ mSizeSet = Vector3();
+ mTargetSize = Vector3();
+ mMethodsCalled.clear();
+ }
+
+ void AddToCallStacks( const char* method )
+ {
+ mMethodsCalled.push_back( method );
+
+ // Combine Actor name with method string
+ std::string nameAndMethod( Self().GetName() );
+ if ( 0 == nameAndMethod.size() )
+ {
+ nameAndMethod = "Unknown: ";
+ }
+ else
+ {
+ nameAndMethod += ": ";
+ }
+ nameAndMethod += method;
+
+ MasterCallStack.push_back( nameAndMethod );
+ }
+
+ // From CustomActorImpl
+ virtual void OnStageConnection()
+ {
+ AddToCallStacks("OnStageConnection");
+ }
+ virtual void OnStageDisconnection()
+ {
+ AddToCallStacks("OnStageDisconnection");
+ }
+ virtual void OnChildAdd(Actor& child)
+ {
+ AddToCallStacks("OnChildAdd");
+ }
+ virtual void OnChildRemove(Actor& child)
+ {
+ AddToCallStacks("OnChildRemove");
+ }
+ virtual void OnPropertySet( Property::Index index, Property::Value propertyValue )
+ {
+ AddToCallStacks("OnPropertySet");
+ }
+ virtual void OnSizeSet(const Vector3& targetSize)
+ {
+ mSizeSet = targetSize;
+ AddToCallStacks("OnSizeSet");
+ }
+ virtual void OnSizeAnimation(Animation& animation, const Vector3& targetSize)
+ {
+ mTargetSize = targetSize;
+ AddToCallStacks("OnSizeAnimation");
+ }
+ virtual bool OnTouchEvent(const TouchEvent& event)
+ {
+ AddToCallStacks("OnTouchEvent");
+ return true;
+ }
+ virtual bool OnMouseWheelEvent(const MouseWheelEvent& event)
+ {
+ AddToCallStacks("OnMouseWheelEvent");
+ return true;
+ }
+ virtual bool OnKeyEvent(const KeyEvent& event)
+ {
+ AddToCallStacks("OnKeyEvent");
+ return true;
+ }
+ virtual void OnKeyInputFocusGained()
+ {
+ AddToCallStacks("OnKeyInputFocusGained");
+ }
+ virtual void OnKeyInputFocusLost()
+ {
+ AddToCallStacks("OnKeyInputFocusLost");
+ }
+ virtual Actor GetChildByAlias(const std::string& actorAlias)
+ {
+ AddToCallStacks("GetChildByAlias");
+
+ if ("found" == actorAlias)
+ {
+ return Actor::New();
+ }
+ else
+ {
+ return Actor();
+ }
+ }
+
+ void SetDaliProperty(std::string s)
+ {
+ Self().SetProperty(mDaliProperty, s) ;
+ }
+
+ Property::Index mDaliProperty;
+ std::vector< std::string > mMethodsCalled;
+ Vector3 mSizeSet;
+ Vector3 mTargetSize;
+};
+} // Namespace Impl
+
+
+namespace
+{
+/**
+ * Test custom actor handle
+ */
+class TestCustomActor : public CustomActor
+{
+public:
+
+ static TestCustomActor New()
+ {
+ Impl::TestCustomActor* impl = new Impl::TestCustomActor;
+ TestCustomActor custom( *impl ); // takes ownership
+
+ impl->Initialize();
+
+ return custom;
+ }
+
+ virtual ~TestCustomActor()
+ {
+ }
+
+ Impl::TestCustomActor& GetImpl()
+ {
+ return static_cast<Impl::TestCustomActor&>(GetImplementation());
+ }
+
+ std::vector< std::string >& GetMethodsCalled()
+ {
+ return GetImpl().mMethodsCalled;
+ }
+
+ void ResetCallStack()
+ {
+ GetImpl().ResetCallStack();
+ }
+
+ void SetDaliProperty(std::string s)
+ {
+ GetImpl().SetDaliProperty(s);
+ }
+
+ Vector3 GetSize()
+ {
+ return GetImpl().mSizeSet;
+ }
+
+ Vector3 GetTargetSize()
+ {
+ return GetImpl().mTargetSize;
+ }
+
+private:
+
+ TestCustomActor( Impl::TestCustomActor& impl ) : CustomActor( impl )
+ {
+ }
+};
+
+
+
+using namespace Dali;
+
+BaseHandle CreateActor()
+{
+ return TestCustomActor::New();
+}
+
+Dali::TypeRegistration mType( typeid(TestCustomActor), typeid(Dali::CustomActor), CreateActor );
+
+}
+
+
+int UtcDaliCustomActorDoAction(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CustomActor::DoAction()");
+
+ TestCustomActor custom = TestCustomActor::New();
+
+ BaseHandle customActorObject = custom;
+
+ DALI_TEST_CHECK(customActorObject);
+
+ std::vector<Property::Value> attributes;
+
+ // Check that an invalid command is not performed
+ DALI_TEST_CHECK(customActorObject.DoAction("invalidCommand", attributes) == false);
+
+ // Check that the custom actor is visible
+ custom.SetVisible(true);
+ DALI_TEST_CHECK(custom.IsVisible() == true);
+
+ // Check the custom actor performed an action to hide itself
+ DALI_TEST_CHECK(customActorObject.DoAction("hide", attributes) == true);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ // Check that the custom actor is now invisible
+ DALI_TEST_CHECK(custom.IsVisible() == false);
+
+ // Check the custom actor performed an action to show itself
+ DALI_TEST_CHECK(customActorObject.DoAction("show", attributes) == true);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ // Check that the custom actor is now visible
+ DALI_TEST_CHECK(custom.IsVisible() == true);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <algorithm>
+
+#include <stdlib.h>
+
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+
+using std::max;
+using namespace Dali;
+
+namespace
+{
+
+static const float ROTATION_EPSILON = 0.0001f;
+
+static unsigned char sourceImage[] =
+{
+ 0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
+ 0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
+ 0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
+ 0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
+};
+
+} // anonymous namespace
+
+
+
+int UtcDaliGenerateDistanceField(void)
+{
+ unsigned char distanceField[4*4];
+
+ GenerateDistanceFieldMap(sourceImage, Size(8.0f, 8.0f), distanceField, Size(4.0f, 4.0f), 0, Size(4.0f, 4.0f));
+
+ if(distanceField[0] <= distanceField[5] &&
+ distanceField[5] <= distanceField[10] &&
+ distanceField[10] <= distanceField[15])
+ {
+ tet_result(TET_PASS);
+ }
+ else
+ {
+ tet_result(TET_FAIL);
+ }
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+
+
+int UtcDaliDynamicsBodyConstructor(void)
+{
+ tet_infoline("UtcDaliDynamicsBodyConstructor - DynamicsBody::DynamicsBody()");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ // Default constructor - create an uninitialized handle
+ DynamicsBody body;
+ DALI_TEST_CHECK( !body );
+
+ // create world and actor
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ Actor actor(Actor::New());
+
+ // enable dynamics on the actor to create the Dynamicsbody
+ actor.EnableDynamics(bodyConfig);
+
+ // initialize handle
+ body = actor.GetDynamicsBody();
+
+ DALI_TEST_CHECK( body );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyGetMass(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ const float testMass = 1.23f;
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ bodyConfig.SetMass(testMass);
+ Actor actor(Actor::New());
+
+ // enable dynamics on the actor to create the Dynamicsbody
+ actor.EnableDynamics(bodyConfig);
+
+ tet_infoline("UtcDaliDynamicsBodyGetMass - DynamicsBody::GetMass");
+ DALI_TEST_EQUALS( testMass, actor.GetDynamicsBody().GetMass(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyGetElasticity(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ const float testElasticity = 1.23f;
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ bodyConfig.SetElasticity(testElasticity);
+ Actor actor(Actor::New());
+
+ // enable dynamics on the actor to create the Dynamicsbody
+ actor.EnableDynamics(bodyConfig);
+
+ tet_infoline("UtcDaliDynamicsBodyGetMass - DynamicsBody::GetElasticity");
+ DALI_TEST_EQUALS( testElasticity, actor.GetDynamicsBody().GetElasticity(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodySetLinearVelocity(void)
+{
+ tet_infoline("UtcDaliDynamicsBodySetLinearVelocity - DynamicsBody::SetLinearVelocity");
+
+ TestApplication application;
+ TraceCallStack& trace( application.GetPlatform().GetTrace() );
+ trace.Enable( true );
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ Actor actor(Actor::New());
+
+ // enable dynamics on the actor to create the Dynamicsbody
+ actor.EnableDynamics(bodyConfig);
+
+ DynamicsBody body(actor.GetDynamicsBody());
+ body.SetLinearVelocity(Vector3::ONE);
+
+ DALI_TEST_CHECK( ! trace.FindMethod( "DynamicsBody::SetLinearVelocity" ) );
+
+ // update
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DALI_TEST_CHECK( trace.FindMethod( "DynamicsBody::SetLinearVelocity" ) );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodySetAngularVelocity(void)
+{
+ tet_infoline("UtcDaliDynamicsBodySetAngularVelocity - DynamicsBody::SetAngularVelocity");
+
+ TestApplication application;
+ TraceCallStack& trace( application.GetPlatform().GetTrace() );
+ trace.Enable( true );
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ Actor actor(Actor::New());
+
+ // enable dynamics on the actor to create the Dynamicsbody
+ actor.EnableDynamics(bodyConfig);
+
+ DynamicsBody body(actor.GetDynamicsBody());
+ body.SetAngularVelocity(Vector3::ONE);
+
+ DALI_TEST_CHECK( ! trace.FindMethod( "DynamicsBody::SetAngularVelocity" ) );
+
+ // update
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DALI_TEST_CHECK( trace.FindMethod( "DynamicsBody::SetAngularVelocity" ) );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodySetKinematic(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ const float testMass = 1.0f;
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ bodyConfig.SetMass(testMass);
+ Actor actor(Actor::New());
+
+ // enable dynamics on the actor to create the Dynamicsbody
+ actor.EnableDynamics(bodyConfig);
+
+ DynamicsBody body(actor.GetDynamicsBody());
+
+ DALI_TEST_EQUALS( testMass, body.GetMass(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+
+ tet_infoline("UtcDaliDynamicsBodySetKinematic - DynamicsBody::SetKinematic(true)");
+ body.SetKinematic(true);
+
+ DALI_TEST_CHECK( body.IsKinematic() );
+ DALI_TEST_EQUALS( 0.0f, body.GetMass(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+
+ tet_infoline("UtcDaliDynamicsBodySetKinematic - DynamicsBody::SetKinematic(false)");
+ body.SetKinematic(false);
+ DALI_TEST_CHECK( !body.IsKinematic() );
+ DALI_TEST_EQUALS( testMass, body.GetMass(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyIsKinematic(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ const float testMass = 1.0f;
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ bodyConfig.SetMass(testMass);
+ Actor actor(Actor::New());
+
+ // enable dynamics on the actor to create the Dynamicsbody
+ actor.EnableDynamics(bodyConfig);
+
+ DynamicsBody body(actor.GetDynamicsBody());
+
+ DALI_TEST_EQUALS( testMass, body.GetMass(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+
+ tet_infoline("UtcDaliDynamicsBodySetKinematic - DynamicsBody::IsSetKinematic");
+ body.SetKinematic(true);
+
+ DALI_TEST_CHECK( body.IsKinematic() );
+ body.SetKinematic(false);
+ DALI_TEST_CHECK( !body.IsKinematic() );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodySetSleepEnabled(void)
+{
+ tet_infoline("UtcDaliDynamicsBodySetSleepEnabled");
+
+ TestApplication application;
+ TraceCallStack& trace( application.GetPlatform().GetTrace() );
+ trace.Enable( true );
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ Actor actor(Actor::New());
+
+ // enable dynamics on the actor to create the Dynamicsbody
+ actor.EnableDynamics(bodyConfig);
+
+ DynamicsBody body(actor.GetDynamicsBody());
+
+ // SleepEnabled true by default
+ DALI_TEST_CHECK( body.GetSleepEnabled() );
+ body.SetSleepEnabled(false);
+
+ DALI_TEST_CHECK( ! trace.FindMethod( "DynamicsBody::SetSleepEnabled" ) );
+
+ // update
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DALI_TEST_CHECK( trace.FindMethod( "DynamicsBody::SetSleepEnabled" ) );
+
+ DALI_TEST_CHECK( ! body.GetSleepEnabled() );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyGetSleepEnabled(void)
+{
+ tet_infoline("UtcDaliDynamicsBodyGetSleepEnabled");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ Actor actor(Actor::New());
+
+ // enable dynamics on the actor to create the Dynamicsbody
+ actor.EnableDynamics(bodyConfig);
+
+ DynamicsBody body(actor.GetDynamicsBody());
+
+ // SleepEnabled true by default
+ DALI_TEST_CHECK( body.GetSleepEnabled() );
+ body.SetSleepEnabled(false);
+ DALI_TEST_CHECK( !body.GetSleepEnabled() );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyWakeUp(void)
+{
+ tet_infoline("UtcDaliDynamicsBodyWakeUp");
+
+ TestApplication application;
+ TraceCallStack& trace( application.GetPlatform().GetTrace() );
+ trace.Enable( true );
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ Actor actor(Actor::New());
+
+ // enable dynamics on the actor to create the Dynamicsbody
+ actor.EnableDynamics(bodyConfig);
+
+ DynamicsBody body(actor.GetDynamicsBody());
+
+ body.WakeUp();
+
+ DALI_TEST_CHECK( ! trace.FindMethod( "DynamicsBody::WakeUp" ) );
+
+ // update
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DALI_TEST_CHECK( trace.FindMethod( "DynamicsBody::WakeUp" ) );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyAddAnchor(void)
+{
+ tet_infoline("UtcDaliDynamicsBodyAddAnchor - DynamicsBody::AddAnchor()");
+
+ TestApplication application;
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ worldConfig.SetType(DynamicsWorldConfig::SOFT);
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ Actor rootActor(Actor::New());
+ world.SetRootActor(rootActor);
+ Stage::GetCurrent().Add(rootActor);
+
+ DynamicsBodyConfig softConfig( DynamicsBodyConfig::New() );
+ softConfig.SetType(DynamicsBodyConfig::SOFT);
+ Mesh mesh(Mesh::NewPlane(10.0f, 10.0f, 10, 10));
+ DynamicsShape meshShape(DynamicsShape::NewMesh(mesh));
+ softConfig.SetShape( meshShape );
+ softConfig.SetMass(1.0f);
+ MeshActor softActor(MeshActor::New(mesh));
+
+ rootActor.Add(softActor);
+ softActor.EnableDynamics(softConfig);
+ DynamicsBody softBody(softActor.GetDynamicsBody());
+
+ DynamicsBodyConfig anchorConfig(DynamicsBodyConfig::New());
+ anchorConfig.SetMass(0.0f);
+ Actor anchor(Actor::New());
+ rootActor.Add(anchor);
+ anchor.EnableDynamics(anchorConfig);
+ DynamicsBody anchorBody(anchor.GetDynamicsBody());
+ anchorBody.SetKinematic(true);
+ try
+ {
+ softBody.AddAnchor(0, anchorBody, false);
+
+ DALI_TEST_CHECK(true)
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_CHECK( false );
+ }
+
+ rootActor.Remove(softActor);
+ rootActor.Remove(anchor);
+ Stage::GetCurrent().Remove(rootActor);
+ softActor.DisableDynamics();
+ anchor.DisableDynamics();
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConserveVolume(void)
+{
+ tet_infoline("UtcDaliDynamicsBodyConserveVolume");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ Actor actor(Actor::New());
+
+ // enable dynamics on the actor to create the Dynamicsbody
+ actor.EnableDynamics(bodyConfig);
+
+ DynamicsBody body(actor.GetDynamicsBody());
+
+ body.ConserveVolume(false);
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConserveShape(void)
+{
+ tet_infoline("UtcDaliDynamicsBodyConserveShape");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ Actor actor(Actor::New());
+
+ // enable dynamics on the actor to create the Dynamicsbody
+ actor.EnableDynamics(bodyConfig);
+
+ DynamicsBody body(actor.GetDynamicsBody());
+
+ body.ConserveShape(false);
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+
+
+using namespace Dali;
+
+
+int UtcDaliDynamicsBodyConfigNew(void)
+{
+ tet_infoline("UtcDaliDynamicsBodyConfigNew - DynamicsBodyConfig::New()");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig config(DynamicsBodyConfig::New());
+
+ DALI_TEST_CHECK( config );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConfigConstructor(void)
+{
+ tet_infoline("UtcDaliDynamicsBodyConfigConstructor - DynamicsBodyConfig::DynamicsBodyConfig()");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ // Default constructor - create an uninitialized handle
+ DynamicsBodyConfig config;
+
+ DALI_TEST_CHECK( !config );
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ // initialize handle
+ config = DynamicsBodyConfig::New();
+
+ DALI_TEST_CHECK( config );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConfigType(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig config(DynamicsBodyConfig::New());
+
+ tet_infoline("UtcDaliDynamicsBodyConfigType - DynamicsBodyConfig::GetType");
+ DALI_TEST_CHECK( DynamicsBodyConfig::RIGID == config.GetType() );
+
+ tet_infoline("UtcDaliDynamicsBodyConfigType - DynamicsBodyConfig::SetType(const BodyType)");
+ config.SetType( DynamicsBodyConfig::SOFT );
+ DALI_TEST_CHECK( DynamicsBodyConfig::SOFT == config.GetType() );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConfigSetShape01(void)
+{
+ tet_infoline("UtcDaliDynamicsBodyConfigSetShape01 - DynamicsBodyConfig::SetShape(const DynamicsShape::ShapeType,const Vector3&)");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig config(DynamicsBodyConfig::New());
+
+ DALI_TEST_CHECK( DynamicsShape::CUBE == config.GetShape().GetType() );
+
+ const float radius(1.5f);
+ config.SetShape(DynamicsShape::SPHERE, Vector3(radius, 0.0f, 0.0f));
+
+ DALI_TEST_CHECK( DynamicsShape::SPHERE == config.GetShape().GetType() );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConfigSetShape02(void)
+{
+ tet_infoline("UtcDaliDynamicsBodyConfigSetShape02 - DynamicsBodyConfig::SetShape(DynamicsShape)");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig config(DynamicsBodyConfig::New());
+
+ DALI_TEST_CHECK( DynamicsShape::CUBE == config.GetShape().GetType() );
+
+ const float radius(1.5f);
+ DynamicsShape shape(DynamicsShape::NewSphere(radius));
+ config.SetShape(shape);
+
+ DALI_TEST_CHECK( DynamicsShape::SPHERE == config.GetShape().GetType() );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConfigGetShape(void)
+{
+ tet_infoline("UtcDaliDynamicsBodyConfigGetShape - DynamicsBodyConfig::GetShape");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig config(DynamicsBodyConfig::New());
+
+ DALI_TEST_CHECK( DynamicsShape::CUBE == config.GetShape().GetType() );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConfigMass(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ const float testMass = 1.23f;
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig config(DynamicsBodyConfig::New());
+ config.SetMass(testMass);
+
+ tet_infoline("UtcDaliDynamicsBodyConfigMass - DynamicsBodyConfig::GetMass");
+ DALI_TEST_EQUALS( testMass, config.GetMass(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+
+ tet_infoline("UtcDaliDynamicsBodyConfigMass - DynamicsBodyConfig::SetMass");
+ const float mass = config.GetMass() + 0.1f;
+ config.SetMass(mass);
+ DALI_TEST_EQUALS( mass, config.GetMass(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConfigElasticity(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ const float testElasticity = 0.87f;
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig config(DynamicsBodyConfig::New());
+ config.SetElasticity(testElasticity);
+
+ tet_infoline("UtcDaliDynamicsBodyConfigElasticity- DynamicsBodyConfig::GetElasticity");
+ DALI_TEST_EQUALS( testElasticity, config.GetElasticity(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+
+ tet_infoline("UtcDaliDynamicsBodyConfigElasticity - DynamicsBodyConfig::SetElasticity");
+ const float elasticity = config.GetElasticity() + 0.1f;
+ config.SetElasticity(elasticity);
+ DALI_TEST_EQUALS( elasticity, config.GetElasticity(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConfigFriction(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ const float testFriction= 0.87f;
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig config(DynamicsBodyConfig::New());
+ config.SetFriction(testFriction);
+
+ tet_infoline("UtcDaliDynamicsBodyConfigFriction - DynamicsBodyConfig::GetFriction");
+ DALI_TEST_EQUALS( testFriction, config.GetFriction(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+
+ tet_infoline("UtcDaliDynamicsBodyConfigFriction - DynamicsBodyConfig::SetFriction");
+ const float friction = config.GetFriction() + 0.1f;
+ config.SetFriction(friction);
+ DALI_TEST_EQUALS( friction, config.GetFriction(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConfigLinearDamping(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ const float testDamping = 0.123f;
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig config(DynamicsBodyConfig::New());
+ config.SetLinearDamping(testDamping);
+
+ tet_infoline("UtcDaliDynamicsBodyConfigLinearDamping- DynamicsBodyConfig::GetLinearDamping");
+ DALI_TEST_EQUALS( testDamping, config.GetLinearDamping(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+
+ tet_infoline("UtcDaliDynamicsBodyConfigLinearDamping - DynamicsBodyConfig::SetLinearDamping");
+ const float damping = config.GetLinearDamping() + 0.1f;
+ config.SetLinearDamping(damping);
+ DALI_TEST_EQUALS( damping, config.GetLinearDamping(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConfigAngularDamping(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ const float testDamping = 0.123f;
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig config(DynamicsBodyConfig::New());
+ config.SetAngularDamping(testDamping);
+
+ tet_infoline("UtcDaliDynamicsBodyConfigAngularDamping- DynamicsBodyConfig::GetAngularDamping");
+ DALI_TEST_EQUALS( testDamping, config.GetAngularDamping(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+
+ tet_infoline("UtcDaliDynamicsBodyConfigAngularDamping - DynamicsBodyConfig::SetAngularDamping");
+ const float damping = config.GetAngularDamping() + 0.1f;
+ config.SetAngularDamping(damping);
+ DALI_TEST_EQUALS( damping, config.GetAngularDamping(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConfigLinearSleepVelocity(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ const float testSleepVelocity = 0.123f;
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig config(DynamicsBodyConfig::New());
+ config.SetLinearSleepVelocity(testSleepVelocity);
+
+ tet_infoline("UtcDaliDynamicsBodyConfigLinearSleepVelocity - DynamicsBodyConfig::GetLinearSleepVelocity");
+ DALI_TEST_EQUALS( testSleepVelocity, config.GetLinearSleepVelocity(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+
+ tet_infoline("UtcDaliDynamicsBodyConfigLinearSleepVelocity - DynamicsBodyConfig::SetLinearSleepVelocity");
+ const float sleepVelocity = config.GetLinearSleepVelocity() + 0.1f;
+ config.SetLinearSleepVelocity(sleepVelocity);
+ DALI_TEST_EQUALS( sleepVelocity, config.GetLinearSleepVelocity(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConfigAngularSleepVelocity(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ const float testSleepVelocity = 0.123f;
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig config(DynamicsBodyConfig::New());
+ config.SetAngularSleepVelocity(testSleepVelocity);
+
+ tet_infoline("UtcDaliDynamicsBodyConfigAngularSleepVelocity - DynamicsBodyConfig::GetAngularSleepVelocity");
+ DALI_TEST_EQUALS( testSleepVelocity, config.GetAngularSleepVelocity(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+
+ tet_infoline("UtcDaliDynamicsBodyConfigAngularSleepVelocity - DynamicsBodyConfig::SetAngularSleepVelocity");
+ const float sleepVelocity = config.GetAngularSleepVelocity() + 0.1f;
+ config.SetAngularSleepVelocity(sleepVelocity);
+ DALI_TEST_EQUALS( sleepVelocity, config.GetAngularSleepVelocity(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConfigCollisionGroup(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ const short int testGroup = 0x1234;
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig config(DynamicsBodyConfig::New());
+ config.SetCollisionGroup(testGroup);
+
+ tet_infoline("UtcDaliDynamicsBodyConfigCollisionGroup- DynamicsBodyConfig::GetCollisionGroup");
+ DALI_TEST_EQUALS( testGroup, config.GetCollisionGroup(), TEST_LOCATION );
+
+ tet_infoline("UtcDaliDynamicsBodyConfigCollisionGroup - DynamicsBodyConfig::SetCollisionGroup");
+ const short int group = config.GetCollisionGroup() + 1;
+ config.SetCollisionGroup(group);
+ DALI_TEST_EQUALS( group, config.GetCollisionGroup(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConfigCollisionMask(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ const short int testMask = 0x7ffe;
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig config(DynamicsBodyConfig::New());
+ config.SetCollisionMask(testMask);
+
+ tet_infoline("UtcDaliDynamicsBodyConfigCollisionMask- DynamicsBodyConfig::GetCollisionMask");
+ DALI_TEST_EQUALS( testMask, config.GetCollisionMask(), TEST_LOCATION );
+
+ tet_infoline("UtcDaliDynamicsBodyConfigCollisionMask - DynamicsBodyConfig::SetCollisionMask");
+ const short int mask = config.GetCollisionMask() + 1;
+ config.SetCollisionMask(mask);
+ DALI_TEST_EQUALS( mask, config.GetCollisionMask(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConfigAnchorHardness(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ const float testHardness = 0.87f;
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig config(DynamicsBodyConfig::New());
+ config.SetAnchorHardness(testHardness);
+
+ tet_infoline("UtcDaliDynamicsBodyConfigAnchorHardness - DynamicsBodyConfig::GetAnchorHardness");
+ DALI_TEST_EQUALS( testHardness, config.GetAnchorHardness(), Math::MACHINE_EPSILON_0, TEST_LOCATION );
+
+ tet_infoline("UtcDaliDynamicsBodyConfigAnchorHardness - DynamicsBodyConfig::SetAnchorHardness");
+ const float hardness = config.GetAnchorHardness() + 0.1f;
+ config.SetAnchorHardness(hardness);
+ DALI_TEST_EQUALS( hardness, config.GetAnchorHardness(), Math::MACHINE_EPSILON_1, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConfigVolumeConservation(void)
+{
+ tet_infoline("UtcDaliDynamicsBodyConfigVolumeConservation");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig config(DynamicsBodyConfig::New());
+
+ const float conservation = config.GetVolumeConservation() + 0.1f;
+ config.SetVolumeConservation(conservation);
+ DALI_TEST_EQUALS( conservation, config.GetVolumeConservation(), Math::MACHINE_EPSILON_1, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliDynamicsBodyConfigShapeConservation(void)
+{
+ tet_infoline("UtcDaliDynamicsBodyConfigShapeConservation");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig config(DynamicsBodyConfig::New());
+
+ const float conservation = config.GetShapeConservation() + 0.1f;
+ config.SetShapeConservation(conservation);
+ DALI_TEST_EQUALS( conservation, config.GetShapeConservation(), Math::MACHINE_EPSILON_1, TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+
+
+using namespace Dali;
+
+
+int UtcDaliDynamicsJointConstructor(void)
+{
+ tet_infoline("UtcDaliDynamicsJointConstructor - DynamicsJoint::DynamicsJoint");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsJoint joint;
+
+ DALI_TEST_CHECK( !joint );
+ END_TEST;
+}
+
+int UtcDaliDynamicsJointLinearLimit(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ Actor actor1(Actor::New());
+ actor1.EnableDynamics(bodyConfig);
+ Actor actor2(Actor::New());
+ actor2.EnableDynamics(bodyConfig);
+
+ DynamicsJoint joint( actor1.AddDynamicsJoint(actor2, Vector3() ) );
+
+ if( joint )
+ {
+ tet_infoline("UtcDaliDynamicsJointLinearLimit - DynamicsJoint::SetLinearLimit()");
+ joint.SetLinearLimit(DynamicsJoint::LINEAR_X, 0.0f, 1.0f);
+ }
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
+
+int UtcDaliDynamicsJointAngularLimit(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ Actor actor1(Actor::New());
+ actor1.EnableDynamics(bodyConfig);
+ Actor actor2(Actor::New());
+ actor2.EnableDynamics(bodyConfig);
+
+ DynamicsJoint joint( actor1.AddDynamicsJoint(actor2, Vector3() ) );
+
+ tet_infoline("UtcDaliDynamicsJointAngularLimit - DynamicsJoint::SetAngularLimit()");
+ joint.SetAngularLimit(DynamicsJoint::ANGULAR_X, Degree(0.0f), Degree(1.0f) );
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
+
+int UtcDaliDynamicsJointEnableSpring(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ Actor actor1(Actor::New());
+ actor1.EnableDynamics(bodyConfig);
+ Actor actor2(Actor::New());
+ actor2.EnableDynamics(bodyConfig);
+
+ DynamicsJoint joint( actor1.AddDynamicsJoint(actor2, Vector3() ) );
+
+ tet_infoline("UtcDaliDynamicsJointEnableSpring");
+ joint.EnableSpring(DynamicsJoint::LINEAR_X, true );
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
+
+int UtcDaliDynamicsJointSetSpringStiffness(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ Actor actor1(Actor::New());
+ actor1.EnableDynamics(bodyConfig);
+ Actor actor2(Actor::New());
+ actor2.EnableDynamics(bodyConfig);
+
+ DynamicsJoint joint( actor1.AddDynamicsJoint(actor2, Vector3() ) );
+
+ tet_infoline("UtcDaliDynamicsJointSetSpringStiffness");
+ joint.SetSpringStiffness(DynamicsJoint::LINEAR_X, 1.0f );
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
+
+int UtcDaliDynamicsJointSetSpringCenterPoint(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ Actor actor1(Actor::New());
+ actor1.EnableDynamics(bodyConfig);
+ Actor actor2(Actor::New());
+ actor2.EnableDynamics(bodyConfig);
+
+ DynamicsJoint joint( actor1.AddDynamicsJoint(actor2, Vector3() ) );
+
+ tet_infoline("UtcDaliDynamicsJointSetSpringCenterPoint");
+ joint.SetSpringCenterPoint(DynamicsJoint::LINEAR_X, 0.5f );
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
+
+int UtcDaliDynamicsJointEnableMotor(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ Actor actor1(Actor::New());
+ actor1.EnableDynamics(bodyConfig);
+ Actor actor2(Actor::New());
+ actor2.EnableDynamics(bodyConfig);
+
+ DynamicsJoint joint( actor1.AddDynamicsJoint(actor2, Vector3() ) );
+
+ tet_infoline("UtcDaliDynamicsJointEnableMotor");
+ joint.EnableMotor(DynamicsJoint::LINEAR_X, true );
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
+
+int UtcDaliDynamicsJointSetMotorVelocity(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ Actor actor1(Actor::New());
+ actor1.EnableDynamics(bodyConfig);
+ Actor actor2(Actor::New());
+ actor2.EnableDynamics(bodyConfig);
+
+ DynamicsJoint joint( actor1.AddDynamicsJoint(actor2, Vector3() ) );
+
+ tet_infoline("UtcDaliDynamicsJointSetMotorVelocity");
+ joint.SetMotorVelocity(DynamicsJoint::LINEAR_X, 1.0f );
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
+
+int UtcDaliDynamicsJointSetMotorForce(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ Actor actor1(Actor::New());
+ actor1.EnableDynamics(bodyConfig);
+ Actor actor2(Actor::New());
+ actor2.EnableDynamics(bodyConfig);
+
+ DynamicsJoint joint( actor1.AddDynamicsJoint(actor2, Vector3() ) );
+
+ tet_infoline("UtcDaliDynamicsJointSetMotorForce");
+ joint.SetMotorForce(DynamicsJoint::LINEAR_X, 0.5f );
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
+
+int UtcDaliDynamicsJointGetActor(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ DynamicsBodyConfig bodyConfig(DynamicsBodyConfig::New());
+ Actor actor1(Actor::New());
+ actor1.EnableDynamics(bodyConfig);
+ Actor actor2(Actor::New());
+ actor2.EnableDynamics(bodyConfig);
+
+ DynamicsJoint joint( actor1.AddDynamicsJoint(actor2, Vector3() ) );
+
+ tet_infoline("UtcDaliDynamicsJointGetActor");
+ DALI_TEST_CHECK( joint.GetActor(true) == actor1 && joint.GetActor(false) == actor2 );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+
+int UtcDaliDynamicsShapeConstructor(void)
+{
+ tet_infoline("UtcDaliDynamicsShapeConstructor - DynamicsShape::DynamicsShape");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( world )
+ {
+
+ // Default constructor - create an uninitialized handle
+ DynamicsShape shape;
+ DALI_TEST_CHECK( !shape );
+
+ // initialize handle
+ shape = DynamicsShape::NewCube(Vector3::ONE);
+
+ DALI_TEST_CHECK( shape );
+ }
+ else
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ }
+
+ END_TEST;
+}
+
+int UtcDaliDynamicsShapeNewCapsule(void)
+{
+ tet_infoline("UtcDaliDynamicsShapeNewCapsule - DynamicsShape::NewCapsule");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( world )
+ {
+
+ DynamicsShape shape( DynamicsShape::NewCapsule( 1.0f, 2.0f ) );
+
+ DALI_TEST_CHECK( shape );
+ DALI_TEST_CHECK( DynamicsShape::CAPSULE == shape.GetType() );
+ }
+ else
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ }
+
+ END_TEST;
+}
+
+int UtcDaliDynamicsShapeNewCone(void)
+{
+ tet_infoline("UtcDaliDynamicsShapeNewCone - DynamicsShape::NewCone");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( world )
+ {
+ DynamicsShape shape( DynamicsShape::NewCone( 1.0f, 2.0f ) );
+
+ DALI_TEST_CHECK( shape );
+ DALI_TEST_CHECK( DynamicsShape::CONE == shape.GetType() );
+ }
+ else
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ }
+
+ END_TEST;
+}
+
+int UtcDaliDynamicsShapeNewCube(void)
+{
+ tet_infoline("UtcDaliDynamicsShapeNewCube - DynamicsShape::NewCube");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( world )
+ {
+ DynamicsShape shape( DynamicsShape::NewCube( Vector3::ONE ) );
+
+ DALI_TEST_CHECK( shape );
+ DALI_TEST_CHECK( DynamicsShape::CUBE == shape.GetType() );
+ }
+ else
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ }
+ END_TEST;
+}
+
+int UtcDaliDynamicsShapeNewCylinder(void)
+{
+ tet_infoline("UtcDaliDynamicsShapeNewCylinder - DynamicsShape::NewCylinder");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( world )
+ {
+ DynamicsShape shape( DynamicsShape::NewCylinder( 1.0f, 2.0f ) );
+
+ DALI_TEST_CHECK( shape );
+ DALI_TEST_CHECK( DynamicsShape::CYLINDER == shape.GetType() );
+ }
+ else
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ }
+ END_TEST;
+}
+
+int UtcDaliDynamicsShapeNewMesh(void)
+{
+ tet_infoline("UtcDaliDynamicsShapeNewMesh - DynamicsShape::NewMesh");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( world )
+ {
+ DynamicsShape shape( DynamicsShape::NewMesh( Mesh::NewPlane(10.0f, 10.0f, 10, 10)) );
+
+ DALI_TEST_CHECK( shape );
+ DALI_TEST_CHECK( DynamicsShape::MESH == shape.GetType() );
+ }
+ else
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ }
+ END_TEST;
+}
+
+int UtcDaliDynamicsShapeNewSphere(void)
+{
+ tet_infoline("UtcDaliDynamicsShapeNewSphere - DynamicsShape::NewSphere");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( world )
+ {
+ DynamicsShape shape( DynamicsShape::NewSphere( 1.0f ) );
+
+ DALI_TEST_CHECK( shape );
+ DALI_TEST_CHECK( DynamicsShape::SPHERE == shape.GetType() );
+ }
+ else
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ }
+ END_TEST;
+}
+
+int UtcDaliDynamicsShapeGetType(void)
+{
+ tet_infoline("UtcDaliDynamicsShapeGetType - DynamicsShape::GetType");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( world )
+ {
+ DynamicsShape shape( DynamicsShape::NewSphere( 1.0f ) );
+
+ DALI_TEST_CHECK( shape );
+ DALI_TEST_CHECK( DynamicsShape::SPHERE == shape.GetType() );
+ }
+ else
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ }
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+#include <test-dynamics.h>
+
+using namespace Dali;
+
+int UtcDaliStageInitializeDynamics(void)
+{
+ TestApplication application;
+
+ Stage stage = Stage::GetCurrent();
+ TraceCallStack& trace = application.GetPlatform().GetTrace();
+ trace.Enable(true);
+ DALI_TEST_CHECK( stage.InitializeDynamics( DynamicsWorldConfig::New() ) );
+ DALI_TEST_CHECK( trace.FindMethod( "GetDynamicsFactory" ) );
+ DALI_TEST_CHECK( trace.FindMethod( "DynamicsFactory::InitializeDynamics" ) );
+ END_TEST;
+}
+
+int UtcDaliStageGetDynamicsWorld(void)
+{
+ TestApplication application;
+
+ Stage stage = Stage::GetCurrent();
+
+ DALI_TEST_CHECK( !stage.GetDynamicsWorld() );
+ END_TEST;
+}
+
+int UtcDaliStageTerminateDynamics(void)
+{
+ TestApplication application;
+
+ Stage stage = Stage::GetCurrent();
+
+ stage.TerminateDynamics();
+
+ DALI_TEST_CHECK( !stage.GetDynamicsWorld() );
+ END_TEST;
+}
+
+int UtcDaliDynamicsWorldConstructor(void)
+{
+ tet_infoline("UtcDaliDynamicsWorldConstructor - DynamicsWorld::DynamicsWorld");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ // Default constructor - create an uninitialized handle
+ DynamicsWorld world;
+ DALI_TEST_CHECK( !world );
+
+ // initialize handle
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ world = Stage::GetCurrent().InitializeDynamics(worldConfig);
+
+ DALI_TEST_CHECK( world );
+ END_TEST;
+}
+
+int UtcDaliDynamicsWorldGravity(void)
+{
+ TestApplication application;
+ TraceCallStack& trace( application.GetPlatform().GetTrace() );
+ trace.Enable( true );
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ const Vector3 gravity(1.0f, 2.0f, 3.0f);
+
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ tet_infoline("UtcDaliDynamicsWorldGravity - DynamicsWorld::SetGravity");
+ world.SetGravity(gravity);
+
+ // update
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DALI_TEST_CHECK( trace.FindMethod( "DynamicsWorld::SetGravity" ) );
+
+ tet_infoline("UtcDaliDynamicsWorldGravity - DynamicsWorld::GetGravity");
+ DALI_TEST_EQUALS(gravity, world.GetGravity(), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliDynamicsWorldDebugDrawMode(void)
+{
+ TestApplication application;
+ TraceCallStack& trace( application.GetPlatform().GetTrace() );
+ trace.Enable( true );
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ const Vector3 gravity(1.0f, 2.0f, 3.0f);
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ const int mode(DynamicsWorld::DEBUG_MODE_WIREFRAME | DynamicsWorld::DEBUG_MODE_AABB);
+
+ tet_infoline("UtcDaliDynamicsWorldDebugDrawMode - DynamicsWorld::SetDebugDrawMode");
+ world.SetDebugDrawMode(mode);
+
+ // update
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ DALI_TEST_CHECK( trace.FindMethod( "DynamicsWorld::SetDebugDrawMode" ) );
+
+ tet_infoline("UtcDaliDynamicsWorldDebugDrawMode - DynamicsWorld::GetDebugDrawMode");
+ DALI_TEST_CHECK(mode == world.GetDebugDrawMode());
+ END_TEST;
+}
+
+int UtcDaliDynamicsWorldRootActor(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ const Vector3 gravity(1.0f, 2.0f, 3.0f);
+ DynamicsWorldConfig worldConfig(DynamicsWorldConfig::New());
+ DynamicsWorld world( Stage::GetCurrent().InitializeDynamics(worldConfig) );
+
+ if( !world )
+ {
+ // cannot create dynamics world, log failure and exit
+ DALI_TEST_CHECK( false );
+ END_TEST;
+ }
+
+ Actor rootActor(Actor::New());
+
+ tet_infoline("UtcDaliDynamicsWorldDebugDrawMode - DynamicsWorld::GetRootActor");
+ Actor actor(world.GetRootActor());
+ DALI_TEST_CHECK( !actor );
+
+ tet_infoline("UtcDaliDynamicsWorldSetRootActor - DynamicsWorld::SetRootActor");
+ world.SetRootActor(rootActor);
+ DALI_TEST_CHECK(rootActor == world.GetRootActor());
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+
+
+using namespace Dali;
+
+
+int UtcDaliDynamicsWorldConfigConstructor(void)
+{
+ tet_infoline("UtcDaliDynamicsWorldConfigConstructor - DynamicsWorldConfig::DynamicsWorldConfig");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ // Default constructor - create an uninitialized handle
+ DynamicsWorldConfig worldConfig;
+ DALI_TEST_CHECK( !worldConfig );
+
+ // initialize handle
+ worldConfig = DynamicsWorldConfig::New();
+
+ DALI_TEST_CHECK( worldConfig );
+ END_TEST;
+}
+
+int UtcDaliDynamicsWorldConfigNew(void)
+{
+ tet_infoline("UtcDaliDynamicsWorldConfigNew - DynamicsWorldConfig::New");
+
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ // Default constructor - create an uninitialized handle
+ DynamicsWorldConfig worldConfig( DynamicsWorldConfig::New() );
+
+ DALI_TEST_CHECK( worldConfig );
+ END_TEST;
+}
+
+int UtcDaliDynamicsWorldConfigType(void)
+{
+ TestApplication application;
+
+ // start up
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ // Default constructor - create an uninitialized handle
+ DynamicsWorldConfig worldConfig( DynamicsWorldConfig::New() );
+
+ tet_infoline("UtcDaliDynamicsWorldConfigNew - DynamicsWorldConfig::GetType");
+ DALI_TEST_CHECK(DynamicsWorldConfig::RIGID == worldConfig.GetType());
+
+ tet_infoline("UtcDaliDynamicsWorldConfigNew - DynamicsWorldConfig::SetType");
+ worldConfig.SetType(DynamicsWorldConfig::SOFT);
+ DALI_TEST_CHECK(DynamicsWorldConfig::SOFT == worldConfig.GetType());
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+
+
+namespace
+{
+/** PNG image file converted to an array using standard linux commandline tool:
+ * xxd -i fractal.001.32x32.png | gvim -
+ * This is 720 wide x 1280 high.
+ */
+const unsigned char sEncodedBufferImageDataPNG[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x02, 0xd0, 0x00, 0x00, 0x05, 0x00,
+ 0x08, 0x02, 0x00, 0x00, 0x00, 0xe1, 0xac, 0xf2, 0x6a, 0x00, 0x00, 0x00,
+ 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00,
+ 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0xd8, 0x5d, 0x8f,
+ 0x5c, 0x87, 0x7d, 0xdf, 0xf1, 0x39, 0x7b, 0xce, 0xec, 0xcc, 0xce, 0x72,
+ 0xc9, 0x5d, 0x92, 0x22, 0x45, 0x8a, 0x22, 0x45, 0x51, 0x22, 0x25, 0x45,
+ 0x96, 0x6d, 0x45, 0xb6, 0x23, 0x25, 0xb5, 0x93, 0x18, 0x49, 0x6c, 0x35,
+ 0x48, 0xe0, 0x38, 0x76, 0xdd, 0x34, 0x35, 0x82, 0x5e, 0x04, 0x01, 0xda,
+ 0xdb, 0x02, 0xed, 0x55, 0x8b, 0x02, 0x05, 0x7a, 0xd1, 0x14, 0xc8, 0x65,
+ 0x0b, 0x17, 0x45, 0x9a, 0x06, 0x70, 0x9b, 0xd6, 0x76, 0x6c, 0x07, 0xb6,
+ 0x13, 0xa7, 0x89, 0x6d, 0xd5, 0x71, 0x2c, 0x89, 0xb6, 0xf5, 0x4c, 0x49,
+ 0x94, 0xf8, 0x24, 0x3e, 0x53, 0xe4, 0xee, 0x92, 0x3b, 0x3b, 0x0f, 0xe7,
+ 0x9c, 0xbe, 0x01, 0xf7, 0x22, 0xc0, 0xfc, 0xd0, 0x4e, 0xfa, 0xf9, 0xbc,
+ 0x80, 0x1f, 0x0f, 0xfe, 0x9c, 0x87, 0xef, 0x4e, 0xf1, 0x9d, 0xf7, 0xfd,
+ 0x4e, 0x27, 0x66, 0x38, 0x2d, 0x3b, 0x49, 0xc3, 0x49, 0x70, 0xff, 0xb5,
+ 0xe9, 0xce, 0xdc, 0xf8, 0x1f, 0xef, 0x39, 0x14, 0xbd, 0xcc, 0x87, 0x2f,
+ 0x5e, 0xc9, 0x8d, 0x1f, 0x5d, 0xbc, 0x93, 0x1b, 0xdf, 0xdf, 0x1d, 0xe5,
+ 0xc6, 0x0f, 0xae, 0x6c, 0x45, 0xcf, 0x5e, 0x14, 0xc1, 0xf1, 0x41, 0x7f,
+ 0x9a, 0x1b, 0xef, 0x96, 0x4d, 0xf4, 0x32, 0xbd, 0x5e, 0x9d, 0x1b, 0xaf,
+ 0xaa, 0xe0, 0x78, 0xdb, 0x16, 0xd1, 0xcb, 0x74, 0xa3, 0x97, 0xe9, 0xce,
+ 0xeb, 0x65, 0x16, 0xca, 0x36, 0xfc, 0x56, 0x0d, 0xee, 0xd7, 0xd3, 0x85,
+ 0x39, 0x7d, 0xf2, 0x4e, 0xa7, 0xd3, 0xd4, 0xc1, 0x87, 0x5f, 0xe8, 0x00,
+ 0x00, 0x84, 0x09, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00,
+ 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82,
+ 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00,
+ 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04,
+ 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00,
+ 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20,
+ 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01,
+ 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00,
+ 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0xcc, 0x4a,
+ 0xb5, 0xb4, 0x38, 0xcd, 0xad, 0xb7, 0xe1, 0xa7, 0xdf, 0x9a, 0x54, 0xb9,
+ 0xf1, 0x72, 0x1a, 0x7c, 0xfc, 0x37, 0x7e, 0xe6, 0x9e, 0xe8, 0x65, 0x8a,
+ 0x1f, 0x05, 0x53, 0xf2, 0x03, 0xe7, 0x5e, 0x09, 0x3e, 0x79, 0x11, 0x3c,
+ 0xfb, 0x30, 0xf9, 0x82, 0xe9, 0x74, 0x3a, 0xcb, 0xbd, 0x49, 0xf0, 0xd5,
+ 0xbe, 0x1d, 0x7c, 0xf8, 0x5d, 0xcb, 0xe3, 0xe8, 0x65, 0xb6, 0xb7, 0xcb,
+ 0xe4, 0x6b, 0x26, 0xf8, 0x6a, 0xef, 0x76, 0x9b, 0xe8, 0x65, 0x9a, 0xa6,
+ 0x08, 0x8e, 0x4f, 0x83, 0x97, 0xa9, 0x16, 0xeb, 0xdc, 0x78, 0x9d, 0x3c,
+ 0x4b, 0x5a, 0xf4, 0xff, 0xb4, 0x9e, 0x66, 0x7f, 0x26, 0x68, 0xea, 0xe0,
+ 0xc3, 0xfb, 0x85, 0x03, 0x00, 0x88, 0x13, 0x1c, 0x00, 0x80, 0xe0, 0x00,
+ 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20,
+ 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07,
+ 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00,
+ 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e,
+ 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00,
+ 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70,
+ 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00,
+ 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0,
+ 0x00, 0x00, 0x98, 0x95, 0xaa, 0x6d, 0x8b, 0xdc, 0x7a, 0xaf, 0x6a, 0xa2,
+ 0x4f, 0x3f, 0x9c, 0x06, 0x83, 0xe9, 0xed, 0x87, 0x0f, 0xe5, 0xc6, 0xef,
+ 0x3d, 0x79, 0x25, 0x7a, 0x99, 0xa7, 0xdf, 0x3c, 0x9f, 0x1b, 0x6f, 0x06,
+ 0xc5, 0x9c, 0xbe, 0xdc, 0x9b, 0x36, 0xbb, 0x3f, 0xa9, 0x83, 0x2f, 0xc8,
+ 0x6e, 0x19, 0x7c, 0x37, 0x4d, 0xa6, 0xd9, 0xbf, 0x3d, 0xba, 0x55, 0x9d,
+ 0x9c, 0x0f, 0xbe, 0x20, 0xc7, 0xe3, 0x32, 0xfb, 0x9a, 0x6c, 0x82, 0x0f,
+ 0xbf, 0xbd, 0x1d, 0x7c, 0xf8, 0xa2, 0x17, 0x3c, 0xcb, 0xea, 0x60, 0x34,
+ 0xc7, 0x2f, 0xc8, 0xe4, 0x07, 0x64, 0xf4, 0x2b, 0xbb, 0xd3, 0xe9, 0x14,
+ 0xc9, 0x79, 0xbf, 0x70, 0x00, 0x00, 0x71, 0x82, 0x03, 0x00, 0x10, 0x1c,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0,
+ 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00,
+ 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1,
+ 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00,
+ 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08,
+ 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00,
+ 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10,
+ 0x1c, 0x00, 0x00, 0xb3, 0x52, 0x15, 0x45, 0x70, 0xbd, 0x68, 0xdb, 0xe8,
+ 0xd3, 0xdf, 0xea, 0xf5, 0x72, 0xe3, 0x4b, 0x2f, 0x5e, 0xc9, 0x8d, 0xdf,
+ 0xfe, 0xc5, 0xf7, 0x64, 0xff, 0x63, 0xdf, 0x3a, 0x9b, 0xdb, 0x5e, 0x9f,
+ 0x56, 0xb9, 0xf1, 0xbd, 0xdd, 0x26, 0x37, 0x3e, 0x6d, 0xb2, 0x85, 0x3d,
+ 0x1c, 0x07, 0xdf, 0x4e, 0x75, 0x59, 0xe7, 0xc6, 0x9b, 0xb6, 0x88, 0x5e,
+ 0x66, 0x39, 0xfa, 0x67, 0xd3, 0x42, 0xf0, 0x73, 0xa6, 0xae, 0xb3, 0x97,
+ 0xd9, 0xdc, 0xee, 0xe6, 0xc6, 0xff, 0x60, 0xfb, 0x68, 0x6e, 0xfc, 0x93,
+ 0xe3, 0xf3, 0xb9, 0xf1, 0x7e, 0x39, 0x8d, 0x9e, 0x7d, 0x34, 0x2a, 0x83,
+ 0x5f, 0xab, 0x55, 0x33, 0xa7, 0xaf, 0xf6, 0x4e, 0xa7, 0x53, 0x55, 0xc1,
+ 0x7d, 0xbf, 0x70, 0x00, 0x00, 0x71, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00,
+ 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04,
+ 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00,
+ 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20,
+ 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01,
+ 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00,
+ 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e,
+ 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00,
+ 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c,
+ 0x00, 0x00, 0xb3, 0x52, 0x45, 0xd7, 0xdb, 0x4e, 0x11, 0xdd, 0xbf, 0xb7,
+ 0xdd, 0xca, 0x8d, 0xf7, 0x7a, 0xd3, 0xdc, 0xf8, 0x9f, 0x9e, 0xb9, 0x15,
+ 0xbd, 0xcc, 0x46, 0x5d, 0xe6, 0xc6, 0x57, 0x16, 0x82, 0x2f, 0x9b, 0xcd,
+ 0xba, 0xc9, 0x8d, 0xd7, 0xe1, 0x17, 0xe4, 0x9e, 0xde, 0x28, 0x37, 0x3e,
+ 0x69, 0x82, 0x7f, 0x1e, 0x4c, 0x46, 0xd9, 0xbf, 0x3d, 0xd6, 0x87, 0x8b,
+ 0xb9, 0xf1, 0x22, 0xf9, 0xbf, 0x5a, 0x15, 0x4d, 0xf4, 0x32, 0x6d, 0x72,
+ 0xfc, 0x91, 0x8d, 0xe0, 0xe7, 0xcc, 0x1b, 0xfb, 0xd7, 0x72, 0xe3, 0x6b,
+ 0xc3, 0x71, 0xf4, 0xec, 0x3b, 0x06, 0xc1, 0xfd, 0xba, 0x5e, 0x48, 0x8e,
+ 0x47, 0x5f, 0x32, 0x9d, 0xf1, 0x38, 0xf8, 0x76, 0xf2, 0x0b, 0x07, 0x00,
+ 0x10, 0x27, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00,
+ 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e,
+ 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00,
+ 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c,
+ 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00,
+ 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0,
+ 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00,
+ 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04,
+ 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x30, 0x2b, 0x55,
+ 0xa7, 0xd3, 0xe6, 0xd6, 0x27, 0x75, 0x36, 0x68, 0xba, 0x0b, 0x4d, 0x6e,
+ 0x7c, 0x47, 0x55, 0xe7, 0xc6, 0x3f, 0x7e, 0xee, 0x9d, 0xe8, 0x65, 0xbe,
+ 0xfb, 0xf0, 0xa1, 0xdc, 0x78, 0x3d, 0x0d, 0x5e, 0xe6, 0xd7, 0xde, 0x3a,
+ 0x9b, 0x3c, 0x4c, 0x1b, 0x3d, 0xfb, 0xb0, 0x2e, 0x73, 0xe3, 0x2b, 0xd5,
+ 0x34, 0x37, 0x3e, 0x6d, 0x8a, 0xe8, 0x65, 0x5e, 0x9a, 0xee, 0xcc, 0x8d,
+ 0xef, 0x5b, 0x18, 0xe7, 0xc6, 0xf7, 0x2e, 0x8c, 0xa2, 0x97, 0xb9, 0x5c,
+ 0xf7, 0x73, 0xe3, 0x27, 0x97, 0x57, 0x73, 0xe3, 0xb7, 0x46, 0x8b, 0xc1,
+ 0x57, 0x7b, 0x67, 0x3b, 0x7a, 0xf6, 0x47, 0xcb, 0x9b, 0xb9, 0xf1, 0xc5,
+ 0x2a, 0xf8, 0xc5, 0xd4, 0x29, 0xb2, 0x6f, 0xd5, 0xf1, 0x34, 0xf8, 0xad,
+ 0xed, 0x17, 0x0e, 0x00, 0x20, 0x4e, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00,
+ 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0,
+ 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00,
+ 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04,
+ 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00,
+ 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20,
+ 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01,
+ 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40,
+ 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03,
+ 0x00, 0x60, 0x56, 0xaa, 0xb6, 0x2d, 0x72, 0xeb, 0xa3, 0x69, 0x19, 0x7e,
+ 0xfe, 0x36, 0x37, 0x5d, 0x26, 0xc7, 0xef, 0x6b, 0xef, 0x44, 0xef, 0xb2,
+ 0xf4, 0xfa, 0xf9, 0xdc, 0xf8, 0x37, 0x0e, 0x1f, 0xca, 0x8d, 0x7f, 0xf1,
+ 0xc0, 0xbd, 0xb9, 0xf1, 0x5b, 0x1f, 0xd8, 0x1f, 0x3d, 0xfb, 0x3f, 0xfa,
+ 0xca, 0x73, 0xb9, 0xf1, 0xa6, 0x4d, 0x3e, 0x7a, 0x91, 0x7d, 0xa3, 0x16,
+ 0x4d, 0x70, 0xfc, 0xf7, 0x1f, 0x3d, 0x9e, 0x1b, 0xff, 0xcc, 0x0b, 0x6f,
+ 0x46, 0x2f, 0x73, 0xb2, 0x5d, 0xc9, 0x8d, 0x7f, 0xfd, 0x9f, 0x7d, 0x24,
+ 0x37, 0xfe, 0x2f, 0xfe, 0xcd, 0x97, 0x72, 0xe3, 0x77, 0x2d, 0x6d, 0x47,
+ 0xcf, 0x7e, 0x6b, 0x6b, 0x31, 0x37, 0x3e, 0x58, 0x9c, 0xce, 0xef, 0x7b,
+ 0xb5, 0x28, 0x82, 0x1f, 0x34, 0x7e, 0xe1, 0x00, 0x00, 0xe2, 0x04, 0x07,
+ 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00,
+ 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e,
+ 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00,
+ 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70,
+ 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00,
+ 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0,
+ 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00,
+ 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04,
+ 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x66, 0xa5, 0xda, 0x1a, 0x57, 0xc1,
+ 0x9c, 0x29, 0xda, 0xe8, 0xd3, 0xb7, 0x6d, 0x30, 0x98, 0xb6, 0x9b, 0x32,
+ 0x37, 0xde, 0x2f, 0xea, 0xe8, 0x65, 0x16, 0x17, 0x9a, 0xdc, 0xf8, 0x63,
+ 0x17, 0xae, 0xe5, 0xc6, 0xbf, 0xf6, 0xe4, 0xb1, 0xdc, 0xf8, 0x87, 0x5e,
+ 0xbe, 0x11, 0x3d, 0xfb, 0x46, 0xd1, 0x0d, 0xbe, 0x57, 0x9b, 0xe0, 0xbb,
+ 0x69, 0xda, 0x16, 0xd1, 0xcb, 0x4c, 0x3a, 0xc1, 0xfd, 0xeb, 0x47, 0xf7,
+ 0xe7, 0xc6, 0x7f, 0xf8, 0xca, 0xf5, 0xe8, 0x65, 0x5e, 0xfe, 0xc8, 0x7d,
+ 0xb9, 0xf1, 0xf7, 0xfc, 0xde, 0xf7, 0x72, 0xe3, 0xa7, 0x06, 0x6b, 0xb9,
+ 0xf1, 0x87, 0xda, 0x8d, 0xe8, 0xd9, 0x9b, 0xe4, 0x0b, 0xfe, 0xf6, 0x68,
+ 0x31, 0xf8, 0xd9, 0x5e, 0x65, 0xbf, 0x3b, 0xaa, 0x85, 0xe0, 0xe7, 0x8c,
+ 0x5f, 0x38, 0x00, 0x80, 0x38, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40,
+ 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03,
+ 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00,
+ 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00,
+ 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0,
+ 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00,
+ 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1,
+ 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00,
+ 0x80, 0x59, 0xa9, 0xea, 0xa6, 0xc8, 0xad, 0xb7, 0xe1, 0xa7, 0xbf, 0x53,
+ 0x57, 0xb9, 0xf1, 0x69, 0x1b, 0xbc, 0x4c, 0x11, 0xbe, 0x4c, 0x13, 0xfd,
+ 0x17, 0x92, 0xdb, 0xbd, 0x83, 0xcb, 0xb9, 0xf1, 0xcd, 0x93, 0x97, 0xa2,
+ 0x67, 0x3f, 0x53, 0x0d, 0x72, 0xe3, 0xdf, 0x1b, 0xec, 0xcd, 0x8d, 0x1f,
+ 0xb9, 0x7d, 0x3b, 0x7a, 0x99, 0x36, 0xf9, 0xa2, 0x19, 0x9c, 0xbd, 0x99,
+ 0x1b, 0xff, 0xe2, 0xa7, 0x1e, 0x8d, 0x5e, 0x66, 0x6d, 0x58, 0xe7, 0xc6,
+ 0x3f, 0xb6, 0x71, 0x2b, 0x37, 0x7e, 0xb8, 0x1a, 0xe6, 0xc6, 0x37, 0xba,
+ 0xdd, 0xe8, 0xd9, 0x77, 0x74, 0xa7, 0x73, 0xfa, 0x9d, 0x3d, 0x1e, 0x65,
+ 0x2f, 0x33, 0x4e, 0x26, 0x81, 0x5f, 0x38, 0x00, 0x80, 0x38, 0xc1, 0x01,
+ 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40,
+ 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03,
+ 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00,
+ 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38,
+ 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00,
+ 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1,
+ 0x01, 0x00, 0x08, 0x0e, 0x00, 0x80, 0x59, 0xa9, 0xce, 0xdf, 0x19, 0xe4,
+ 0xd6, 0x6f, 0x15, 0xdd, 0xe8, 0xd3, 0xef, 0xe8, 0x4c, 0xe7, 0xb4, 0xc5,
+ 0x86, 0x4d, 0x36, 0xf5, 0x7e, 0xb4, 0x77, 0x6f, 0x6e, 0x7c, 0xf3, 0x76,
+ 0x93, 0x1b, 0x1f, 0x7c, 0xfb, 0x42, 0x6e, 0xfc, 0xf9, 0x7f, 0xf9, 0x54,
+ 0xf4, 0xec, 0x4b, 0x7f, 0xf8, 0x7a, 0xf0, 0x35, 0xf3, 0xeb, 0x47, 0x73,
+ 0xe3, 0xed, 0xbf, 0x7d, 0x3e, 0x7a, 0x99, 0x3b, 0x55, 0x99, 0x1b, 0xbf,
+ 0xb1, 0x63, 0x31, 0x37, 0xfe, 0xd4, 0xff, 0x38, 0x15, 0xbd, 0xcc, 0xe1,
+ 0xd1, 0x30, 0x37, 0xde, 0x2f, 0x82, 0x6f, 0xd5, 0xb2, 0x68, 0x83, 0x1f,
+ 0x32, 0x75, 0x15, 0x3d, 0x7b, 0x9b, 0x1c, 0x8f, 0x5e, 0xa6, 0x08, 0x37,
+ 0xc1, 0xe6, 0x34, 0xf8, 0xad, 0xed, 0x17, 0x0e, 0x00, 0x20, 0x4e, 0x70,
+ 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00,
+ 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0,
+ 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00,
+ 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04,
+ 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00,
+ 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08,
+ 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01,
+ 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40,
+ 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x60, 0x56, 0xaa, 0xff, 0x78, 0xff,
+ 0xf1, 0xdc, 0xfa, 0xee, 0x8d, 0xed, 0xe8, 0xd3, 0x3f, 0x75, 0xf5, 0xca,
+ 0x9c, 0xde, 0x7d, 0xa3, 0xed, 0x46, 0xf7, 0x9b, 0xdb, 0xd3, 0xdc, 0xf8,
+ 0x5f, 0x7d, 0xfa, 0x27, 0x72, 0xe3, 0xe5, 0xe9, 0xf5, 0xdc, 0xf8, 0xd3,
+ 0xbf, 0xf2, 0x70, 0xf4, 0xec, 0x5f, 0xea, 0x17, 0xc1, 0xff, 0xd3, 0x2f,
+ 0x9c, 0xcd, 0x8d, 0x5f, 0x38, 0xba, 0x16, 0xbd, 0xcc, 0xad, 0xaa, 0xcc,
+ 0x8d, 0xef, 0x39, 0xb3, 0x91, 0x1b, 0x5f, 0xee, 0x34, 0xd1, 0xcb, 0x2c,
+ 0x15, 0x75, 0x6e, 0xbc, 0x6d, 0x93, 0x1f, 0x32, 0xc9, 0xf1, 0x4e, 0x11,
+ 0xbd, 0x7a, 0x67, 0x73, 0x1a, 0xfc, 0x04, 0x8e, 0x1e, 0x66, 0xd4, 0x94,
+ 0xd1, 0xcb, 0x7c, 0x6b, 0xed, 0xee, 0xdc, 0xb8, 0x5f, 0x38, 0x00, 0x80,
+ 0x38, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08,
+ 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00,
+ 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10,
+ 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00,
+ 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80,
+ 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07,
+ 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38,
+ 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x80, 0x59, 0xa9, 0xce,
+ 0xff, 0xca, 0xc3, 0xb9, 0xf5, 0xf6, 0x6b, 0x6f, 0x45, 0x9f, 0xfe, 0x95,
+ 0x77, 0x87, 0xb9, 0xf1, 0x03, 0xd3, 0xed, 0xdc, 0xf8, 0xb0, 0x28, 0xa3,
+ 0x97, 0xb9, 0x74, 0x60, 0x67, 0xf0, 0x45, 0xb3, 0xb6, 0x98, 0x1b, 0x5f,
+ 0xfe, 0x07, 0x27, 0x72, 0xe3, 0x07, 0x07, 0x4b, 0xd1, 0xb3, 0x7f, 0xe6,
+ 0x63, 0x8f, 0xe4, 0xc6, 0xbf, 0xd4, 0xab, 0x72, 0xe3, 0x6f, 0x9d, 0xdb,
+ 0x8c, 0x5e, 0xe6, 0xf0, 0x72, 0xf0, 0xf2, 0xe7, 0x9e, 0xbd, 0x94, 0x1b,
+ 0x3f, 0xfe, 0xf5, 0xf5, 0xe8, 0x65, 0xc6, 0x45, 0xf0, 0xaf, 0xbe, 0xcd,
+ 0x36, 0xf8, 0x9a, 0xd9, 0xd1, 0x04, 0xc7, 0xab, 0xa2, 0x9d, 0xdf, 0xaf,
+ 0xd5, 0xad, 0x26, 0xf8, 0xf1, 0xfe, 0x4a, 0x77, 0x25, 0xfa, 0xf0, 0xaf,
+ 0x1d, 0xd9, 0x97, 0x1b, 0xf7, 0x0b, 0x07, 0x00, 0x10, 0x27, 0x38, 0x00,
+ 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08,
+ 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00,
+ 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40,
+ 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03,
+ 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80,
+ 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38,
+ 0x00, 0x00, 0xc1, 0x01, 0x00, 0x30, 0x2b, 0xd5, 0x3f, 0xfc, 0xdd, 0x6f,
+ 0xe6, 0xd6, 0x5f, 0xea, 0xad, 0x44, 0x9f, 0xfe, 0x4f, 0x7f, 0xe3, 0xfd,
+ 0xb9, 0xf1, 0x8f, 0xff, 0xe7, 0x93, 0xb9, 0xf1, 0x51, 0x95, 0x4d, 0xbd,
+ 0x95, 0x4b, 0xb7, 0x73, 0xe3, 0x4b, 0xcf, 0x5f, 0xcf, 0x8d, 0x5f, 0xde,
+ 0xdb, 0x9b, 0xdf, 0xbe, 0x3e, 0xd0, 0x5b, 0xca, 0x8d, 0x7f, 0xf2, 0x17,
+ 0x4f, 0xe4, 0xc6, 0xbf, 0xf1, 0xdc, 0xd9, 0xe8, 0x65, 0xce, 0x9d, 0xbe,
+ 0x99, 0x1b, 0xdf, 0xfd, 0xc6, 0x46, 0x6e, 0xfc, 0xc2, 0xca, 0x20, 0x7a,
+ 0x99, 0x1f, 0x1c, 0xda, 0x9f, 0x1b, 0xff, 0xd0, 0x0b, 0x97, 0x72, 0xe3,
+ 0xef, 0xf4, 0x83, 0x97, 0x79, 0x64, 0xb8, 0x1e, 0x3d, 0x7b, 0x99, 0x1c,
+ 0xaf, 0xdb, 0xe0, 0xf8, 0x1b, 0x07, 0xf6, 0x44, 0x2f, 0xf3, 0xc1, 0x1f,
+ 0x9c, 0x99, 0xdf, 0x4f, 0x60, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e,
+ 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00,
+ 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70,
+ 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00,
+ 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0,
+ 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00,
+ 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04,
+ 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00,
+ 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08,
+ 0x0e, 0x00, 0x80, 0x99, 0xa9, 0xf6, 0xb5, 0xa3, 0xdc, 0x7a, 0xd1, 0x5b,
+ 0x8d, 0x3e, 0xfd, 0xc6, 0xfa, 0x76, 0x6e, 0xfc, 0xd5, 0x3d, 0xbb, 0x72,
+ 0xe3, 0xbd, 0xed, 0x69, 0xf4, 0x32, 0xa7, 0x3f, 0x79, 0x22, 0x37, 0xbe,
+ 0x79, 0x6e, 0x23, 0x37, 0xfe, 0xd8, 0xcf, 0x1e, 0xce, 0x8d, 0x2f, 0x86,
+ 0x0b, 0xbb, 0xe9, 0xb4, 0xb9, 0xf1, 0x7d, 0x65, 0x3f, 0x37, 0xfe, 0x5b,
+ 0x1f, 0x7a, 0x28, 0x7a, 0x99, 0xff, 0x30, 0x7e, 0x39, 0x37, 0xde, 0xfd,
+ 0xad, 0xe0, 0xc3, 0xbf, 0xf5, 0x85, 0xd3, 0xd1, 0xcb, 0xf4, 0x3e, 0x76,
+ 0x24, 0x37, 0xfe, 0xcd, 0xbf, 0x73, 0x28, 0x37, 0x7e, 0xe2, 0xf3, 0xaf,
+ 0x04, 0x5f, 0xed, 0xc3, 0xed, 0xe8, 0xd9, 0xfb, 0x9d, 0x26, 0x37, 0x7e,
+ 0x6d, 0x65, 0x29, 0x37, 0x7e, 0x76, 0xcf, 0x8e, 0xe8, 0x65, 0x9e, 0x78,
+ 0xfb, 0x4a, 0x6e, 0xdc, 0x2f, 0x1c, 0x00, 0x40, 0x9c, 0xe0, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38,
+ 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00,
+ 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1,
+ 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00,
+ 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82,
+ 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00,
+ 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10,
+ 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00,
+ 0x00, 0x04, 0x07, 0x00, 0xc0, 0xac, 0x54, 0xff, 0xeb, 0xd8, 0xa1, 0xdc,
+ 0xfa, 0x33, 0x4f, 0xdc, 0x17, 0x7d, 0xfa, 0xf7, 0x3e, 0x73, 0x31, 0x37,
+ 0xfe, 0xec, 0x2f, 0xdf, 0x9f, 0x1b, 0xdf, 0xb9, 0x3e, 0x89, 0x5e, 0x66,
+ 0x74, 0xf7, 0x52, 0x6e, 0xbc, 0xfb, 0xe8, 0x6a, 0x6e, 0xfc, 0x89, 0xfd,
+ 0xbb, 0x73, 0xe3, 0x6d, 0xf8, 0xed, 0x54, 0x14, 0xc5, 0x9c, 0x7e, 0x10,
+ 0xd4, 0xe1, 0xdb, 0x7c, 0xe2, 0xa7, 0x1f, 0xc8, 0x8d, 0xff, 0xfb, 0x2f,
+ 0xbf, 0x10, 0xbc, 0xcc, 0x53, 0xfb, 0xa2, 0x97, 0x59, 0x1b, 0x4f, 0x73,
+ 0xe3, 0xfd, 0xef, 0x04, 0x3f, 0x21, 0x77, 0x0e, 0x83, 0x1f, 0x62, 0x57,
+ 0xba, 0xfd, 0xec, 0x9f, 0xda, 0x75, 0x93, 0x1b, 0xff, 0xce, 0xe3, 0x47,
+ 0x72, 0xe3, 0x07, 0x27, 0x4d, 0xf4, 0x32, 0xbd, 0xb2, 0x0e, 0x9e, 0x5d,
+ 0x73, 0x01, 0x00, 0x69, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0,
+ 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00,
+ 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04,
+ 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00,
+ 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20,
+ 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01,
+ 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40,
+ 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03,
+ 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00,
+ 0xb3, 0x52, 0x8d, 0xde, 0x9d, 0xe6, 0xd6, 0x3f, 0xfb, 0xdf, 0x4e, 0x46,
+ 0x9f, 0x7e, 0xbd, 0xec, 0xe6, 0xc6, 0x57, 0x3e, 0xbf, 0x95, 0x1b, 0xbf,
+ 0xb8, 0x3a, 0x88, 0x5e, 0xe6, 0xe2, 0x3b, 0xb7, 0x83, 0x67, 0xff, 0xf9,
+ 0x83, 0xc1, 0xb3, 0x57, 0x5d, 0x6f, 0xcb, 0xbf, 0x7d, 0x56, 0x17, 0x82,
+ 0xff, 0xad, 0x7f, 0xff, 0xef, 0x3e, 0x92, 0x1b, 0x3f, 0x75, 0xe5, 0x56,
+ 0xf4, 0x32, 0x2f, 0xfc, 0xde, 0x8f, 0x72, 0xe3, 0xdd, 0xed, 0xe0, 0xc7,
+ 0xfb, 0xd5, 0x41, 0x3f, 0x37, 0xfe, 0xd6, 0xa3, 0xfb, 0xa3, 0x67, 0xbf,
+ 0xfc, 0xd0, 0x6a, 0x6e, 0xfc, 0xc4, 0x76, 0xf0, 0xc9, 0x9f, 0xfc, 0xfc,
+ 0xf7, 0xa3, 0x97, 0xb9, 0xbb, 0x1c, 0xe5, 0xc6, 0xfd, 0xc2, 0x01, 0x00,
+ 0xc4, 0x09, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40,
+ 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03,
+ 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80,
+ 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38,
+ 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00,
+ 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1,
+ 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0xcc, 0x4a, 0xf5,
+ 0xb1, 0x8d, 0x8b, 0xb9, 0xf5, 0xf5, 0xa2, 0x9b, 0xcd, 0xa5, 0x3a, 0x38,
+ 0x7e, 0xbb, 0xa8, 0x72, 0xe3, 0xd7, 0x9a, 0x36, 0x7b, 0x99, 0xbd, 0x4b,
+ 0xb9, 0xf1, 0xfb, 0x7e, 0xe9, 0xde, 0xdc, 0xf8, 0xb0, 0x0d, 0xfe, 0xa7,
+ 0xf6, 0x8b, 0xd2, 0x7b, 0xfe, 0xff, 0xd2, 0x5f, 0x36, 0x45, 0x6e, 0xfc,
+ 0x68, 0x77, 0x90, 0x1b, 0x6f, 0xd6, 0xea, 0xe8, 0x65, 0x4e, 0xfd, 0xdc,
+ 0xdd, 0xb9, 0xf1, 0x9d, 0x9f, 0x3a, 0x96, 0x1b, 0x3f, 0xfd, 0xaf, 0x9f,
+ 0xcf, 0x8d, 0x2f, 0xed, 0x5c, 0x8c, 0x9e, 0xfd, 0x27, 0xff, 0xeb, 0xeb,
+ 0xc1, 0xcb, 0xfc, 0xc2, 0x7d, 0xb9, 0xf1, 0x1f, 0x1e, 0xb8, 0x2b, 0x7a,
+ 0x99, 0x7b, 0xde, 0x1d, 0x27, 0x3f, 0x07, 0x00, 0x00, 0xe2, 0x7f, 0x78,
+ 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00,
+ 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82,
+ 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00,
+ 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10,
+ 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00,
+ 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20,
+ 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07,
+ 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00,
+ 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x80, 0xd9, 0xa8, 0x96, 0xcb, 0x3a,
+ 0xb7, 0xbe, 0xd8, 0x36, 0xd1, 0xa7, 0xbf, 0x5e, 0xf7, 0x72, 0xe3, 0xdf,
+ 0xf8, 0xb9, 0x63, 0xb9, 0xf1, 0x41, 0xaf, 0x8c, 0x5e, 0x66, 0xb4, 0x39,
+ 0xc9, 0x8d, 0x9f, 0xfd, 0xf6, 0xc5, 0xdc, 0xf8, 0xf0, 0x37, 0xf6, 0xe5,
+ 0xc6, 0xd7, 0x04, 0xf6, 0xdf, 0x46, 0x6d, 0x72, 0xfc, 0xd8, 0xf2, 0x4a,
+ 0xf4, 0xe1, 0x7f, 0xfb, 0xe9, 0xf7, 0xe6, 0xc6, 0xff, 0xf8, 0xaf, 0xde,
+ 0xcc, 0x8d, 0x17, 0x9f, 0x38, 0x9a, 0x1b, 0xdf, 0xf5, 0x27, 0x6f, 0x47,
+ 0xcf, 0x7e, 0xcf, 0x78, 0x3b, 0x37, 0xfe, 0xe8, 0x57, 0x5e, 0xc8, 0x8d,
+ 0xaf, 0xd6, 0x93, 0xe8, 0x65, 0xca, 0x41, 0xf0, 0x5b, 0xdb, 0x07, 0x30,
+ 0x00, 0x10, 0x27, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00,
+ 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08,
+ 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00,
+ 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10,
+ 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03,
+ 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80,
+ 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x30, 0x2b,
+ 0x55, 0x51, 0xb4, 0xb9, 0xf5, 0xb6, 0x2d, 0xc2, 0x4f, 0xdf, 0xe4, 0xc6,
+ 0x7f, 0xea, 0x99, 0x73, 0xb9, 0xf1, 0x67, 0xfe, 0xc9, 0xe3, 0xd1, 0xcb,
+ 0x14, 0x7b, 0x7a, 0xb9, 0xf1, 0x9f, 0xfc, 0xa9, 0x7b, 0x72, 0xe3, 0x87,
+ 0xba, 0x4b, 0xb9, 0xf1, 0xc6, 0x3b, 0x9e, 0xbf, 0xe9, 0x87, 0x58, 0x78,
+ 0xbf, 0x9f, 0xfc, 0x90, 0xfc, 0x7b, 0x4f, 0x1e, 0xcf, 0x8d, 0xff, 0x97,
+ 0xe1, 0x2b, 0xc1, 0x4f, 0xb0, 0x4b, 0xc3, 0xec, 0x77, 0x47, 0x37, 0xf8,
+ 0x1f, 0xbb, 0x77, 0x34, 0xce, 0x8d, 0xdf, 0xd5, 0x1d, 0x45, 0x2f, 0x73,
+ 0x57, 0x27, 0xb8, 0xef, 0x17, 0x0e, 0x00, 0x20, 0x4e, 0x70, 0x00, 0x00,
+ 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00,
+ 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0,
+ 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00,
+ 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1,
+ 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00,
+ 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08,
+ 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00,
+ 0x00, 0x82, 0x03, 0x00, 0x60, 0x56, 0xaa, 0xba, 0x2d, 0x72, 0xeb, 0x37,
+ 0xeb, 0xc5, 0xe8, 0xd3, 0x17, 0x6d, 0x70, 0xbc, 0x57, 0x06, 0xd7, 0x77,
+ 0x7d, 0xf5, 0x4c, 0xf4, 0x32, 0xe7, 0xde, 0xbf, 0x37, 0xf8, 0xa2, 0xf9,
+ 0xe8, 0xe1, 0xdc, 0x78, 0xe3, 0x4d, 0xc9, 0xff, 0x57, 0x8a, 0xe0, 0x27,
+ 0xf0, 0x42, 0x27, 0x38, 0xde, 0xdf, 0x11, 0xfc, 0x78, 0xbf, 0xf0, 0x99,
+ 0x13, 0xd1, 0xab, 0x5f, 0xff, 0xdc, 0x0f, 0x73, 0xe3, 0xf7, 0x97, 0xc3,
+ 0xdc, 0xf8, 0x60, 0x3c, 0x8d, 0x5e, 0xa6, 0x4d, 0x7e, 0xab, 0xfa, 0x85,
+ 0x03, 0x00, 0x88, 0x13, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38,
+ 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00,
+ 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1,
+ 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00,
+ 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82,
+ 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00,
+ 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x98,
+ 0x95, 0xea, 0xe4, 0xc2, 0x5a, 0x6e, 0xbd, 0x0e, 0x3f, 0x7d, 0x5d, 0x14,
+ 0xb9, 0xf1, 0x72, 0xd2, 0xe4, 0xc6, 0x07, 0xeb, 0xa3, 0xe8, 0x65, 0xee,
+ 0x7b, 0xfa, 0x48, 0x6e, 0xfc, 0xee, 0x5e, 0xdf, 0x3b, 0x07, 0xfe, 0xdf,
+ 0x77, 0x7a, 0x6b, 0x33, 0x37, 0x7e, 0xee, 0x5b, 0xe7, 0x73, 0xe3, 0x3b,
+ 0xbf, 0x75, 0x29, 0x7a, 0x99, 0x33, 0xc7, 0x56, 0x73, 0xe3, 0x1f, 0x7c,
+ 0xf6, 0x6a, 0x6e, 0xbc, 0x5d, 0x2c, 0xa2, 0x97, 0x99, 0xb6, 0xc1, 0x7d,
+ 0xbf, 0x70, 0x00, 0x00, 0x71, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80,
+ 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38,
+ 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00,
+ 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1,
+ 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00,
+ 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82,
+ 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00,
+ 0x00, 0xb3, 0x52, 0x2d, 0x26, 0x93, 0xe3, 0x8f, 0x3e, 0x70, 0x7f, 0xf4,
+ 0xe9, 0xef, 0x7b, 0xf9, 0x7a, 0x6e, 0x7c, 0x7d, 0xb0, 0x98, 0x1b, 0xbf,
+ 0xf1, 0x8f, 0xdf, 0x1b, 0xbd, 0x4c, 0x77, 0xd2, 0xe4, 0xc6, 0x7f, 0x62,
+ 0xe7, 0x6a, 0x6e, 0xbc, 0xee, 0xb4, 0xde, 0x96, 0xf8, 0x9b, 0x6f, 0x26,
+ 0x9e, 0x7b, 0xed, 0x4a, 0x6e, 0xbc, 0xd9, 0x9c, 0xe4, 0xc6, 0xef, 0xb9,
+ 0x7c, 0x3b, 0x7a, 0xf6, 0xe3, 0xeb, 0xc1, 0xfd, 0xad, 0xb2, 0xca, 0x8d,
+ 0x5f, 0xae, 0xfb, 0xd1, 0xcb, 0x94, 0x75, 0x3b, 0xa7, 0xaf, 0x76, 0x00,
+ 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08,
+ 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00,
+ 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10,
+ 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00,
+ 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80,
+ 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07,
+ 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38,
+ 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x80, 0x59, 0xaa, 0x7a,
+ 0xb7, 0x27, 0xc1, 0xf9, 0x6e, 0x11, 0x7d, 0xfa, 0x57, 0x7f, 0xe1, 0x68,
+ 0x6e, 0xbc, 0x9c, 0x36, 0xc1, 0xd0, 0xfb, 0xc3, 0x53, 0xd1, 0xcb, 0xdc,
+ 0xfb, 0xef, 0x3e, 0x9c, 0x1b, 0x6f, 0x3b, 0xed, 0x9c, 0x8e, 0x17, 0x9d,
+ 0xc2, 0x7b, 0x9e, 0xbf, 0xd9, 0x0b, 0xb2, 0x6d, 0xa3, 0xfb, 0x0b, 0x45,
+ 0xf0, 0xaf, 0xbe, 0xad, 0xeb, 0x5b, 0xb9, 0xf1, 0x7a, 0x6d, 0x31, 0x37,
+ 0x7e, 0xfa, 0xfd, 0xfb, 0xa2, 0x67, 0xbf, 0x75, 0x6d, 0x39, 0xf8, 0xdd,
+ 0xf1, 0xe2, 0xa5, 0xdc, 0xf8, 0x0b, 0xab, 0xab, 0xd9, 0x17, 0x64, 0x1d,
+ 0x7c, 0xc1, 0xfb, 0x85, 0x03, 0x00, 0x88, 0x13, 0x1c, 0x00, 0x80, 0xe0,
+ 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00,
+ 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04,
+ 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00,
+ 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08,
+ 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00,
+ 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40,
+ 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03,
+ 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80,
+ 0xe0, 0x00, 0x00, 0x98, 0x95, 0xea, 0xbf, 0x3f, 0x7e, 0x2c, 0xb7, 0x7e,
+ 0xfc, 0xc0, 0xae, 0xe8, 0xd3, 0xef, 0xff, 0xe2, 0x8b, 0xb9, 0xf1, 0xe1,
+ 0x42, 0x99, 0x1b, 0x7f, 0x73, 0x6d, 0x25, 0x7a, 0x99, 0x1f, 0xfe, 0xfe,
+ 0xcb, 0xb9, 0xf1, 0xde, 0x67, 0x8b, 0xe0, 0x6b, 0xe6, 0xc1, 0xbd, 0xb9,
+ 0xf1, 0x03, 0x65, 0x2f, 0xfb, 0x7e, 0x2a, 0x8a, 0x0e, 0x3f, 0xf6, 0x30,
+ 0xd9, 0x3f, 0x9b, 0x82, 0xf3, 0x9b, 0x45, 0x1d, 0xbd, 0xcc, 0x17, 0x9f,
+ 0x3d, 0x9d, 0x1b, 0x1f, 0x7f, 0xf5, 0x6c, 0x6e, 0xfc, 0xe8, 0x38, 0x78,
+ 0x99, 0x3d, 0xcf, 0x5e, 0x8a, 0x9e, 0xfd, 0xd2, 0x4f, 0x1f, 0xca, 0x8d,
+ 0xff, 0xc5, 0xfe, 0xe0, 0xc7, 0xfb, 0x91, 0xcb, 0x9b, 0xd1, 0xcb, 0x7c,
+ 0xe2, 0xf4, 0xeb, 0xc9, 0xb7, 0x2a, 0x00, 0x40, 0x98, 0xe0, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38,
+ 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00,
+ 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1,
+ 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00,
+ 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82,
+ 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00,
+ 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10,
+ 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00,
+ 0x00, 0x04, 0x07, 0x00, 0xc0, 0xac, 0x54, 0xbb, 0x6f, 0x0c, 0x73, 0xeb,
+ 0x4f, 0xfc, 0xe0, 0xaf, 0xb3, 0xb9, 0x94, 0xec, 0xa5, 0xab, 0x4d, 0x2f,
+ 0x37, 0x7e, 0xfa, 0xe7, 0xef, 0x8d, 0x5e, 0xa6, 0xb8, 0xab, 0x9f, 0x1b,
+ 0x7f, 0xe7, 0x2f, 0x2f, 0xe4, 0xc6, 0x5f, 0x7b, 0xe9, 0x6a, 0x6e, 0xfc,
+ 0xb3, 0x9f, 0x7a, 0x5f, 0xf4, 0xec, 0x2b, 0x73, 0x5b, 0xf0, 0xb7, 0xda,
+ 0x49, 0x74, 0xff, 0xad, 0x9b, 0x9b, 0xb9, 0xf1, 0x57, 0x2f, 0xbc, 0x9b,
+ 0x1b, 0x3f, 0xf3, 0xfd, 0xcb, 0xd1, 0xcb, 0xdc, 0x73, 0x70, 0x25, 0x37,
+ 0x3e, 0x78, 0xf1, 0x46, 0x6e, 0xfc, 0xe1, 0x4b, 0x37, 0x73, 0xe3, 0x3b,
+ 0xea, 0x69, 0xf4, 0xec, 0xcb, 0xa7, 0x82, 0x97, 0xb9, 0xb1, 0xdc, 0xcd,
+ 0x8d, 0xff, 0xec, 0x8f, 0x4e, 0x47, 0x2f, 0xb3, 0xa7, 0xda, 0x0e, 0x7e,
+ 0x65, 0x6b, 0x2e, 0x00, 0x20, 0x4d, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00,
+ 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0,
+ 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00,
+ 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04,
+ 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00,
+ 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20,
+ 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01,
+ 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40,
+ 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03,
+ 0x00, 0x60, 0x56, 0xaa, 0xfb, 0x97, 0xa7, 0xb9, 0xf5, 0xdd, 0xe5, 0x24,
+ 0xfa, 0xf4, 0x8b, 0x0b, 0x6d, 0x6e, 0xbc, 0x08, 0x6e, 0x77, 0x7e, 0xf9,
+ 0x8f, 0x5e, 0x8a, 0x5e, 0xe6, 0xd4, 0x89, 0xbb, 0x72, 0xe3, 0xd3, 0x1b,
+ 0xe3, 0xdc, 0xf8, 0xa5, 0xdf, 0x3c, 0x91, 0x1b, 0xff, 0xdd, 0xcf, 0x7d,
+ 0x37, 0x7a, 0xf6, 0xbb, 0x56, 0x97, 0x82, 0x2f, 0xc8, 0x2a, 0xf8, 0xe7,
+ 0xc1, 0xf5, 0x73, 0x1b, 0xd1, 0xcb, 0x0c, 0xf6, 0x0f, 0x72, 0xe3, 0xe3,
+ 0xe7, 0xae, 0x05, 0xff, 0x4f, 0xdf, 0xc8, 0x5e, 0xe6, 0xc2, 0x53, 0xfb,
+ 0x72, 0xe3, 0x0f, 0x1c, 0x0c, 0xbe, 0x20, 0x0f, 0x9e, 0xbb, 0x94, 0x1b,
+ 0xef, 0x37, 0x4d, 0xf4, 0xec, 0xcd, 0x1b, 0x57, 0x73, 0xe3, 0x6f, 0x7c,
+ 0xf4, 0x81, 0xdc, 0xf8, 0xf3, 0x7b, 0xf6, 0x44, 0x2f, 0xb3, 0xb9, 0x51,
+ 0xe5, 0xc6, 0xfd, 0xc2, 0x01, 0x00, 0xc4, 0x09, 0x0e, 0x00, 0x40, 0x70,
+ 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00,
+ 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82,
+ 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00,
+ 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04,
+ 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00,
+ 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20,
+ 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01,
+ 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40,
+ 0x70, 0x00, 0x00, 0xcc, 0x4a, 0xf5, 0xc1, 0x53, 0xe7, 0x73, 0xeb, 0x2b,
+ 0xd5, 0x34, 0xfa, 0xf4, 0x45, 0xd1, 0xe6, 0xc6, 0x97, 0x9a, 0xe0, 0xc3,
+ 0x17, 0x75, 0xf6, 0xff, 0x75, 0xd7, 0x6b, 0xc1, 0x87, 0x3f, 0xb3, 0xb4,
+ 0x9c, 0x1b, 0x7f, 0xf5, 0xf2, 0x30, 0x37, 0xfe, 0xe0, 0x77, 0x2f, 0x45,
+ 0xcf, 0xfe, 0xee, 0xf1, 0xd5, 0xe0, 0x7b, 0xf5, 0xee, 0x1d, 0xb9, 0xf1,
+ 0xe3, 0x7f, 0x71, 0x3e, 0x7a, 0x99, 0x1b, 0x9f, 0x7e, 0x30, 0xf8, 0x6a,
+ 0x3f, 0xb5, 0x9e, 0x1b, 0x3f, 0x7c, 0x61, 0x3d, 0x7a, 0x99, 0x95, 0x5d,
+ 0x65, 0x6e, 0x7c, 0x79, 0x63, 0x9c, 0x1b, 0xdf, 0x51, 0x07, 0x3f, 0x64,
+ 0x56, 0x3a, 0xd9, 0xef, 0x8e, 0xdd, 0xc5, 0x28, 0x37, 0xbe, 0xf6, 0xe7,
+ 0xa7, 0x72, 0xe3, 0x5f, 0xfb, 0xe7, 0x1f, 0x89, 0x5e, 0x66, 0xf2, 0x07,
+ 0x2f, 0xe4, 0xc6, 0xfd, 0xc2, 0x01, 0x00, 0xc4, 0x09, 0x0e, 0x00, 0x40,
+ 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03,
+ 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00,
+ 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38,
+ 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00,
+ 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1,
+ 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00,
+ 0x40, 0x70, 0x00, 0x00, 0xcc, 0x4a, 0x75, 0xef, 0xd2, 0x56, 0x6e, 0xbd,
+ 0x69, 0x8b, 0xe8, 0xd3, 0x0f, 0x9b, 0x32, 0xf8, 0xf0, 0x45, 0x9b, 0x1b,
+ 0x1f, 0x14, 0x75, 0x36, 0x24, 0xeb, 0xe0, 0xc3, 0x6f, 0x17, 0xc1, 0xff,
+ 0xd6, 0xbd, 0xc9, 0xf1, 0x63, 0x57, 0x37, 0xa3, 0x67, 0xbf, 0xf6, 0xe1,
+ 0x83, 0xb9, 0xf1, 0x23, 0xff, 0xf3, 0xed, 0xdc, 0xf8, 0xfd, 0x57, 0x6f,
+ 0x47, 0x2f, 0x73, 0xe5, 0x73, 0x2f, 0xe4, 0xc6, 0x5f, 0xfa, 0xd5, 0x07,
+ 0x73, 0xe3, 0xbb, 0x4f, 0x5f, 0x8b, 0x5e, 0xe6, 0x3d, 0xcf, 0xbc, 0x95,
+ 0x1b, 0xef, 0xb7, 0xc1, 0xcf, 0x99, 0xa3, 0x0b, 0x77, 0x82, 0xdf, 0x4c,
+ 0xc9, 0x8f, 0xdf, 0x4e, 0xa7, 0x33, 0x49, 0x7e, 0x37, 0xbd, 0xb1, 0xb2,
+ 0x33, 0x37, 0xfe, 0x81, 0xff, 0xf4, 0x7c, 0xf4, 0x32, 0x9b, 0xfb, 0x83,
+ 0x0f, 0xef, 0x17, 0x0e, 0x00, 0x20, 0x4e, 0x70, 0x00, 0x00, 0x82, 0x03,
+ 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80,
+ 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38,
+ 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00,
+ 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1,
+ 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00,
+ 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82,
+ 0x03, 0x00, 0x60, 0x56, 0xaa, 0x41, 0x55, 0xe7, 0xd6, 0xcb, 0xa2, 0x8d,
+ 0x3e, 0x7d, 0xbf, 0x0e, 0x3e, 0xfc, 0xe5, 0xed, 0x7e, 0x6e, 0x7c, 0xab,
+ 0x29, 0xa3, 0x97, 0xf9, 0xf2, 0x47, 0x1f, 0xca, 0x8d, 0x6f, 0x27, 0x9f,
+ 0xfc, 0x91, 0x2f, 0x9c, 0xca, 0x8d, 0x3f, 0x38, 0xdc, 0x8c, 0x9e, 0x7d,
+ 0xd7, 0x57, 0x5f, 0xcd, 0x8d, 0x1f, 0xb9, 0x11, 0x7c, 0xf8, 0x61, 0x91,
+ 0xfd, 0xdb, 0xa3, 0x6e, 0x8b, 0xdc, 0xf8, 0x9d, 0x2a, 0xf8, 0xe4, 0x3b,
+ 0x27, 0xd3, 0xe8, 0x65, 0x76, 0x36, 0x93, 0xdc, 0xf8, 0xfe, 0xce, 0x28,
+ 0x37, 0x1e, 0xfd, 0xee, 0xe8, 0x64, 0xbf, 0x3a, 0x3a, 0x83, 0x85, 0x26,
+ 0x37, 0xfe, 0xf4, 0xf0, 0x62, 0xf0, 0xad, 0x34, 0x2c, 0xa2, 0x97, 0x79,
+ 0xa9, 0xda, 0x97, 0x1b, 0xf7, 0x0b, 0x07, 0x00, 0x10, 0x27, 0x38, 0x00,
+ 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08,
+ 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00,
+ 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40,
+ 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03,
+ 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80,
+ 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38,
+ 0x00, 0x00, 0xc1, 0x01, 0x00, 0x30, 0x2b, 0xd5, 0xce, 0xfe, 0x38, 0xb7,
+ 0x7e, 0x67, 0xd4, 0x8d, 0x3e, 0xfd, 0x52, 0x55, 0xe7, 0xc6, 0x6f, 0x2d,
+ 0xf5, 0x73, 0xe3, 0x5f, 0x7e, 0xec, 0x44, 0xf4, 0x32, 0xfb, 0xaf, 0x6d,
+ 0xe4, 0xc6, 0x1f, 0x78, 0xfb, 0x46, 0x6e, 0xfc, 0xb5, 0x87, 0xf7, 0xe5,
+ 0xc6, 0xef, 0x7e, 0xfe, 0x7a, 0xf4, 0xec, 0x8f, 0xdd, 0x5a, 0xcf, 0x8d,
+ 0x8f, 0x17, 0x82, 0x7f, 0x1e, 0x5c, 0x6f, 0x7a, 0xd1, 0xcb, 0x7c, 0xe5,
+ 0xe3, 0x8f, 0xe6, 0xc6, 0x0f, 0x0d, 0x83, 0x4f, 0x7e, 0x75, 0xd7, 0x52,
+ 0xf4, 0x32, 0xc7, 0x6f, 0x6c, 0xe6, 0xc6, 0xcb, 0xb6, 0xcd, 0x8d, 0x17,
+ 0x9d, 0xe0, 0x78, 0xb5, 0xd0, 0x46, 0xcf, 0xbe, 0xda, 0x9d, 0x24, 0xbf,
+ 0x98, 0xa6, 0xf3, 0xdb, 0x04, 0x6b, 0xeb, 0xef, 0xe4, 0xc6, 0xfd, 0xc2,
+ 0x01, 0x00, 0xc4, 0x09, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03,
+ 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00,
+ 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0,
+ 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00,
+ 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1,
+ 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00,
+ 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0xcc,
+ 0x4a, 0xb5, 0x58, 0x35, 0xb9, 0xf5, 0x72, 0x61, 0x12, 0x7d, 0xfa, 0x8d,
+ 0x61, 0x37, 0x37, 0xbe, 0xe3, 0xf6, 0x28, 0x78, 0x99, 0xb5, 0xe5, 0xe8,
+ 0x65, 0x1e, 0x7f, 0xf5, 0x9d, 0xdc, 0xf8, 0x89, 0xad, 0x9b, 0xb9, 0xf1,
+ 0xcd, 0x9b, 0x2b, 0xb9, 0xf1, 0x9d, 0x45, 0xf6, 0x05, 0xd9, 0x2d, 0xda,
+ 0xe4, 0x78, 0x1d, 0x3c, 0x7b, 0xdb, 0x44, 0x2f, 0xf3, 0xc0, 0x5f, 0x07,
+ 0x5f, 0x90, 0x6b, 0x1b, 0xdb, 0xb9, 0xf1, 0xbf, 0x7c, 0xe2, 0x70, 0xf6,
+ 0xad, 0xfa, 0xed, 0xeb, 0xb9, 0xf1, 0xd5, 0xe4, 0x0b, 0xb2, 0x69, 0x8b,
+ 0xdc, 0xf8, 0x52, 0x39, 0x8d, 0x9e, 0x7d, 0xb1, 0x0c, 0xbe, 0x9b, 0xda,
+ 0xe4, 0x65, 0xaa, 0x32, 0xfb, 0x56, 0x3d, 0xb0, 0xbc, 0x95, 0x1b, 0xf7,
+ 0x0b, 0x07, 0x00, 0x10, 0x27, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08,
+ 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00,
+ 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40,
+ 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03,
+ 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00,
+ 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38,
+ 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00,
+ 0x30, 0x2b, 0xd5, 0x72, 0x7f, 0x32, 0xbf, 0x4f, 0x3f, 0xaa, 0x83, 0xc1,
+ 0xf4, 0xfd, 0xfe, 0x9e, 0xdc, 0xf8, 0xe3, 0xcf, 0xbd, 0x1e, 0xbd, 0xcc,
+ 0x93, 0x93, 0x2b, 0xb9, 0xf1, 0xdd, 0xfd, 0x71, 0x6e, 0xbc, 0x3e, 0x77,
+ 0x2e, 0x37, 0xbe, 0x5a, 0x8d, 0xa3, 0x67, 0x5f, 0xeb, 0x06, 0xdf, 0x4d,
+ 0xe5, 0x42, 0x9b, 0x1b, 0x5f, 0x9a, 0xd4, 0xd1, 0xcb, 0x7c, 0xfa, 0xca,
+ 0x99, 0xdc, 0xf8, 0x7a, 0xa7, 0x9b, 0x1b, 0xdf, 0xb8, 0xb1, 0x1a, 0xbd,
+ 0xcc, 0xb7, 0xdf, 0x77, 0x5f, 0x6e, 0xfc, 0xa9, 0x53, 0x17, 0x83, 0xef,
+ 0xa6, 0xc9, 0x8d, 0xdc, 0x78, 0x31, 0xcf, 0x7f, 0x6a, 0x57, 0x65, 0x13,
+ 0x7c, 0xab, 0x76, 0xb3, 0x6f, 0xd5, 0xa5, 0xc5, 0xe9, 0x9c, 0x9e, 0x1d,
+ 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00,
+ 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38,
+ 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00,
+ 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1,
+ 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00,
+ 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08,
+ 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x60, 0x96, 0xaa,
+ 0x85, 0x64, 0x72, 0xd4, 0x75, 0x11, 0x7d, 0xfa, 0x3d, 0x3b, 0xb6, 0x73,
+ 0xe3, 0xbf, 0x5e, 0x5e, 0xca, 0x8d, 0x3f, 0x7b, 0x69, 0x25, 0x7a, 0x99,
+ 0xa3, 0xbb, 0xef, 0x24, 0x5f, 0x34, 0x4d, 0x6e, 0xfc, 0x83, 0x83, 0x49,
+ 0xf0, 0x2e, 0x93, 0xec, 0xdb, 0xa9, 0x6e, 0x83, 0x2f, 0xf8, 0xa2, 0x68,
+ 0x73, 0xe3, 0x77, 0x95, 0x75, 0xf8, 0x2f, 0x9b, 0x5e, 0x6e, 0xbc, 0xd7,
+ 0x04, 0x5f, 0x90, 0xbf, 0xf4, 0xca, 0xe9, 0xe8, 0x65, 0x2e, 0x8e, 0x16,
+ 0x73, 0xe3, 0x5f, 0xfb, 0xd5, 0xc7, 0x72, 0xe3, 0x77, 0x7f, 0xf3, 0x64,
+ 0x6e, 0x7c, 0x35, 0xfd, 0x5e, 0x4d, 0x5a, 0xea, 0x06, 0xdf, 0x4d, 0x0b,
+ 0xc9, 0xcf, 0x81, 0xf4, 0xe7, 0x8c, 0x5f, 0x38, 0x00, 0x80, 0x38, 0xc1,
+ 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00,
+ 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82,
+ 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00,
+ 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10,
+ 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00,
+ 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20,
+ 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07,
+ 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00,
+ 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x80, 0x59, 0xa9, 0x96, 0x96, 0x26,
+ 0xb9, 0xf5, 0xba, 0xce, 0x06, 0xcd, 0x74, 0x5a, 0xe4, 0xc6, 0x77, 0x6c,
+ 0x6d, 0xe7, 0xc6, 0x77, 0x1f, 0x59, 0x89, 0x5e, 0x66, 0xb5, 0x1e, 0xe5,
+ 0xc6, 0xfb, 0x8b, 0x75, 0x6e, 0xbc, 0x28, 0xda, 0xe0, 0x0b, 0x26, 0xfc,
+ 0x82, 0xdc, 0x1a, 0x55, 0xb9, 0xf1, 0xe1, 0x38, 0x38, 0x3e, 0x6d, 0xb2,
+ 0x97, 0xe9, 0x97, 0x75, 0x67, 0x3e, 0x6d, 0x2d, 0x64, 0x9f, 0x7c, 0xb5,
+ 0x9b, 0x7c, 0x37, 0xed, 0xe9, 0x07, 0xbf, 0x3c, 0x26, 0xc1, 0x27, 0x9f,
+ 0x2e, 0x14, 0xd9, 0x17, 0x64, 0x77, 0x5e, 0x3f, 0xc4, 0x16, 0x16, 0xda,
+ 0xce, 0xdc, 0xf2, 0x0b, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01,
+ 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00,
+ 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e,
+ 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00,
+ 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70,
+ 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00,
+ 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0,
+ 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00,
+ 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04,
+ 0x07, 0x00, 0x30, 0x37, 0xaa, 0xb2, 0xdb, 0xe4, 0xd6, 0xbb, 0xfd, 0x3a,
+ 0xfa, 0xf4, 0x6d, 0x53, 0xe4, 0xc6, 0x8f, 0x0d, 0xd6, 0x73, 0xe3, 0x87,
+ 0x46, 0xb7, 0xa3, 0x97, 0x99, 0x4c, 0xca, 0xdc, 0x78, 0x5d, 0x17, 0x73,
+ 0xfb, 0x72, 0x6f, 0xa2, 0xfb, 0x8b, 0xdd, 0xe8, 0xfe, 0x34, 0x37, 0x3d,
+ 0x1c, 0x57, 0xd1, 0xcb, 0xf4, 0xca, 0xe0, 0x6b, 0xa6, 0x6e, 0x82, 0x7f,
+ 0x38, 0x75, 0x8b, 0x36, 0x7a, 0x99, 0x69, 0x11, 0x7c, 0xf8, 0x5e, 0x27,
+ 0xf8, 0x39, 0xf0, 0xf5, 0x23, 0x87, 0x73, 0xe3, 0x4f, 0x5e, 0xbd, 0x1a,
+ 0x3d, 0xfb, 0xbd, 0xc5, 0x9d, 0xe4, 0x7c, 0xf4, 0x13, 0x32, 0xfb, 0x82,
+ 0x8c, 0xf2, 0x0b, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00,
+ 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1,
+ 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00,
+ 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82,
+ 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00,
+ 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10,
+ 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00,
+ 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80,
+ 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07,
+ 0x00, 0x30, 0x37, 0xaa, 0xee, 0x62, 0x93, 0x5b, 0x2f, 0x16, 0xda, 0xe8,
+ 0xd3, 0xb7, 0xc9, 0xf9, 0xb6, 0x29, 0x72, 0xe3, 0xe5, 0x62, 0x1d, 0xbd,
+ 0xcc, 0x78, 0x58, 0xe5, 0xc6, 0x9b, 0xe4, 0x65, 0xc6, 0xe3, 0x32, 0x37,
+ 0x3e, 0x9d, 0x66, 0x0b, 0xbb, 0x57, 0x05, 0xff, 0x5b, 0x47, 0xc9, 0xcb,
+ 0x2c, 0x2d, 0x4e, 0xa3, 0x97, 0x99, 0x26, 0x5f, 0x33, 0xd1, 0x4f, 0x99,
+ 0xa2, 0xc9, 0x7e, 0x88, 0x9d, 0xdc, 0xb5, 0x96, 0x1b, 0x1f, 0x7c, 0xf3,
+ 0x74, 0x6e, 0xfc, 0x23, 0x17, 0x2f, 0xe6, 0xc6, 0x4f, 0xf4, 0x6e, 0x67,
+ 0xbf, 0x3b, 0x3a, 0xc9, 0x17, 0x64, 0x9b, 0x7d, 0xcd, 0xcc, 0x2f, 0xbf,
+ 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03,
+ 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80,
+ 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38,
+ 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00,
+ 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1,
+ 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00,
+ 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x73,
+ 0xa3, 0xea, 0x2d, 0x4f, 0x72, 0xeb, 0x45, 0xd1, 0xce, 0xef, 0x69, 0x9a,
+ 0xba, 0xc8, 0x8d, 0x8f, 0x87, 0x55, 0xf4, 0xe1, 0x7b, 0x83, 0x69, 0x6e,
+ 0x7c, 0xfb, 0x4e, 0x37, 0x37, 0xde, 0xef, 0x07, 0x9f, 0x7c, 0x32, 0x29,
+ 0xa3, 0x67, 0x1f, 0x8d, 0xca, 0xb9, 0x7d, 0xbd, 0x17, 0xd1, 0xf5, 0xb6,
+ 0x0d, 0xee, 0x4f, 0x93, 0xe3, 0x1b, 0x9d, 0x6e, 0xf4, 0x32, 0xe7, 0x1f,
+ 0xda, 0x13, 0x1c, 0x1f, 0x2c, 0xe5, 0xc6, 0x7f, 0xed, 0xe6, 0x85, 0xe0,
+ 0x37, 0x53, 0xf8, 0xbb, 0x63, 0x52, 0x07, 0xff, 0xd8, 0xae, 0xca, 0x69,
+ 0x87, 0x1f, 0xc7, 0x2f, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00,
+ 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38,
+ 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00,
+ 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1,
+ 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00,
+ 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82,
+ 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00,
+ 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10,
+ 0x1c, 0x00, 0xc0, 0xdc, 0xa8, 0x8a, 0x22, 0xba, 0x5f, 0xcc, 0xef, 0x69,
+ 0x8a, 0x64, 0x8c, 0xf5, 0x06, 0xd3, 0xe8, 0xc3, 0x6f, 0xdf, 0xe9, 0xe6,
+ 0xc6, 0x17, 0xfb, 0x75, 0x6e, 0x7c, 0x32, 0x0a, 0xde, 0xbd, 0xdb, 0xad,
+ 0xa3, 0x67, 0xaf, 0xeb, 0xf9, 0x7d, 0xc1, 0xb7, 0xd1, 0xf5, 0xab, 0xe3,
+ 0x7e, 0x6e, 0xfc, 0xdd, 0x49, 0xf0, 0xd5, 0x7e, 0xae, 0x5c, 0x8a, 0x5e,
+ 0x66, 0xdf, 0xeb, 0xb7, 0x72, 0xe3, 0xef, 0xbf, 0x73, 0x31, 0x37, 0xbe,
+ 0xd2, 0x04, 0x3f, 0xc4, 0x8a, 0x2a, 0xfb, 0x82, 0x1c, 0x4d, 0xcb, 0xe0,
+ 0xe7, 0x4c, 0xd9, 0x24, 0xbf, 0x53, 0x9b, 0xce, 0xdc, 0xf2, 0x0b, 0x07,
+ 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00, 0x00,
+ 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e,
+ 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00,
+ 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70,
+ 0x00, 0x00, 0x82, 0x03, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00,
+ 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0,
+ 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00,
+ 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04,
+ 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x30, 0x37, 0x2a,
+ 0x27, 0xf8, 0x3f, 0x29, 0x8a, 0xe8, 0x7a, 0x1b, 0x7d, 0xf8, 0xb2, 0xdb,
+ 0xcc, 0xe9, 0x2c, 0x96, 0xde, 0xcd, 0x00, 0x00, 0x01, 0x91, 0x49, 0x44,
+ 0x41, 0x54, 0xd9, 0xdb, 0xb6, 0x9c, 0xdf, 0xd7, 0x4c, 0xaf, 0x57, 0x07,
+ 0x5f, 0x32, 0x9d, 0xe0, 0x6b, 0xe6, 0xd6, 0x56, 0x2f, 0x7a, 0x99, 0xf3,
+ 0xa3, 0xa5, 0xdc, 0xf8, 0xb3, 0x83, 0xb5, 0xdc, 0xf8, 0xa5, 0x13, 0xfb,
+ 0xa3, 0x97, 0x39, 0x7b, 0x78, 0x67, 0x6e, 0x7c, 0xf9, 0xcf, 0xde, 0xcc,
+ 0x8d, 0x0f, 0x87, 0xc1, 0xbf, 0x57, 0xb7, 0x9b, 0xec, 0xe7, 0x40, 0xb7,
+ 0x09, 0x7e, 0x42, 0x6e, 0x8d, 0x83, 0x5f, 0xac, 0xcb, 0xbd, 0x49, 0xfa,
+ 0xab, 0x2f, 0x37, 0xed, 0x17, 0x0e, 0x00, 0x20, 0x4e, 0x70, 0x00, 0x00,
+ 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c,
+ 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00,
+ 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0,
+ 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00,
+ 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1,
+ 0x01, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00,
+ 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08,
+ 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00,
+ 0x00, 0x82, 0x03, 0x00, 0x60, 0x56, 0xaa, 0xb6, 0x0d, 0xae, 0x17, 0x85,
+ 0x0b, 0xff, 0x78, 0x6d, 0x9b, 0x3d, 0x4d, 0xb5, 0x58, 0xe7, 0xc6, 0xeb,
+ 0x49, 0xb0, 0x53, 0x17, 0xfb, 0xd3, 0xdc, 0xf8, 0x64, 0x54, 0x85, 0xff,
+ 0x5b, 0x83, 0xe3, 0x2f, 0x6e, 0xac, 0xe6, 0xc6, 0x5f, 0xee, 0xad, 0x46,
+ 0x2f, 0xf3, 0x6e, 0xb7, 0x9b, 0x1b, 0x7f, 0xf6, 0x9f, 0xfe, 0x4c, 0x6e,
+ 0xfc, 0x37, 0xff, 0xd5, 0xd7, 0xa3, 0x97, 0x19, 0x3e, 0x1f, 0x1c, 0xff,
+ 0xd6, 0x93, 0x27, 0x72, 0xe3, 0xd7, 0xbe, 0xb7, 0x11, 0x7c, 0x2b, 0x4d,
+ 0xa3, 0x57, 0xef, 0xdc, 0x99, 0x96, 0xb9, 0xf1, 0xe5, 0xb5, 0xe0, 0xc7,
+ 0xfb, 0x78, 0x38, 0x8c, 0x5e, 0x66, 0xc7, 0xd2, 0x24, 0x37, 0xee, 0x17,
+ 0x0e, 0x00, 0x20, 0x4e, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c,
+ 0x00, 0x00, 0x82, 0x03, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00,
+ 0x10, 0x1c, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x10, 0x1c, 0x00, 0x80, 0xe0,
+ 0x00, 0x00, 0x04, 0x07, 0x00, 0x80, 0xe0, 0x00, 0x00, 0x04, 0x07, 0x00,
+ 0x20, 0x38, 0x00, 0x00, 0x04, 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0x04,
+ 0x07, 0x00, 0x20, 0x38, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x20, 0x38, 0x00,
+ 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08,
+ 0x0e, 0x00, 0x00, 0xc1, 0x01, 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00,
+ 0x00, 0x08, 0x0e, 0x00, 0x40, 0x70, 0x00, 0x00, 0x82, 0x03, 0x00, 0x60,
+ 0x56, 0xfe, 0x37, 0x78, 0x5d, 0xa8, 0x59, 0xa3, 0x1a, 0x66, 0x14, 0x00,
+ 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+
+static const unsigned int sEncodedBufferImageDataPNGLength = sizeof( sEncodedBufferImageDataPNG );
+
+} // anonymous namespace
+
+
+
+// Positive test case for constructors:
+int UtcDaliEncodedBufferImageNew01(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliEncodedBufferImageNew01() - EncodedBufferImage::New( const uint8_t * const encodedImage, const std::size_t encodedImageByteCount, const ImageAttributes& attributes, const ReleasePolicy releasePol )");
+
+ // Invoke default handle constructor for the Image base class:
+ Image image;
+
+ DALI_TEST_CHECK( !image );
+
+ // Trigger image decode to initialise the handle
+ Dali::ImageAttributes imageAttributes;
+ imageAttributes.SetSize( 720, 1280 );
+ imageAttributes.SetScalingMode( Dali::ImageAttributes::FitHeight );
+ image = EncodedBufferImage::New( sEncodedBufferImageDataPNG, sEncodedBufferImageDataPNGLength, imageAttributes, Image::Never );
+
+ DALI_TEST_CHECK( image );
+
+ // Change the release policy to Unused:
+ Image image2;
+
+ DALI_TEST_CHECK( !image2 );
+
+ // Trigger image decode to initialise the handle
+ image2 = EncodedBufferImage::New( sEncodedBufferImageDataPNG, sEncodedBufferImageDataPNGLength, imageAttributes, Image::Unused );
+
+ DALI_TEST_CHECK( image2 );
+ END_TEST;
+}
+
+// Negative test case for constructor - null pointer:
+int UtcDaliEncodedBufferImageNew02(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliEncodedBufferImageNew02() - EncodedBufferImage::New( const uint8_t * const encodedImage, const std::size_t encodedImageByteCount, const ImageAttributes& attributes, const ReleasePolicy releasePol )");
+
+ // Invoke default handle constructor for the Image base class:
+ Image image;
+
+ DALI_TEST_CHECK( !image );
+
+ // Trigger image decode to initialise the handle
+ Dali::ImageAttributes imageAttributes;
+ imageAttributes.SetSize( 720, 1280 );
+ imageAttributes.SetScalingMode( Dali::ImageAttributes::FitHeight );
+ try
+ {
+ // This should throw on the null pointer:
+ image = EncodedBufferImage::New( 0, sEncodedBufferImageDataPNGLength, imageAttributes, Image::Never );
+ tet_result( TET_FAIL );
+ }
+ catch (Dali::DaliException& e)
+ {
+ // Tests that a negative test of an assertion succeeds
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT_CONDITION_STARTS_WITH_SUBSTRING(e, "encodedImage && \"Null image pointer passed-in for decoding from memory.\"", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+// Negative test case for constructor - zero-length input buffer:
+int UtcDaliEncodedBufferImageNew03(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliEncodedBufferImageNew03() - EncodedBufferImage::New( const uint8_t * const encodedImage, const std::size_t encodedImageByteCount, const ImageAttributes& attributes, const ReleasePolicy releasePol )");
+
+ // Invoke default handle constructor for the Image base class:
+ Image image;
+
+ DALI_TEST_CHECK( !image );
+
+ // Trigger image decode to initialise the handle
+ Dali::ImageAttributes imageAttributes;
+ try
+ {
+ // This should throw on the zero size:
+ image = EncodedBufferImage::New( sEncodedBufferImageDataPNG, /** Trigger the assertion.*/ 0, imageAttributes, Image::Never );
+ tet_result( TET_FAIL );
+ }
+ catch (Dali::DaliException& e)
+ {
+ // Tests that a negative test of an assertion succeeds
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT_CONDITION_STARTS_WITH_SUBSTRING(e, "encodedImageByteCount > 0U && \"Zero size passed for image resource in memory buffer.\"", TEST_LOCATION);
+ }
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali/integration-api/events/touch-event-integ.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+namespace
+{
+
+/**
+ * The functor to be used in the hit-test algorithm to check whether the actor is hittable.
+ */
+bool IsActorHittableFunction(Actor actor, Dali::HitTestAlgorithm::TraverseType type)
+{
+ bool hittable = false;
+
+ switch (type)
+ {
+ case Dali::HitTestAlgorithm::CHECK_ACTOR:
+ {
+ // Check whether the actor is visible and not fully transparent.
+ if( actor.IsVisible()
+ && actor.GetCurrentWorldColor().a > 0.01f) // not FULLY_TRANSPARENT
+ {
+ // Check whether the actor has the specific name "HittableActor"
+ if(actor.GetName() == "HittableActor")
+ {
+ hittable = true;
+ }
+ }
+ break;
+ }
+ case Dali::HitTestAlgorithm::DESCEND_ACTOR_TREE:
+ {
+ if( actor.IsVisible() ) // Actor is visible, if not visible then none of its children are visible.
+ {
+ hittable = true;
+ }
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ return hittable;
+};
+
+
+bool DefaultIsActorTouchableFunction(Dali::Actor actor, Dali::HitTestAlgorithm::TraverseType type)
+{
+ bool hittable = false;
+
+ switch (type)
+ {
+ case Dali::HitTestAlgorithm::CHECK_ACTOR:
+ {
+ if( actor.IsVisible() &&
+ actor.IsSensitive() &&
+ actor.GetCurrentWorldColor().a > 0.01f)
+ {
+ hittable = true;
+ }
+ break;
+ }
+ case Dali::HitTestAlgorithm::DESCEND_ACTOR_TREE:
+ {
+ if( actor.IsVisible() && // Actor is visible, if not visible then none of its children are visible.
+ actor.IsSensitive()) // Actor is sensitive, if insensitive none of its children should be hittable either.
+ {
+ hittable = true;
+ }
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ return hittable;
+};
+
+} // anonymous namespace
+
+
+// Positive test case for a method
+int UtcDaliHitTestAlgorithmWithFunctor(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::HitTestAlgorithm functor");
+
+ Stage stage = Stage::GetCurrent();
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ actor.SetName("NonHittableActor");
+ stage.Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ Vector2 screenCoordinates( 10.0f, 10.0f );
+ Vector2 localCoordinates;
+ actor.ScreenToLocal( localCoordinates.x, localCoordinates.y, screenCoordinates.x, screenCoordinates.y );
+
+ // Perform a hit-test at the given screen coordinates
+ Dali::HitTestAlgorithm::Results results;
+ Dali::HitTestAlgorithm::HitTest( stage, screenCoordinates, results, IsActorHittableFunction );
+ DALI_TEST_CHECK( results.actor != actor );
+
+ actor.SetName("HittableActor");
+
+ results.actor = Actor();
+ results.actorCoordinates = Vector2::ZERO;
+
+ // Perform a hit-test at the given screen coordinates
+ Dali::HitTestAlgorithm::HitTest( stage, screenCoordinates, results, IsActorHittableFunction );
+ DALI_TEST_CHECK( results.actor == actor );
+ DALI_TEST_EQUALS( localCoordinates, results.actorCoordinates, 0.1f, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliHitTestAlgorithmWithFunctorOnRenderTask(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::HitTestAlgorithm functor, specific to a given render task");
+
+ Stage stage = Stage::GetCurrent();
+ Size stageSize = stage.GetSize();
+ RenderTaskList taskList = stage.GetRenderTaskList();
+
+ Actor actor[2];
+
+ for( int i=0; i<2; i++ )
+ {
+ actor[i] = Actor::New();
+ actor[i].SetSize(100.f, 100.f);
+ actor[i].SetParentOrigin(ParentOrigin::TOP_LEFT);
+ actor[i].SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ actor[i].SetName("HittableActor");
+ stage.Add(actor[i]);
+ }
+ Vector2 position( 50.f, 40.f );
+ actor[1].SetPosition( position.x, position.y );
+
+ RenderTask renderTask[2];
+ renderTask[0] = taskList.GetTask( 0u );
+
+ FrameBufferImage frameBufferImage = FrameBufferImage::New(stageSize.width, stageSize.height, Pixel::A8, Image::Never);
+ renderTask[1] = taskList.CreateTask();
+ renderTask[1].SetSourceActor( actor[1] );
+ renderTask[1].SetExclusive( true );
+ renderTask[1].SetInputEnabled( true );
+ renderTask[1].SetTargetFrameBuffer( frameBufferImage );
+ renderTask[1].SetRefreshRate( RenderTask::REFRESH_ONCE );
+ renderTask[1].SetScreenToFrameBufferFunction( RenderTask::FULLSCREEN_FRAMEBUFFER_FUNCTION );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ // Perform a hit-test at the given screen coordinates with different render tasks
+
+ Dali::HitTestAlgorithm::Results results;
+ Vector2 screenCoordinates( 25.f, 25.f );
+
+ Dali::HitTestAlgorithm::HitTest( renderTask[0], screenCoordinates, results, IsActorHittableFunction );
+ DALI_TEST_CHECK( results.actor == actor[0] );
+ DALI_TEST_EQUALS( screenCoordinates, results.actorCoordinates, 0.1f, TEST_LOCATION );
+
+ results.actor = Actor();
+ results.actorCoordinates = Vector2::ZERO;
+ Dali::HitTestAlgorithm::HitTest( renderTask[1], screenCoordinates, results, IsActorHittableFunction );
+ DALI_TEST_CHECK( !results.actor );
+ DALI_TEST_EQUALS( Vector2::ZERO, results.actorCoordinates, 0.1f, TEST_LOCATION );
+
+ screenCoordinates.x = 80.f;
+ screenCoordinates.y = 70.f;
+
+ results.actor = Actor();
+ results.actorCoordinates = Vector2::ZERO;
+ Dali::HitTestAlgorithm::HitTest( renderTask[0], screenCoordinates, results, IsActorHittableFunction );
+ DALI_TEST_CHECK( results.actor == actor[0] );
+ DALI_TEST_EQUALS( screenCoordinates, results.actorCoordinates, 0.1f, TEST_LOCATION );
+
+ results.actor = Actor();
+ results.actorCoordinates = Vector2::ZERO;
+ Dali::HitTestAlgorithm::HitTest( renderTask[1], screenCoordinates, results, IsActorHittableFunction );
+ DALI_TEST_CHECK( results.actor == actor[1]);
+ DALI_TEST_EQUALS( screenCoordinates - position, results.actorCoordinates, 0.1f, TEST_LOCATION );
+
+
+ screenCoordinates.x = 120.f;
+ screenCoordinates.y = 130.f;
+
+ results.actor = Actor();
+ results.actorCoordinates = Vector2::ZERO;
+ Dali::HitTestAlgorithm::HitTest( renderTask[0], screenCoordinates, results, IsActorHittableFunction );
+ DALI_TEST_CHECK( results.actor == actor[1] );
+ DALI_TEST_EQUALS( screenCoordinates - position, results.actorCoordinates, 0.1f, TEST_LOCATION );
+
+ results.actor = Actor();
+ results.actorCoordinates = Vector2::ZERO;
+ Dali::HitTestAlgorithm::HitTest( renderTask[1], screenCoordinates, results, IsActorHittableFunction );
+ DALI_TEST_CHECK( results.actor == actor[1]);
+ DALI_TEST_EQUALS( screenCoordinates - position, results.actorCoordinates, 0.1f, TEST_LOCATION );
+ END_TEST;
+}
+
+
+int UtcDaliHitTestAlgorithmOrtho01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::HitTestAlgorithm with parallel Ortho camera()");
+
+ Stage stage = Stage::GetCurrent();
+ RenderTaskList renderTaskList = stage.GetRenderTaskList();
+ RenderTask defaultRenderTask = renderTaskList.GetTask(0u);
+ Dali::CameraActor cameraActor = defaultRenderTask.GetCameraActor();
+
+ Vector2 stageSize ( stage.GetSize() );
+ cameraActor.SetOrthographicProjection( stageSize );
+ cameraActor.SetPosition(0.0f, 0.0f, 1600.0f);
+
+ Vector2 actorSize( stageSize * 0.5f );
+ // Create two actors with half the size of the stage and set them to be partially overlapping
+ Actor blue = Actor::New();
+ blue.SetName( "Blue" );
+ blue.SetAnchorPoint( AnchorPoint::CENTER );
+ blue.SetParentOrigin( Vector3(1.0f/3.0f, 1.0f/3.0f, 0.5f) );
+ blue.SetSize( actorSize );
+ blue.SetZ(30.0f);
+
+ Actor green = Actor::New( );
+ green.SetName( "Green" );
+ green.SetAnchorPoint( AnchorPoint::CENTER );
+ green.SetParentOrigin( Vector3(2.0f/3.0f, 2.0f/3.0f, 0.5f) );
+ green.SetSize( actorSize );
+
+ // Add the actors to the view
+ stage.Add( blue );
+ stage.Add( green );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render(0);
+ application.Render(10);
+
+ HitTestAlgorithm::Results results;
+ HitTest(stage, Vector2( 240.0f, 400.0f ), results, &DefaultIsActorTouchableFunction);
+ DALI_TEST_CHECK( results.actor == blue );
+ DALI_TEST_EQUALS( results.actorCoordinates, actorSize * 5.0f/6.0f, TEST_LOCATION );
+
+ HitTest(stage, stageSize / 3.0f, results, &DefaultIsActorTouchableFunction);
+ DALI_TEST_CHECK( results.actor == blue );
+ DALI_TEST_EQUALS( results.actorCoordinates, actorSize * 0.5f, TEST_LOCATION );
+
+ HitTest(stage, stageSize * 2.0f / 3.0f, results, &DefaultIsActorTouchableFunction);
+ DALI_TEST_CHECK( results.actor == green );
+ DALI_TEST_EQUALS( results.actorCoordinates, actorSize * 0.5f, TEST_LOCATION );
+ END_TEST;
+}
+
+
+int UtcDaliHitTestAlgorithmOrtho02(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::HitTestAlgorithm with offset Ortho camera()");
+
+ Stage stage = Stage::GetCurrent();
+ RenderTaskList renderTaskList = stage.GetRenderTaskList();
+ RenderTask defaultRenderTask = renderTaskList.GetTask(0u);
+ Dali::CameraActor cameraActor = defaultRenderTask.GetCameraActor();
+
+ Vector2 stageSize ( stage.GetSize() );
+ cameraActor.SetOrthographicProjection(-stageSize.x * 0.3f, stageSize.x * 0.7f,
+ stageSize.y * 0.3f, -stageSize.y * 0.7f,
+ 800.0f, 4895.0f);
+ cameraActor.SetPosition(0.0f, 0.0f, 1600.0f);
+
+ Vector2 actorSize( stageSize * 0.5f );
+ // Create two actors with half the size of the stage and set them to be partially overlapping
+ Actor blue = Actor::New();
+ blue.SetName( "Blue" );
+ blue.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+ blue.SetParentOrigin( Vector3(0.2f, 0.2f, 0.5f) );
+ blue.SetSize( actorSize );
+ blue.SetZ(30.0f);
+
+ Actor green = Actor::New( );
+ green.SetName( "Green" );
+ green.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+ green.SetParentOrigin( Vector3(0.4f, 0.4f, 0.5f) );
+ green.SetSize( actorSize );
+
+ // Add the actors to the view
+ stage.Add( blue );
+ stage.Add( green );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render(0);
+ application.Render(10);
+
+ HitTestAlgorithm::Results results;
+ HitTest(stage, Vector2( 240.0f, 400.0f ), results, &DefaultIsActorTouchableFunction);
+ DALI_TEST_CHECK( results.actor == green );
+ DALI_TEST_EQUALS( results.actorCoordinates, actorSize * 0.6f, TEST_LOCATION );
+
+ HitTest(stage, Vector2::ZERO, results, &DefaultIsActorTouchableFunction);
+ DALI_TEST_CHECK( results.actor == blue );
+ DALI_TEST_EQUALS( results.actorCoordinates, Vector2::ZERO, TEST_LOCATION );
+
+ HitTest(stage, stageSize, results, &DefaultIsActorTouchableFunction);
+ DALI_TEST_CHECK( ! results.actor );
+ DALI_TEST_EQUALS( results.actorCoordinates, Vector2::ZERO, TEST_LOCATION );
+
+ // Just inside green
+ HitTest(stage, stageSize*0.69f, results, &DefaultIsActorTouchableFunction);
+ DALI_TEST_CHECK( results.actor == green );
+ DALI_TEST_EQUALS( results.actorCoordinates, actorSize * 0.98f, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliHitTestAlgorithmStencil(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::HitTestAlgorithm with a stencil");
+
+ Stage stage = Stage::GetCurrent();
+ Actor rootLayer = stage.GetRootLayer();
+ rootLayer.SetName( "RootLayer" );
+
+ // Create a layer
+ Layer layer = Layer::New();
+ layer.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+ layer.SetParentOrigin( ParentOrigin::TOP_LEFT );
+ layer.SetName( "layer" );
+ stage.Add( layer );
+
+ // Create a stencil and add that to the layer
+ Actor stencil = ImageActor::New(Dali::BitmapImage::WHITE() );
+ stencil.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+ stencil.SetParentOrigin( ParentOrigin::TOP_LEFT );
+ stencil.SetSize( 50.0f, 50.0f );
+ stencil.SetDrawMode( DrawMode::STENCIL );
+ stencil.SetName( "stencil" );
+ layer.Add( stencil );
+
+ // Create an actor and add that to the layer
+ Actor layerHitActor = Actor::New();
+ layerHitActor.SetSize( 100.0f, 100.0f );
+ layerHitActor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+ layerHitActor.SetParentOrigin( ParentOrigin::TOP_LEFT );
+ layerHitActor.SetName( "layerHitActor" );
+ layer.Add( layerHitActor );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Hit within stencil and actor
+ {
+ HitTestAlgorithm::Results results;
+ HitTest(stage, Vector2( 10.0f, 10.0f ), results, &DefaultIsActorTouchableFunction);
+ DALI_TEST_CHECK( results.actor == layerHitActor );
+ tet_printf( "Hit: %s\n", ( results.actor ? results.actor.GetName().c_str() : "NULL" ) );
+ }
+
+ // Hit within actor but outside of stencil, should hit the root-layer
+ {
+ HitTestAlgorithm::Results results;
+ HitTest(stage, Vector2( 60.0f, 60.0f ), results, &DefaultIsActorTouchableFunction);
+ DALI_TEST_CHECK( results.actor == rootLayer );
+ tet_printf( "Hit: %s\n", ( results.actor ? results.actor.GetName().c_str() : "NULL" ) );
+ }
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+#include "mesh-builder.h"
+
+
+int UtcDaliLightActorConstructorVoid(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::LightActor::LightActor() UtcDaliLightActorConstructorVoid");
+
+ LightActor actor;
+
+ DALI_TEST_CHECK(!actor);
+ END_TEST;
+}
+
+
+int UtcDaliLightActorDestructor(void)
+{
+ // This test is achieve 100% line and function coverage
+ TestApplication application;
+ tet_infoline("Testing Dali::LightActor::~LightActor() UtcDaliLightActorDestructor");
+
+ LightActor* actor = new LightActor;
+
+ DALI_TEST_CHECK( ! *actor );
+
+ delete actor;
+
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
+
+int UtcDaliLightActorNew(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::LightActor::New() UtcDaliLightActorNew");
+
+ LightActor actor = LightActor::New();
+
+ DALI_TEST_CHECK(actor);
+ END_TEST;
+}
+
+int UtcDaliLightActorDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::LightActor::DownCast() UtcDaliLightActorDownCast");
+
+ LightActor actor1 = LightActor::New();
+ Actor anActor = Actor::New();
+ anActor.Add(actor1);
+
+ Actor child = anActor.GetChildAt(0);
+ LightActor lightActor = LightActor::DownCast(child);
+
+ DALI_TEST_CHECK(lightActor);
+
+ Light light;
+ light = Light::New( "TestLight" );
+ BaseHandle handle = light;
+
+ DALI_TEST_CHECK( Light::DownCast( handle ) );
+ END_TEST;
+}
+
+int UtcDaliLightActorDownCast2(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::LightActor::DownCast2() UtcDaliLightActorDownCast2");
+
+ Actor actor1 = Actor::New();
+ Actor anActor = Actor::New();
+ anActor.Add(actor1);
+
+ Actor child = anActor.GetChildAt(0);
+ LightActor lightActor = LightActor::DownCast(child);
+ DALI_TEST_CHECK(!lightActor);
+
+ Actor unInitialzedActor;
+ lightActor = DownCast< LightActor >( unInitialzedActor );
+ DALI_TEST_CHECK(!lightActor);
+ END_TEST;
+}
+
+int UtcDaliLightActorSetGetLight(void)
+{
+ TestApplication application;
+ tet_infoline( "Testing UtcDaliLightActorSetGetLight" );
+
+ try
+ {
+ LightActor lightActor = LightActor::New();
+ Light light1 = Light::New( "" );
+ light1.SetName( "TestLight" );
+ light1.SetDirection( Vector3::ZAXIS );
+ light1.SetSpotAngle( Vector2::YAXIS );
+ lightActor.SetLight( light1 );
+
+ Light light2 = lightActor.GetLight();
+
+ DALI_TEST_EQUALS( light1.GetName(), light2.GetName(), TEST_LOCATION );
+ DALI_TEST_EQUALS( light1.GetType(), light2.GetType(), TEST_LOCATION );
+ DALI_TEST_EQUALS( light1.GetFallOff(), light2.GetFallOff(), TEST_LOCATION );
+ DALI_TEST_EQUALS( light1.GetSpotAngle(), light2.GetSpotAngle(), TEST_LOCATION );
+ DALI_TEST_EQUALS( light1.GetAmbientColor(), light2.GetAmbientColor(), TEST_LOCATION );
+ DALI_TEST_EQUALS( light1.GetDiffuseColor(), light2.GetDiffuseColor(), TEST_LOCATION );
+ DALI_TEST_EQUALS( light1.GetSpecularColor(), light2.GetSpecularColor(), TEST_LOCATION );
+ DALI_TEST_EQUALS( light1.GetDirection(), light2.GetDirection(), TEST_LOCATION );
+ }
+ catch( Dali::DaliException& e )
+ {
+ tet_printf( "Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str() );
+ tet_result(TET_FAIL);
+ }
+ catch( ... )
+ {
+ tet_infoline( "Unknown exception." );
+ tet_result(TET_FAIL);
+ }
+ END_TEST;
+}
+
+int UtcDaliLightActorSetGetActive(void)
+{
+ TestApplication application;
+ tet_infoline( "Testing UtcDaliLightActorSetGetActive" );
+
+ try
+ {
+ LightActor lightActor = LightActor::New();
+ lightActor.SetActive( true );
+
+ DALI_TEST_CHECK( lightActor.GetActive() );
+
+ lightActor.SetActive( false );
+
+ DALI_TEST_CHECK( !lightActor.GetActive() );
+
+ lightActor.SetActive( true );
+
+ DALI_TEST_CHECK( lightActor.GetActive() );
+
+ lightActor.SetActive( false );
+
+ DALI_TEST_CHECK( !lightActor.GetActive() );
+ }
+ catch( Dali::DaliException& e )
+ {
+ tet_printf( "Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str() );
+ tet_result(TET_FAIL);
+ }
+ catch( ... )
+ {
+ tet_infoline( "Unknown exception." );
+ tet_result(TET_FAIL);
+ }
+ END_TEST;
+}
+
+
+int UtcDaliLightActorMeshTest(void)
+{
+ TestApplication application;
+ tet_infoline( "Testing UtcDaliLightActorMeshTest" );
+
+ try
+ {
+ Mesh mesh = ConstructMesh( 50 );
+ Actor actor = MeshActor::New( mesh );
+ Stage::GetCurrent().Add( actor );
+
+ actor.SetParentOrigin( ParentOrigin::CENTER );
+ actor.SetAnchorPoint( AnchorPoint::CENTER );
+ actor.SetPosition( 0.0f, 0.0f, 0.0f );
+
+ Light light = Light::New("Light");
+ light.SetType( POINT );
+ light.SetAmbientColor( Vector3( 0.22f, 0.33f, 0.44f ) );
+ light.SetDiffuseColor( Vector3( 0.55f, 0.66f, 0.77f) );
+ light.SetSpecularColor( Vector3( 0.88f, 0.99f, 0.11f) );
+ LightActor lightActor = LightActor::New();
+ lightActor.SetParentOrigin( ParentOrigin::CENTER );
+ lightActor.SetPosition( 0.f, 0.f, 100.0f );
+ lightActor.SetLight( light );
+ lightActor.SetName( light.GetName() );
+
+ Stage::GetCurrent().Add( lightActor );
+ lightActor.SetActive( true );
+
+ application.SendNotification();
+ application.Render();
+
+ // Test Ligh ambient.
+ DALI_TEST_CHECK( application.GetGlAbstraction().CheckUniformValue( "uLight0.mAmbient", Vector3( 0.22f, 0.33f, 0.44f ) ) );
+
+ // Test Ligh diffuse.
+ DALI_TEST_CHECK( application.GetGlAbstraction().CheckUniformValue( "uLight0.mDiffuse", Vector3( 0.55f, 0.66f, 0.77f ) ) );
+
+ // Test Ligh specular.
+ DALI_TEST_CHECK( application.GetGlAbstraction().CheckUniformValue( "uLight0.mSpecular", Vector3( 0.88f, 0.99f, 0.11f ) ) );
+
+ // Test Opacity.
+ DALI_TEST_CHECK( application.GetGlAbstraction().CheckUniformValue( "uMaterial.mOpacity", 0.76f ) );
+
+ // Test material Ambient color.
+ DALI_TEST_CHECK( application.GetGlAbstraction().CheckUniformValue( "uMaterial.mAmbient", Vector4(0.2f, 1.0f, 0.6f, 1.0f) ) );
+
+ // Test material Diffuse color.
+ DALI_TEST_CHECK( application.GetGlAbstraction().CheckUniformValue( "uMaterial.mDiffuse", Vector4(0.8f, 0.0f, 0.4f, 1.0f) ) );
+
+ // Test Specular color.
+ DALI_TEST_CHECK( application.GetGlAbstraction().CheckUniformValue( "uMaterial.mSpecular", Vector4(0.5f, 0.6f, 0.7f, 1.0f) ) );
+ }
+ catch( Dali::DaliException& e )
+ {
+ tet_printf( "Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str() );
+ tet_result(TET_FAIL);
+ }
+ catch( ... )
+ {
+ tet_infoline( "Unknown exception." );
+ tet_result(TET_FAIL);
+ }
+
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
+
+int UtcDaliLightActorDefaultProperties(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::LightActor DefaultProperties");
+
+ LightActor actor = LightActor::New();
+
+ std::vector<Property::Index> indices ;
+ indices.push_back(LightActor::LIGHT_TYPE );
+ indices.push_back(LightActor::ENABLE );
+ indices.push_back(LightActor::FALL_OFF );
+ indices.push_back(LightActor::SPOT_ANGLE );
+ indices.push_back(LightActor::AMBIENT_COLOR );
+ indices.push_back(LightActor::DIFFUSE_COLOR );
+ indices.push_back(LightActor::SPECULAR_COLOR );
+ indices.push_back(LightActor::DIRECTION );
+
+ DALI_TEST_CHECK(actor.GetPropertyCount() == ( Actor::New().GetPropertyCount() + indices.size() ) );
+
+ for(std::vector<Property::Index>::iterator iter = indices.begin(); iter != indices.end(); ++iter)
+ {
+ DALI_TEST_CHECK( *iter == actor.GetPropertyIndex(actor.GetPropertyName(*iter)) );
+ DALI_TEST_CHECK( actor.IsPropertyWritable(*iter) );
+ DALI_TEST_CHECK( !actor.IsPropertyAnimatable(*iter) );
+ DALI_TEST_CHECK( actor.GetPropertyType(*iter) == actor.GetPropertyType(*iter) ); // just checking call succeeds
+ }
+
+ // set/get one of them
+ actor.GetLight().SetAmbientColor( Vector3( 0.f, 0.f, 0.f ) );
+ Vector3 col( 0.22f, 0.33f, 0.44f ) ;
+ DALI_TEST_CHECK(actor.GetLight().GetAmbientColor() != col);
+ actor.SetProperty(LightActor::AMBIENT_COLOR, col);
+ Property::Value v = actor.GetProperty(LightActor::AMBIENT_COLOR);
+ DALI_TEST_CHECK(v.GetType() == Property::VECTOR3);
+
+ DALI_TEST_CHECK(v.Get<Vector3>() == col);
+
+ END_TEST;
+}
+
+int UtcDaliLightActorPropertyIndices(void)
+{
+ TestApplication application;
+ Actor basicActor = Actor::New();
+ LightActor light = LightActor::New();
+
+ Property::IndexContainer indices;
+ light.GetPropertyIndices( indices );
+ DALI_TEST_CHECK( indices.size() > basicActor.GetPropertyCount() );
+ DALI_TEST_EQUALS( indices.size(), light.GetPropertyCount(), TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/public-api/dali-core.h>
+#include <dali/integration-api/lockless-buffer.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+namespace
+{
+
+static bool ReadTest(Integration::LocklessBuffer& buf, const unsigned char exp[], size_t size)
+{
+ const unsigned char *res = buf.Read();
+ for (size_t i=0; i<size; ++i, ++res)
+ {
+ if(*res != exp[i])
+ {
+ tet_printf("FAIL: expected 0x%X result 0x%X\n", (int)exp[i], (int)*res);
+ return false;
+ }
+ }
+ return true;
+}
+} // anonymous namespace
+
+
+// Simple write - read test
+int UtcDaliLocklessBufferWriteRead01(void)
+{
+ Integration::LocklessBuffer buf(10);
+ unsigned char data[10];
+
+ for( unsigned char i=0; i<10; ++i )
+ {
+ data[i]=i;
+ }
+
+ buf.Write( &data[0], 10 );
+
+ if( ReadTest( buf, data, 10 ) )
+ {
+ tet_result(TET_PASS);
+ }
+ else
+ {
+ tet_result(TET_FAIL);
+ }
+ END_TEST;
+}
+
+// test multiple writes, one read
+int UtcDaliLocklessBufferMultipleWrites01(void)
+{
+ Integration::LocklessBuffer buf(10);
+ unsigned char data[10];
+
+ for( unsigned char i=0; i<10; ++i )
+ {
+ data[i]=i;
+ }
+
+ // Write to a buffer
+ buf.Write( &data[0], 10 );
+
+ for (unsigned char i=0; i<10; ++i)
+ {
+ data[i]=i+4;
+ }
+
+ // No reads from buffer, so will overwrite contents of same buffer
+ buf.Write( &data[0], 10 );
+
+ if( ReadTest(buf, data, 10) )
+ {
+ tet_result(TET_PASS);
+ }
+ else
+ {
+ tet_result(TET_FAIL);
+ }
+ END_TEST;
+}
+
+// Simple API test
+int UtcDaliLocklessBufferGetSize01(void)
+{
+ Integration::LocklessBuffer buf(10);
+ unsigned int size = buf.GetSize();
+ if( size == 10 )
+ {
+ tet_result(TET_PASS);
+ }
+ else
+ {
+ tet_result(TET_FAIL);
+ }
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+#include <mesh-builder.h>
+
+
+namespace
+{
+
+static Mesh NewMesh()
+{
+ MeshData meshData;
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 60);
+ ConstructFaces(vertices, faces);
+ Material customMaterial = ConstructMaterial();
+ meshData.SetData(vertices, faces, bones, customMaterial);
+ Mesh mesh = Mesh::New(meshData);
+ return mesh;
+}
+
+} // anon mesh
+
+
+int UtcDaliMeshActorNew02(void)
+{
+ TestApplication application;
+ TestPlatformAbstraction& platform = application.GetPlatform();
+
+ tet_infoline("Testing Dali::MeshActor::New()");
+
+ std::string modelName("AModel");
+ Dali::ModelData modelData = Dali::ModelData::New(modelName);
+ Dali::Entity rootEntity = Dali::Entity::New("root");
+ modelData.SetRootEntity(rootEntity);
+ rootEntity.SetType(Dali::Entity::OBJECT);
+
+ Model model = Model::New("Fake model");
+
+ // Run Core - will query using TestPlatformAbstraction::GetResources().
+ application.SendNotification();
+ application.Render();
+
+ Integration::ResourceRequest* request = platform.GetRequest();
+ if(request)
+ {
+ platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
+ }
+
+ application.Render();
+ application.SendNotification();
+
+ Actor actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
+
+ DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
+ DALI_TEST_CHECK(actor);
+ DALI_TEST_CHECK(actor.GetName().compare("root") == 0);
+ END_TEST;
+}
+
+
+int UtcDaliMeshActorCreateNoMeshData(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Mesh::New() - Create with no mesh data");
+
+ try
+ {
+ MeshData meshData;
+ Mesh mesh = Mesh::New(meshData);
+ MeshActor actor1 = MeshActor::New(mesh);
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "object", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+int UtcDaliMeshActorCreateSetData01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshData::SetData() - Create with no verts");
+ try
+ {
+ MeshData meshData;
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ Material customMaterial;
+ meshData.SetData(vertices, faces, bones, customMaterial);
+ Mesh mesh = Mesh::New(meshData);
+ MeshActor actor1 = MeshActor::New(mesh);
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "!vertices.empty()", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliMeshActorCreateSetData02(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshData::SetData - Create with no faces");
+ try
+ {
+ MeshData meshData;
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ Material customMaterial;
+ ConstructVertices(vertices, 60);
+ meshData.SetData(vertices, faces, bones, customMaterial);
+ Mesh mesh = Mesh::New(meshData);
+ MeshActor actor1 = MeshActor::New(mesh);
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "!faceIndices.empty", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliMeshActorCreateSetData03(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshData::SetData - Create with no mats");
+ try
+ {
+ MeshData meshData;
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ Material customMaterial;
+ ConstructVertices(vertices, 60);
+ ConstructFaces(vertices, faces);
+ meshData.SetData(vertices, faces, bones, customMaterial);
+ Mesh mesh = Mesh::New(meshData);
+ MeshActor actor1 = MeshActor::New(mesh);
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "material", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliMeshActorCreateSetData04(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::SetData()");
+
+ MeshData meshData;
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 60);
+ ConstructFaces(vertices, faces);
+ Material customMaterial = ConstructMaterial();
+ meshData.SetData(vertices, faces, bones, customMaterial);
+
+ Mesh mesh = Mesh::New(meshData);
+ MeshActor actor1 = MeshActor::New(mesh);
+ DALI_TEST_CHECK(actor1);
+ END_TEST;
+}
+
+
+int UtcDaliMeshActorDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::DownCast()");
+
+ MeshData meshData;
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 60);
+ ConstructFaces(vertices, faces);
+ Material customMaterial = ConstructMaterial();
+ meshData.SetData(vertices, faces, bones, customMaterial);
+ Mesh mesh = Mesh::New(meshData);
+
+ MeshActor actor1 = MeshActor::New(mesh);
+ Actor anActor = Actor::New();
+ anActor.Add(actor1);
+
+ Actor child = anActor.GetChildAt(0);
+ MeshActor meshActor = MeshActor::DownCast(child);
+
+ DALI_TEST_CHECK(meshActor);
+ END_TEST;
+}
+
+int UtcDaliMeshActorDownCast2(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::DownCast()");
+
+ Actor actor1 = Actor::New();
+ Actor anActor = Actor::New();
+ anActor.Add(actor1);
+
+ Actor child = anActor.GetChildAt(0);
+ MeshActor meshActor = MeshActor::DownCast(child);
+ DALI_TEST_CHECK(!meshActor);
+
+ Actor unInitialzedActor;
+ meshActor = DownCast< MeshActor >( unInitialzedActor );
+ DALI_TEST_CHECK(!meshActor);
+ END_TEST;
+}
+
+int UtcDaliMeshActorSetMaterial01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::SetMaterial()");
+
+ Mesh mesh = NewMesh();
+
+ MeshActor actor = MeshActor::New(mesh);
+ std::string name = "AMeshActor";
+ Stage::GetCurrent().Add(actor);
+ actor.SetName(name);
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ Material customMaterial = Material::New("CustomMaterial");
+ customMaterial.SetDiffuseColor(Vector4(1.0f, 0.0f, 0.0f, 1.0f));
+
+ MeshActor::SetMaterial(actor, name, customMaterial);
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ DALI_TEST_CHECK( actor.GetMaterial() == customMaterial );
+ END_TEST;
+}
+
+int UtcDaliMeshActorSetMaterial01b(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::SetMaterial()");
+
+ Mesh mesh = NewMesh();
+
+ Actor rootActor = Actor::New();
+ MeshActor meshActor = MeshActor::New(mesh);
+ rootActor.Add(meshActor);
+
+ std::string name = "AMeshActor";
+ meshActor.SetName(name);
+
+ Stage::GetCurrent().Add(rootActor);
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ Material customMaterial = Material::New("CustomMaterial");
+ customMaterial.SetDiffuseColor(Vector4(1.0f, 0.0f, 0.0f, 1.0f));
+
+ MeshActor::SetMaterial(rootActor, name, customMaterial);
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ DALI_TEST_CHECK(meshActor.GetMaterial() == customMaterial );
+ END_TEST;
+}
+
+
+int UtcDaliMeshActorSetMaterial02(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::SetMaterial()");
+
+ Mesh mesh = NewMesh();
+ MeshActor actor = MeshActor::New(mesh);
+
+ std::string name = "AMeshActor";
+ actor.SetName(name);
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ Material baseMat = actor.GetMaterial();
+ Material customMaterial = Material::New("CustomMaterial");
+ customMaterial.SetDiffuseColor(Vector4(1.0f, 0.0f, 0.0f, 1.0f));
+
+ MeshActor::SetMaterial(actor, "NoName", customMaterial);
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ DALI_TEST_CHECK( actor.GetMaterial() == baseMat );
+ DALI_TEST_CHECK( actor.GetMaterial() != customMaterial );
+ END_TEST;
+}
+
+int UtcDaliMeshActorSetMaterial02b(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::SetMaterial()");
+
+ Mesh mesh = NewMesh();
+
+ MeshActor actor = MeshActor::New(mesh);
+ Stage::GetCurrent().Add(actor);
+
+ std::string name = "AMeshActor";
+ actor.SetName(name);
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ Material baseMat = actor.GetMaterial();
+ Material customMaterial = Material::New("CustomMaterial");
+ customMaterial.SetDiffuseColor(Vector4(1.0f, 0.0f, 0.0f, 1.0f));
+
+ MeshActor::SetMaterial(actor, "NoName", customMaterial);
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ DALI_TEST_CHECK( actor.GetMaterial() == baseMat );
+ DALI_TEST_CHECK( actor.GetMaterial() != customMaterial );
+ END_TEST;
+}
+
+
+int UtcDaliMeshActorSetMaterial03(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::SetMaterial()");
+
+ Mesh mesh = NewMesh();
+
+ MeshActor actor = MeshActor::New(mesh);
+ std::string name = "AMeshActor";
+ actor.SetName(name);
+ Stage::GetCurrent().Add(actor);
+
+ Material customMaterial = Material::New("CustomMaterial");
+ customMaterial.SetDiffuseColor(Vector4(1.0f, 0.0f, 0.0f, 1.0f));
+
+ actor.SetMaterial(customMaterial);
+ application.SendNotification();
+ application.Render(0);
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK(actor.GetMaterial() == customMaterial );
+ END_TEST;
+}
+
+int UtcDaliMeshActorSetMaterial03b(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::SetMaterial()");
+
+ Mesh mesh = NewMesh();
+
+ MeshActor actor = MeshActor::New(mesh);
+ std::string name = "AMeshActor";
+ actor.SetName(name);
+ Stage::GetCurrent().Add(actor);
+
+ Material customMaterial = Material::New("CustomMaterial");
+ customMaterial.SetDiffuseColor(Vector4(1.0f, 0.0f, 0.0f, 1.0f));
+
+ actor.SetMaterial(customMaterial);
+ application.SendNotification();
+ application.Render(0);
+ application.Render(16);
+ application.SendNotification();
+ DALI_TEST_CHECK(actor.GetMaterial() == customMaterial );
+ END_TEST;
+}
+
+
+
+int UtcDaliMeshActorGetMaterial01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::SetMaterial()");
+
+ MeshData meshData;
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 60);
+ ConstructFaces(vertices, faces);
+ Material material = ConstructMaterial();
+ meshData.SetData(vertices, faces, bones, material);
+ Mesh mesh = Mesh::New(meshData);
+
+ MeshActor actor = MeshActor::New(mesh);
+ std::string name = "AMeshActor";
+ actor.SetName(name);
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ Material gotMaterial = actor.GetMaterial();
+
+ DALI_TEST_EQUALS( material.GetOpacity(), gotMaterial.GetOpacity(), TEST_LOCATION );
+ DALI_TEST_EQUALS( material.GetAmbientColor(), gotMaterial.GetAmbientColor(), TEST_LOCATION );
+ DALI_TEST_EQUALS( material.GetDiffuseColor(), gotMaterial.GetDiffuseColor(), TEST_LOCATION );
+ DALI_TEST_EQUALS( material.GetSpecularColor(), gotMaterial.GetSpecularColor(), TEST_LOCATION );
+ END_TEST;
+}
+
+
+int UtcDaliMeshActorGetMaterial02(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::SetMaterial()");
+
+ MeshData meshData;
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 60);
+ ConstructFaces(vertices, faces);
+ Material material = ConstructMaterial();
+ meshData.SetData(vertices, faces, bones, material);
+ Mesh mesh = Mesh::New(meshData);
+
+ MeshActor actor = MeshActor::New(mesh);
+ std::string name = "AMeshActor";
+ actor.SetName(name);
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ Material gotMaterial = actor.GetMaterial();
+
+ DALI_TEST_EQUALS( material.GetOpacity(), gotMaterial.GetOpacity(), TEST_LOCATION );
+ DALI_TEST_EQUALS( material.GetAmbientColor(), gotMaterial.GetAmbientColor(), TEST_LOCATION );
+ DALI_TEST_EQUALS( material.GetDiffuseColor(), gotMaterial.GetDiffuseColor(), TEST_LOCATION );
+ DALI_TEST_EQUALS( material.GetSpecularColor(), gotMaterial.GetSpecularColor(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliMeshActorSetLighting01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::GetLighting()");
+
+ Mesh mesh = NewMesh();
+
+ MeshActor actor = MeshActor::New(mesh);
+ Stage::GetCurrent().Add(actor);
+
+ // Mesh actors should be lit by default
+ DALI_TEST_EQUALS(actor.IsAffectedByLighting(), true, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliMeshActorSetLighting02(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::SetLighting()");
+
+ Mesh mesh = NewMesh();
+ MeshActor actor = MeshActor::New(mesh);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ Light light = Light::New("KeyLight");
+ light.SetFallOff(Vector2(10000.0f, 10000.0f));
+ LightActor keyLightActor = LightActor::New();
+ keyLightActor.SetParentOrigin(ParentOrigin::CENTER);
+ keyLightActor.SetPosition(200.0f, 500.0f, 300.0f);
+ keyLightActor.SetName(light.GetName());
+
+ Stage::GetCurrent().Add(keyLightActor);
+ keyLightActor.SetLight(light);
+ keyLightActor.SetActive(true);
+
+ actor.SetAffectedByLighting(true);
+ DALI_TEST_EQUALS(actor.IsAffectedByLighting(), true, TEST_LOCATION);
+
+ // Test rendering to ensure that the correct shader setup is used in renderer
+ // (check in debugger or via coverage)
+ application.Render(1);
+ application.SendNotification();
+ application.Render(1);
+ application.SendNotification();
+ application.Render(1);
+ application.SendNotification();
+ application.Render(1);
+ application.SendNotification();
+ application.Render(1);
+
+ actor.SetAffectedByLighting(false);
+ DALI_TEST_EQUALS(actor.IsAffectedByLighting(), false, TEST_LOCATION);
+
+ // Test rendering to ensure that the correct shader setup is used in renderer
+ // (check in debugger or via coverage)
+ application.Render(1);
+ application.SendNotification();
+ application.Render(1);
+ application.SendNotification();
+ application.Render(1);
+ application.SendNotification();
+ application.Render(1);
+ application.SendNotification();
+ application.Render(1);
+ END_TEST;
+}
+
+namespace
+{
+
+Material ConstructMaterial(float opacity, float diffuseOpacity)
+{
+ Material customMaterial = Material::New("CustomMaterial");
+ customMaterial.SetOpacity(opacity);
+ customMaterial.SetDiffuseColor(Vector4(0.8f, 0.0f, 0.4f, diffuseOpacity));
+ customMaterial.SetAmbientColor(Vector4(0.2f, 1.0f, 0.6f, 1.0f));
+ customMaterial.SetSpecularColor(Vector4(0.5f, 0.6f, 0.7f, 1.0f));
+ return customMaterial;
+}
+
+static void TestBlending( TestApplication& application, Material material, float actorOpacity, BlendingMode::Type blendingMode, bool expectedBlend )
+{
+ MeshData meshData;
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 60);
+ ConstructFaces(vertices, faces);
+ meshData.SetData(vertices, faces, bones, material);
+ Mesh mesh = Mesh::New(meshData);
+
+ application.SendNotification();
+ application.Render(0);
+ application.Render();
+ application.SendNotification();
+
+ MeshActor actor = MeshActor::New(mesh);
+ Stage::GetCurrent().Add(actor);
+
+ actor.SetAffectedByLighting(false);
+ actor.SetBlendMode(blendingMode);
+ actor.SetOpacity(actorOpacity);
+
+ TraceCallStack& cullFaceTrace = application.GetGlAbstraction().GetCullFaceTrace();
+ cullFaceTrace.Enable(true);
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( BlendEnabled( cullFaceTrace ), expectedBlend, TEST_LOCATION );
+}
+} //anonymous namespace
+
+
+int UtcDaliMeshActorBlend01(void)
+{
+ // Set Material with translucent color, actor color opaque, Set Use image alpha to true
+ // Expect blending
+
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::Blend01()");
+
+ TestBlending( application, ConstructMaterial(0.5f, 0.5f), 1.0f, BlendingMode::AUTO, true );
+ END_TEST;
+}
+
+
+int UtcDaliMeshActorBlend02(void)
+{
+ // Set material to translucent, set use image alpha to false, set actor opacity to 1.0f
+ // Expect no blending
+
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::Blend02()");
+ TestBlending( application, ConstructMaterial(0.5f, 0.5f), 1.0f, BlendingMode::OFF, false );
+ END_TEST;
+}
+
+int UtcDaliMeshActorBlend03(void)
+{
+ // Set material to opaque, set use image alpha to true, set actor opacity to 1.0f
+ // Expect no blending
+
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::Blend03()");
+ TestBlending( application, ConstructMaterial(1.0f, 1.0f), 1.0f, BlendingMode::AUTO, false );
+ END_TEST;
+}
+
+
+int UtcDaliMeshActorBlend04(void)
+{
+ // Set material to have image with alpha, set use image alpha to true, set actor opacity to 1.0f
+ // Expect blending
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::Blend04()");
+
+ Material material = ConstructMaterial(1.0f, 1.0f);
+ BitmapImage image = BitmapImage::New( 100, 50, Pixel::RGBA8888 );
+ material.SetDiffuseTexture( image );
+ application.SendNotification();
+ application.Render(0);
+
+ TestBlending( application, material, 1.0f, BlendingMode::AUTO, true );
+ END_TEST;
+}
+
+int UtcDaliMeshActorBlend05(void)
+{
+ // Set material to have image with alpha, set use image alpha to false, set actor opacity to 1.0f
+ // Expect no blending
+
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::Blend05()");
+
+ Material material = ConstructMaterial(1.0f, 1.0f);
+ BitmapImage image = BitmapImage::New( 100, 50, Pixel::RGBA8888 );
+ material.SetDiffuseTexture( image );
+ application.SendNotification();
+ application.Render(0);
+
+ TestBlending( application, material, 1.0f, BlendingMode::ON, true );
+ END_TEST;
+}
+
+
+int UtcDaliMeshActorBlend06(void)
+{
+ // Set material to have image without alpha, set use image alpha to true, set actor opacity to 1.0f
+ // Expect no blending
+
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::Blend()");
+
+ Material material = ConstructMaterial(1.0f, 1.0f);
+ BitmapImage image = BitmapImage::New( 100, 50, Pixel::RGB888 );
+ material.SetDiffuseTexture( image );
+ application.SendNotification();
+ application.Render(0);
+
+ TestBlending( application, material, 1.0f, BlendingMode::AUTO, false );
+ END_TEST;
+}
+
+int UtcDaliMeshActorBlend07(void)
+{
+ // Set material to have framebuffer with alpha, set use image alpha to true, set actor opacity to 1.0f
+ // Expect blending
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::Blend07()");
+ application.Render(0);
+
+ Material material = ConstructMaterial(1.0f, 1.0f);
+ FrameBufferImage image = FrameBufferImage::New( 100, 50, Pixel::RGBA8888 );
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+ RenderTask task = taskList.GetTask( 0u );
+ task.SetTargetFrameBuffer( image ); // To ensure frame buffer is connected
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ application.SendNotification();
+ application.Render();
+
+ material.SetDiffuseTexture( image ); // (to render from)
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ TestBlending( application, material, 1.0f, BlendingMode::AUTO, true );
+ END_TEST;
+}
+
+int UtcDaliMeshActorBlend08(void)
+{
+ // Set material to have image with alpha, set use image alpha to false, set actor opacity to 0.5f
+ // Expect blending
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::Blend08()");
+
+ Material material = ConstructMaterial(1.0f, 1.0f);
+ BitmapImage image = BitmapImage::New( 100, 50, Pixel::RGBA8888 );
+ material.SetDiffuseTexture( image );
+ application.SendNotification();
+ application.Render(0);
+
+ TestBlending( application, material, 0.5f, BlendingMode::AUTO, true );
+ END_TEST;
+}
+
+int UtcDaliMeshActorBlend09(void)
+{
+ // Set material to have image with no alpha, set material opacity to 0.5, set use image alpha to true, set actor opacity to 1.0f
+ // Expect blending
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::Blend08()");
+
+ Material material = ConstructMaterial(0.5f, 1.0f);
+ BitmapImage image = BitmapImage::New( 100, 50, Pixel::RGB888 );
+ material.SetDiffuseTexture( image );
+ application.SendNotification();
+ application.Render(0);
+
+ TestBlending( application, material, 1.0f, BlendingMode::AUTO, true );
+ END_TEST;
+}
+
+int UtcDaliMeshActorBoneUpdate01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::BoneUpdate01()");
+
+ // Set up a mesh with bones.
+ // animate bones
+ // ensure bone actor's world matrix is updated
+
+ Actor trunk = Actor::New();
+ trunk.SetName("trunk");
+ trunk.SetPosition(Vector3(100.0f, 200.0f, 300.0f));
+ trunk.SetRotation(Quaternion(M_PI*0.3f, Vector3::XAXIS));
+ Actor branch = Actor::New();
+ branch.SetName("branch");
+ branch.SetPosition(Vector3(10.0f, 100.0f, 0.0f));
+ branch.SetRotation(Quaternion(M_PI*0.2f, Vector3::YAXIS));
+
+ Actor twig = ImageActor::New(CreateBitmapImage());
+ twig.SetName("twig");
+ branch.SetPosition(Vector3(20.0f, 30.0f, 40.0f));
+
+ Actor bug = Actor::New(); // Not a bone
+ bug.SetName("bug");
+ bug.SetPosition(Vector3(10.0f, 10.0f, 10.0f));
+
+ Stage::GetCurrent().Add(trunk);
+ trunk.Add(branch);
+ branch.Add(twig);
+ twig.Add(bug);
+
+ MeshData meshData;
+ CreateMeshData(meshData); // Created with named bones (as above)
+ Mesh mesh = Mesh::New(meshData);
+ MeshActor meshActor = MeshActor::New(mesh);
+ Stage::GetCurrent().Add(meshActor);
+
+ meshActor.BindBonesToMesh(Stage::GetCurrent().GetRootLayer());
+
+ application.SendNotification();
+ application.Render(0);
+ application.Render();
+ application.SendNotification();
+
+ // How to test?
+ // Need to see what bone actor's node has set as world matrix.
+
+ Animation anim = Animation::New(1.0f);
+ anim.RotateBy(trunk, Radian(M_PI*0.5f), Vector3::ZAXIS);
+ anim.Play();
+ application.SendNotification();
+ application.Render(500);
+ application.SendNotification();
+ application.Render(500);
+ application.SendNotification();
+ application.Render(10);
+
+ // All bones have moved.
+ // Check that their world matrix has been updated: ( Isn't IDENTITY )
+ DALI_TEST_CHECK( ! application.GetGlAbstraction().CheckUniformValue("uModelMatrix", Matrix::IDENTITY ) );
+
+ Matrix worldMatrix;
+ GLuint programId, uniformId;
+ DALI_TEST_CHECK( application.GetGlAbstraction().GetUniformIds("uModelMatrix", programId, uniformId) );
+ DALI_TEST_CHECK( application.GetGlAbstraction().GetUniformValue( programId, uniformId, worldMatrix) );
+
+ // But also check that property is calculated as needed:
+ Matrix calcWorldMatrix = twig.GetCurrentWorldMatrix();
+ DALI_TEST_CHECK( Matrix::IDENTITY != calcWorldMatrix );
+ DALI_TEST_CHECK( worldMatrix == calcWorldMatrix );
+ END_TEST;
+
+}
+
+int UtcDaliMeshActorIndices(void)
+{
+ TestApplication application;
+ Actor basicActor = Actor::New();
+ Mesh mesh = NewMesh();
+ MeshActor meshActor = MeshActor::New(mesh);
+
+ Property::IndexContainer indices;
+ meshActor.GetPropertyIndices( indices );
+ DALI_TEST_CHECK( indices.size() == basicActor.GetPropertyCount() ); // Mesh Actor does not have any properties
+ DALI_TEST_EQUALS( indices.size(), meshActor.GetPropertyCount(), TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+#include "mesh-builder.h"
+
+
+
+int UtcDaliMeshDataNew(void)
+{
+ TestApplication application;
+ MeshData meshData;
+
+ DALI_TEST_EQUALS(meshData.HasNormals(), false, TEST_LOCATION);
+ DALI_TEST_EQUALS(meshData.HasTextureCoords(), false, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliMeshDataSetData(void)
+{
+ TestApplication application;
+
+ MeshData meshData;
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 60);
+ ConstructFaces(vertices, faces);
+ Material customMaterial = ConstructMaterial();
+ meshData.SetData(vertices, faces, bones, customMaterial);
+
+ DALI_TEST_GREATER(meshData.GetVertexCount(), 0u, TEST_LOCATION);
+ DALI_TEST_GREATER(meshData.GetFaceCount(), 0u, TEST_LOCATION);
+
+ const MeshData::FaceIndices& faces2 = meshData.GetFaces();
+ const MeshData::VertexContainer& verts2 = meshData.GetVertices();
+ DALI_TEST_EQUALS(faces.at(0), faces2.at(0), TEST_LOCATION);
+ DALI_TEST_EQUALS(vertices.at(1).y, verts2.at(1).y, TEST_LOCATION);
+ DALI_TEST_EQUALS(meshData.GetBoneCount(), static_cast<size_t>(0), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliMeshDataAddToBoundingVolume(void)
+{
+ TestApplication application;
+
+ float sz=40.0f;
+
+ MeshData meshData;
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, sz);
+ ConstructFaces(vertices, faces);
+ Material customMaterial = ConstructMaterial();
+ meshData.SetData(vertices, faces, bones, customMaterial);
+
+ Vector4 upper(-1e10f, -1e10f, -1e10f, 0.0f);
+ Vector4 lower(1e10f, 1e10f, 1e10f, 0.0f);
+ Matrix f(false);
+ f.SetIdentityAndScale(Vector3(2.0f, 2.0f, 2.0f));
+ meshData.AddToBoundingVolume(lower, upper, f);
+
+ Vector4 min(-sz*0.5f, -sz, -sz*0.7f, 0.0f);
+ Vector4 max( sz*0.5f, sz*0.3f, sz*0.5f, 0.0f);
+
+ // Test that upper and lower bounds are set and transformed
+ DALI_TEST_EQUALS(lower, min*2.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(upper, max*2.0f, 0.001, TEST_LOCATION);
+
+ // Test that mesh's upper and lower bounds are set and not transformed
+ DALI_TEST_EQUALS(meshData.GetBoundingBoxMin(), min, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(meshData.GetBoundingBoxMax(), max, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliMeshDataBoundingBox(void)
+{
+ TestApplication application;
+
+ float sz=40.0f;
+ MeshData meshData;
+ Vector4 min(-1.0f, -2.0f, -3.0f, 0.0f);
+ Vector4 max(1.0f, 2.0f, 3.0f, 0.0f);
+ meshData.SetBoundingBoxMin(min);
+ meshData.SetBoundingBoxMax(max);
+ DALI_TEST_EQUALS(meshData.GetBoundingBoxMin(), min, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(meshData.GetBoundingBoxMax(), max, 0.001, TEST_LOCATION);
+
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, sz);
+ ConstructFaces(vertices, faces);
+ Material customMaterial = ConstructMaterial();
+ meshData.SetData(vertices, faces, bones, customMaterial);
+
+ // Check bounding box hasn't changed
+ DALI_TEST_EQUALS(meshData.GetBoundingBoxMin(), min, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(meshData.GetBoundingBoxMax(), max, 0.001, TEST_LOCATION);
+
+ Vector4 upper(-1e10f, -1e10f, -1e10f, 0.0f);
+ Vector4 lower(1e10f, 1e10f, 1e10f, 0.0f);
+ meshData.AddToBoundingVolume(lower, upper, Matrix::IDENTITY);
+
+ // Bounding box should have been update
+ Vector4 bbMin(-sz*0.5f, -sz, -sz*0.7f, 0.0f);
+ Vector4 bbMax( sz*0.5f, sz*0.3f, sz*0.5f, 0.0f);
+
+ // Test that upper and lower bounds are set and transformed
+ DALI_TEST_EQUALS(lower, bbMin, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(upper, bbMax, 0.001, TEST_LOCATION);
+
+ // Test that mesh's upper and lower bounds are set and not transformed
+ DALI_TEST_EQUALS(meshData.GetBoundingBoxMin(), bbMin, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(meshData.GetBoundingBoxMax(), bbMax, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliMeshDataGetVertexCount(void)
+{
+ TestApplication application;
+
+ MeshData meshData;
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 30);
+ ConstructFaces(vertices, faces);
+ Material customMaterial = ConstructMaterial();
+
+ DALI_TEST_EQUALS(meshData.GetVertexCount(), static_cast<size_t>(0), TEST_LOCATION);
+
+ meshData.SetData(vertices, faces, bones, customMaterial);
+ DALI_TEST_EQUALS(meshData.GetVertexCount(), vertices.size(), TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliMeshDataGetVertices(void)
+{
+ TestApplication application;
+ MeshData meshData;
+ const Dali::MeshData::VertexContainer& verts1 = meshData.GetVertices();
+ DALI_TEST_CHECK(verts1.size() == 0);
+
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 30);
+ ConstructFaces(vertices, faces);
+ Material customMaterial = ConstructMaterial();
+ meshData.SetData(vertices, faces, bones, customMaterial);
+
+ const Dali::MeshData::VertexContainer& verts2 = meshData.GetVertices();
+ DALI_TEST_CHECK(verts2.size() != 0);
+ DALI_TEST_CHECK(verts2.size() == meshData.GetVertexCount());
+ END_TEST;
+}
+
+int UtcDaliMeshDataGetFaceCount(void)
+{
+ TestApplication application;
+ MeshData meshData;
+ DALI_TEST_EQUALS(meshData.GetFaceCount(), static_cast<size_t>(0), TEST_LOCATION);
+
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 30);
+ ConstructFaces(vertices, faces);
+ Material customMaterial = ConstructMaterial();
+ meshData.SetData(vertices, faces, bones, customMaterial);
+
+ DALI_TEST_EQUALS(meshData.GetFaceCount(), faces.size() / 3, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliMeshDataGetFaces(void)
+{
+ TestApplication application;
+ MeshData meshData;
+ const Dali::MeshData::FaceIndices& faces1 = meshData.GetFaces();
+ DALI_TEST_CHECK(faces1.size() == 0);
+
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 30);
+ ConstructFaces(vertices, faces);
+ Material customMaterial = ConstructMaterial();
+ meshData.SetData(vertices, faces, bones, customMaterial);
+
+ const Dali::MeshData::FaceIndices& faces2 = meshData.GetFaces();
+ DALI_TEST_CHECK(faces2.size() != 0);
+ END_TEST;
+}
+
+int UtcDaliMeshDataTextureCoords(void)
+{
+ TestApplication application;
+ MeshData meshData;
+ DALI_TEST_EQUALS(meshData.HasTextureCoords(), false, TEST_LOCATION);
+ meshData.SetHasTextureCoords(true);
+ DALI_TEST_EQUALS(meshData.HasTextureCoords(), true, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliMeshDataNormals(void)
+{
+ TestApplication application;
+ MeshData meshData;
+ DALI_TEST_EQUALS(meshData.HasNormals(), false, TEST_LOCATION);
+ meshData.SetHasNormals(true);
+ DALI_TEST_EQUALS(meshData.HasNormals(), true, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliMeshDataGetMaterial(void)
+{
+ TestApplication application;
+ MeshData meshData;
+ Material aMat = meshData.GetMaterial();
+ DALI_TEST_CHECK(!aMat);
+
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 30);
+ ConstructFaces(vertices, faces);
+ Material customMaterial = ConstructMaterial();
+ meshData.SetData(vertices, faces, bones, customMaterial);
+
+ aMat = meshData.GetMaterial();
+ DALI_TEST_CHECK(aMat);
+ END_TEST;
+}
+
+int UtcDaliMeshDataSetMaterial(void)
+{
+ TestApplication application;
+ MeshData meshData;
+
+ Material aMat = meshData.GetMaterial();
+ DALI_TEST_CHECK(!aMat);
+
+ Material mat1 = ConstructMaterial();
+ meshData.SetMaterial(mat1);
+ aMat = meshData.GetMaterial();
+ DALI_TEST_CHECK(mat1 == aMat);
+
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 30);
+ ConstructFaces(vertices, faces);
+ Material customMaterial = ConstructMaterial();
+ meshData.SetData(vertices, faces, bones, customMaterial);
+
+ aMat = meshData.GetMaterial();
+
+ DALI_TEST_CHECK(aMat == customMaterial);
+ DALI_TEST_CHECK(aMat != mat1);
+
+ END_TEST;
+}
+
+int UtcDaliMeshDataGetBoneCount(void)
+{
+ TestApplication application;
+ MeshData meshData;
+ DALI_TEST_EQUALS(meshData.GetBoneCount(), static_cast<size_t>(0), TEST_LOCATION);
+ DALI_TEST_EQUALS(meshData.HasBones(), false, TEST_LOCATION);
+
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 30);
+ ConstructFaces(vertices, faces);
+ ConstructBones(bones);
+ Material customMaterial = ConstructMaterial();
+ meshData.SetData(vertices, faces, bones, customMaterial);
+
+ DALI_TEST_EQUALS(meshData.GetBoneCount(), static_cast<size_t>(3), TEST_LOCATION);
+ DALI_TEST_EQUALS(meshData.HasBones(), true, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliMeshDataGetBones(void)
+{
+ TestApplication application;
+ MeshData meshData;
+ DALI_TEST_EQUALS(meshData.GetBoneCount(), static_cast<size_t>(0), TEST_LOCATION);
+ const BoneContainer& bones1 = meshData.GetBones();
+ DALI_TEST_CHECK(bones1.empty());
+
+ MeshData::VertexContainer vertices;
+ MeshData::FaceIndices faces;
+ BoneContainer bones;
+ ConstructVertices(vertices, 30);
+ ConstructFaces(vertices, faces);
+ ConstructBones(bones);
+ Material customMaterial = ConstructMaterial();
+ meshData.SetData(vertices, faces, bones, customMaterial);
+ const BoneContainer& bones3 = meshData.GetBones();
+ DALI_TEST_CHECK( ! bones3.empty() );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+#include "mesh-builder.h"
+
+namespace
+{
+
+static std::string gModelFile = "blah";
+
+
+// Functor to test whether a Finish signal is emitted
+struct AnimationFinishCheck
+{
+ AnimationFinishCheck(bool& signalReceived)
+ : mSignalReceived(signalReceived)
+ {
+ }
+
+ void operator()(Animation& animation)
+ {
+ mSignalReceived = true;
+ }
+
+ void Reset()
+ {
+ mSignalReceived = false;
+ }
+
+ void CheckSignalReceived()
+ {
+ if (!mSignalReceived)
+ {
+ tet_printf("Expected Finish signal was not received\n");
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+ }
+
+ void CheckSignalNotReceived()
+ {
+ if (mSignalReceived)
+ {
+ tet_printf("Unexpected Finish signal was received\n");
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+ }
+
+ bool& mSignalReceived; // owned by individual tests
+};
+
+}
+
+
+int UtcDaliModelConstructorVoid(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Model::Model()");
+
+ Model model;
+
+ DALI_TEST_CHECK(!model);
+ END_TEST;
+}
+
+int UtcDaliModelNew(void)
+{
+ TestApplication application;
+ TestPlatformAbstraction& platform = application.GetPlatform();
+
+ tet_infoline("Testing Dali::Model::New()");
+
+ Model model = Model::New(gModelFile);
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ DALI_TEST_CHECK(platform.WasCalled(TestPlatformAbstraction::LoadResourceFunc));
+ DALI_TEST_CHECK(model);
+ END_TEST;
+}
+
+int UtcDaliModelDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Model::DownCast()");
+
+ Model model = Model::New(gModelFile);
+
+ BaseHandle object(model);
+
+ Model model2 = Model::DownCast(object);
+ DALI_TEST_CHECK(model2);
+
+ Model model3 = DownCast< Model >(object);
+ DALI_TEST_CHECK(model3);
+
+ BaseHandle unInitializedObject;
+ Model model4 = Model::DownCast(unInitializedObject);
+ DALI_TEST_CHECK(!model4);
+
+ Model model5 = DownCast< Model >(unInitializedObject);
+ DALI_TEST_CHECK(!model5);
+ END_TEST;
+}
+
+
+int UtcDaliModelGetLoadingState01(void)
+{
+ TestApplication application;
+ TestPlatformAbstraction& platform = application.GetPlatform();
+
+ tet_infoline("Testing Dali::Model::New()");
+ Model model = Model::New(gModelFile);
+ application.SendNotification();
+ application.Render();
+ Integration::ResourceRequest* request = platform.GetRequest();
+ DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoading);
+ DALI_TEST_EQUALS(request->GetPath(), gModelFile, TEST_LOCATION);
+ DALI_TEST_EQUALS(request->GetType()->id, Integration::ResourceModel, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliModelGetLoadingState02(void)
+{
+ TestApplication application;
+ TestPlatformAbstraction& platform = application.GetPlatform();
+
+ tet_infoline("Testing Dali::Model::New()");
+ Dali::ModelData modelData = BuildTreeModel();
+ Model model = Model::New(gModelFile);
+ application.SendNotification();
+ application.Render();
+ Integration::ResourceRequest* request = platform.GetRequest();
+ if(request)
+ {
+ platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
+ }
+
+ // Get resources into resource cache
+ application.Render();
+ application.SendNotification();
+
+ DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
+ END_TEST;
+}
+
+int UtcDaliModelGetLoadingState03(void)
+{
+ TestApplication application;
+ TestPlatformAbstraction& platform = application.GetPlatform();
+
+ tet_infoline("Testing Dali::Model::New()");
+ Model model = Model::New(gModelFile);
+ application.SendNotification();
+ application.Render();
+ Integration::ResourceRequest* request = platform.GetRequest();
+ if(request)
+ {
+ platform.SetResourceLoadFailed(request->GetId(), Integration::FailureFileNotFound);
+ }
+ application.Render();
+ application.SendNotification();
+
+ DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingFailed);
+ END_TEST;
+}
+
+
+// Could probably test the signals, too!
+
+int UtcDaliModelNumberOfAnimations(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Model::NumberOfAnimations()");
+
+ int animationCount = -1;
+ Model model = Model::New("Blah"); // Probably need to create a real model...
+ animationCount = model.NumberOfAnimations();
+
+ DALI_TEST_CHECK( -1 != animationCount );
+ END_TEST;
+}
+
+int UtcDaliModelActorFactory(void)
+{
+ TestApplication application;
+ TestPlatformAbstraction& platform = application.GetPlatform();
+
+ tet_infoline("Testing Dali::ModelActorFactory");
+
+ Dali::ModelData modelData = BuildTreeModel();
+
+ // Raise a request
+ Model model = Model::New("Tree");
+
+ application.SendNotification();
+ application.Render();
+ Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
+ if(request)
+ {
+ platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
+ }
+ application.Render();
+ application.SendNotification();
+
+ Actor modelRootActor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
+
+ DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
+ DALI_TEST_CHECK(modelRootActor);
+ DALI_TEST_CHECK(modelRootActor.GetName().compare("root") == 0);
+
+ Actor trunk = modelRootActor.FindChildByName("trunk");
+ DALI_TEST_CHECK(trunk);
+ Actor branch = modelRootActor.FindChildByName("branch");
+ DALI_TEST_CHECK(branch);
+ Actor twig = modelRootActor.FindChildByName("twig");
+ DALI_TEST_CHECK(twig);
+ MeshActor twigMeshActor = MeshActor::DownCast(twig);
+ DALI_TEST_CHECK(!twigMeshActor);
+ Actor leaf = modelRootActor.FindChildByName("leaf");
+ DALI_TEST_CHECK(leaf);
+ MeshActor leafMeshActor = MeshActor::DownCast(leaf);
+ DALI_TEST_CHECK(leafMeshActor);
+
+ Material leafMaterial = leafMeshActor.GetMaterial();
+ DALI_TEST_CHECK(leafMaterial);
+ END_TEST;
+}
+
+int UtcDaliModelActorFactoryTwoMesh(void)
+{
+ TestApplication application;
+ TestPlatformAbstraction& platform = application.GetPlatform();
+
+ tet_infoline("Testing Dali::ModelActorFactory with 2 meshes in an entity");
+
+ Dali::ModelData modelData = BuildTreeModel();
+ Dali::Entity twoMeshEntity = Dali::Entity::New("2Mesh");
+ MeshData meshData;
+ CreateMeshData(meshData);
+ MeshData meshData2;
+ CreateMeshData(meshData2);
+ unsigned int meshIndex = modelData.NumberOfMeshes();
+ modelData.AddMesh(meshData);
+ modelData.AddMesh(meshData2);
+ twoMeshEntity.AddMeshIndex(meshIndex);
+ twoMeshEntity.AddMeshIndex(meshIndex+1);
+ modelData.GetRootEntity().Add(twoMeshEntity);
+
+ // Raise a request
+ Model model = Model::New("Tree");
+
+ application.SendNotification();
+ application.Render();
+ Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
+ if(request)
+ {
+ platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
+ }
+ application.Render();
+ application.SendNotification();
+
+ Actor actor;
+ try
+ {
+ actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
+ }
+ catch( Dali::DaliException& e )
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "entity.NumberOfMeshes() == 1", TEST_LOCATION);
+ DALI_TEST_CHECK( !actor );
+ }
+ END_TEST;
+}
+
+int UtcDaliModelBuildAnimation01(void)
+{
+ TestApplication application;
+ TestPlatformAbstraction& platform = application.GetPlatform();
+
+ tet_infoline("Testing Dali::MeshActor::New()");
+
+ Dali::ModelData modelData = BuildTreeModel();
+
+ // Raise a request
+ Model model = Model::New("Tree");
+
+ application.SendNotification();
+ application.Render();
+ Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
+ if(request)
+ {
+ platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
+ }
+ application.Render();
+ application.SendNotification();
+
+ Actor actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
+ Stage::GetCurrent().Add(actor);
+
+ DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
+ DALI_TEST_CHECK(actor);
+ DALI_TEST_CHECK(actor.GetName().compare("root") == 0);
+
+ DALI_TEST_EQUALS(model.NumberOfAnimations(), static_cast<size_t>(1), TEST_LOCATION);
+ unsigned int animIndex=0;
+ bool found = model.FindAnimation("Anim1", animIndex);
+ DALI_TEST_CHECK(found);
+
+ Animation twigAnim = ModelActorFactory::BuildAnimation(model, actor, animIndex);
+ DALI_TEST_CHECK(twigAnim);
+ DALI_TEST_EQUALS(twigAnim.GetDuration(), 10.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_CHECK(twigAnim.GetDefaultAlphaFunction() == Dali::AlphaFunctions::Linear);
+
+ Actor twigActor = actor.FindChildByName("twig");
+ DALI_TEST_CHECK(twigActor);
+
+ // Start the animation
+ twigAnim.Play();
+
+ float durationSeconds = 10.0f;
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ twigAnim.FinishedSignal().Connect(&application, finishCheck);
+ application.SendNotification();
+ application.Render();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( twigActor.GetCurrentPosition(), Vector3(2.0f, 1.0f, 0.0f), 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( twigActor.GetCurrentPosition(), Vector3(2.5f, 1.0f, 2.5f), 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 75% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( twigActor.GetCurrentPosition(), Vector3(3.5f, 1.0f, 7.5f), 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* Past Finished */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( twigActor.GetCurrentPosition(), Vector3(4.0f, 1.0f, 10.0f), 0.01f, TEST_LOCATION );
+
+ finishCheck.CheckSignalReceived();
+ END_TEST;
+}
+
+
+
+int UtcDaliModelBuildAnimation02(void)
+{
+ TestApplication application;
+ TestPlatformAbstraction& platform = application.GetPlatform();
+
+ tet_infoline("Testing Dali::MeshActor::New()");
+
+ Dali::ModelData modelData = BuildTreeModel();
+
+ // Raise a request
+ Model model = Model::New("Tree");
+
+ application.SendNotification();
+ application.Render();
+ Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
+ if(request)
+ {
+ platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
+ }
+ application.Render();
+ application.SendNotification();
+
+ Actor actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
+
+ DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
+ DALI_TEST_CHECK(actor);
+ DALI_TEST_CHECK(actor.GetName().compare("root") == 0);
+
+ DALI_TEST_EQUALS(model.NumberOfAnimations(), static_cast<size_t>(1), TEST_LOCATION);
+ unsigned int animIndex=0;
+ bool found = model.FindAnimation("Anim1", animIndex);
+ DALI_TEST_CHECK(found);
+ Animation twigAnim = ModelActorFactory::BuildAnimation(model, actor, animIndex, 5.0f);
+ DALI_TEST_CHECK(twigAnim);
+ DALI_TEST_EQUALS(twigAnim.GetDuration(), 5.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_CHECK(twigAnim.GetDefaultAlphaFunction() == Dali::AlphaFunctions::Linear);
+ END_TEST;
+}
+
+
+int UtcDaliModelBuildAnimation03(void)
+{
+ TestApplication application;
+ TestPlatformAbstraction& platform = application.GetPlatform();
+
+ tet_infoline("Testing Dali::MeshActor::New()");
+
+ Dali::ModelData modelData = BuildTreeModel();
+
+ // Raise a request
+ Model model = Model::New("Tree");
+
+ application.SendNotification();
+ application.Render();
+ Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
+ if(request)
+ {
+ platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
+ }
+ application.Render();
+ application.SendNotification();
+
+ Actor actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
+
+ DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
+ DALI_TEST_CHECK(actor);
+ DALI_TEST_CHECK(actor.GetName().compare("root") == 0);
+
+ DALI_TEST_EQUALS(model.NumberOfAnimations(), static_cast<size_t>(1), TEST_LOCATION);
+ unsigned int animIndex=0;
+ bool found = model.FindAnimation("Anim1", animIndex);
+ DALI_TEST_CHECK(found);
+
+ Animation twigAnim = ModelActorFactory::BuildAnimation(model, actor, animIndex, Dali::AlphaFunctions::EaseInOut, 5.0f);
+ DALI_TEST_CHECK(twigAnim);
+ DALI_TEST_EQUALS(twigAnim.GetDuration(), 5.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_CHECK(twigAnim.GetDefaultAlphaFunction() == Dali::AlphaFunctions::EaseInOut);
+ END_TEST;
+}
+
+
+int UtcDaliModelBuildAnimation04(void)
+{
+ TestApplication application;
+ TestPlatformAbstraction& platform = application.GetPlatform();
+
+ tet_infoline("Testing Dali::MeshActor::New()");
+
+ Dali::ModelData modelData = BuildTreeModel();
+
+ // Raise a request
+ Model model = Model::New("Tree");
+
+ application.SendNotification();
+ application.Render();
+ Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
+ if(request)
+ {
+ platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
+ }
+ application.Render();
+ application.SendNotification();
+
+ Actor actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
+
+ DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
+ DALI_TEST_CHECK(actor);
+ DALI_TEST_CHECK(actor.GetName().compare("root") == 0);
+
+ DALI_TEST_EQUALS(model.NumberOfAnimations(), static_cast<size_t>(1), TEST_LOCATION);
+
+ unsigned int animIndex=0;
+ bool found = model.FindAnimation("Fred", animIndex);
+ DALI_TEST_CHECK(!found);
+ END_TEST;
+}
+
+
+int UtcDaliModelBuildAnimation05(void)
+{
+ TestApplication application;
+ TestPlatformAbstraction& platform = application.GetPlatform();
+
+ tet_infoline("Testing Dali::MeshActor::New()");
+
+ Dali::ModelData modelData = BuildTreeModel();
+
+ // Raise a request
+ Model model = Model::New("Tree");
+
+ // Run Core - will query using TestPlatformAbstraction::GetResources().
+ application.SendNotification();
+ application.Render();
+ Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
+ if(request)
+ {
+ platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
+ }
+ application.Render();
+ application.SendNotification();
+
+ Actor actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
+
+ DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
+ DALI_TEST_CHECK(actor);
+ DALI_TEST_CHECK(actor.GetName().compare("root") == 0);
+
+ DALI_TEST_EQUALS(model.NumberOfAnimations(), static_cast<size_t>(1), TEST_LOCATION);
+ Animation twigAnim = ModelActorFactory::BuildAnimation(model, actor, 0);
+ DALI_TEST_CHECK(twigAnim);
+ DALI_TEST_EQUALS(twigAnim.GetDuration(), 10.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_CHECK(twigAnim.GetDefaultAlphaFunction() == Dali::AlphaFunctions::Linear);
+ END_TEST;
+}
+
+
+int UtcDaliModelBuildAnimation06(void)
+{
+ TestApplication application;
+ TestPlatformAbstraction& platform = application.GetPlatform();
+
+ tet_infoline("Testing Dali::MeshActor::New()");
+
+ Dali::ModelData modelData = BuildTreeModel();
+
+ // Raise a request
+ Model model = Model::New("Tree");
+
+ application.SendNotification();
+ application.Render();
+ Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
+ if(request)
+ {
+ platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
+ }
+ application.Render();
+ application.SendNotification();
+
+ Actor actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
+
+ DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
+ DALI_TEST_CHECK(actor);
+ DALI_TEST_CHECK(actor.GetName().compare("root") == 0);
+
+ DALI_TEST_EQUALS(model.NumberOfAnimations(), static_cast<size_t>(1), TEST_LOCATION);
+ Animation twigAnim = ModelActorFactory::BuildAnimation(model, actor, 0, 5.0f);
+ DALI_TEST_CHECK(twigAnim);
+ DALI_TEST_EQUALS(twigAnim.GetDuration(), 5.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_CHECK(twigAnim.GetDefaultAlphaFunction() == Dali::AlphaFunctions::Linear);
+ END_TEST;
+}
+
+
+int UtcDaliModelBuildAnimation07(void)
+{
+ TestApplication application;
+ TestPlatformAbstraction& platform = application.GetPlatform();
+
+ tet_infoline("Testing Dali::MeshActor::New()");
+
+ Dali::ModelData modelData = BuildTreeModel();
+
+ // Raise a request
+ Model model = Model::New("Tree");
+
+ application.SendNotification();
+ application.Render();
+ Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
+ if(request)
+ {
+ platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
+ }
+ application.Render();
+ application.SendNotification();
+
+ Actor actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
+
+ DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
+ DALI_TEST_CHECK(actor);
+ DALI_TEST_CHECK(actor.GetName().compare("root") == 0);
+
+ DALI_TEST_EQUALS(model.NumberOfAnimations(), static_cast<size_t>(1), TEST_LOCATION);
+ Animation twigAnim = ModelActorFactory::BuildAnimation(model, actor, 0, Dali::AlphaFunctions::Bounce);
+ DALI_TEST_CHECK(twigAnim);
+ DALI_TEST_EQUALS(twigAnim.GetDuration(), 10.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_CHECK(twigAnim.GetDefaultAlphaFunction() == Dali::AlphaFunctions::Bounce);
+ END_TEST;
+}
+
+int UtcDaliModelBuildAnimation08(void)
+{
+ TestApplication application;
+ TestPlatformAbstraction& platform = application.GetPlatform();
+
+ tet_infoline("Testing Dali::MeshActor::New()");
+
+ Dali::ModelData modelData = BuildTreeModel();
+
+ // Raise a request
+ Model model = Model::New("Tree");
+
+ application.SendNotification();
+ application.Render();
+ Integration::ResourceRequest* request = platform.GetRequest(); // Return modelData
+ if(request)
+ {
+ platform.SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(&(modelData.GetBaseObject())));
+ }
+ application.Render();
+ application.SendNotification();
+
+ Actor actor = ModelActorFactory::BuildActorTree(model, ""); // model should be loaded
+
+ DALI_TEST_CHECK(model.GetLoadingState() == ResourceLoadingSucceeded);
+ DALI_TEST_CHECK(actor);
+ DALI_TEST_CHECK(actor.GetName().compare("root") == 0);
+
+ DALI_TEST_EQUALS(model.NumberOfAnimations(), static_cast<size_t>(1), TEST_LOCATION);
+
+ Animation twigAnim = ModelActorFactory::BuildAnimation(model, actor, 10);
+ DALI_TEST_CHECK(!twigAnim);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali/integration-api/events/mouse-wheel-event-integ.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+namespace
+{
+
+// Key Event Test references
+const static unsigned int SHIFT_MODIFIER = 0x1;
+const static unsigned int CTRL_MODIFIER = 0x2;
+const static unsigned int ALT_MODIFIER = 0x4;
+const static unsigned int SHIFT_AND_CTRL_MODIFIER = SHIFT_MODIFIER | CTRL_MODIFIER;
+
+
+// Stores data that is populated in the callback and will be read by the TET cases
+struct SignalData
+{
+ SignalData()
+ : functorCalled(false)
+ {}
+
+ void Reset()
+ {
+ functorCalled = false;
+
+ receivedMouseWheelEvent.direction = 0;
+ receivedMouseWheelEvent.modifiers = 0;
+ receivedMouseWheelEvent.point = Vector2::ZERO;
+ receivedMouseWheelEvent.z = 0;
+ receivedMouseWheelEvent.timeStamp = 0;
+
+ mouseWheeledActor = NULL;
+ }
+
+ bool functorCalled;
+ MouseWheelEvent receivedMouseWheelEvent;
+ Actor mouseWheeledActor;
+};
+
+// Functor that sets the data when called
+struct MouseWheelEventReceivedFunctor
+{
+ MouseWheelEventReceivedFunctor( SignalData& data ) : signalData( data ) { }
+
+ bool operator()( Actor actor, const MouseWheelEvent& mouseWheelEvent )
+ {
+ signalData.functorCalled = true;
+ signalData.receivedMouseWheelEvent = mouseWheelEvent;
+ signalData.mouseWheeledActor = actor;
+
+ return true;
+ }
+
+ SignalData& signalData;
+};
+
+} // anonymous namespace
+
+int UtcDaliMouseWheelEventConstructor(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ MouseWheelEvent event(1, SHIFT_MODIFIER, Vector2(1.0f, 1.0f), 1, 1000u); // coustruct a mouse wheel event
+
+ DALI_TEST_EQUALS(1, event.direction, TEST_LOCATION); // check direction
+ DALI_TEST_EQUALS(SHIFT_MODIFIER, event.modifiers, TEST_LOCATION); // check modifier
+ DALI_TEST_EQUALS(Vector2(1.0f, 1.0f), event.point, TEST_LOCATION); // check modifier
+ DALI_TEST_EQUALS(1, event.z, TEST_LOCATION); // check modifier
+ DALI_TEST_EQUALS(1000u, event.timeStamp, TEST_LOCATION); // check modifier
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliMouseWheelEventIsShiftModifier(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ MouseWheelEvent event;
+ DALI_TEST_EQUALS(0u, event.modifiers, TEST_LOCATION);
+
+ event.modifiers = SHIFT_MODIFIER; // Set to Shift Modifier
+
+ DALI_TEST_EQUALS(SHIFT_MODIFIER, event.modifiers, TEST_LOCATION); // check able to set
+
+ DALI_TEST_EQUALS(true, event.IsShiftModifier(), TEST_LOCATION); // check IsShiftModifier
+
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliMouseWheelEventIsCtrlModifier(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ MouseWheelEvent event;
+ DALI_TEST_EQUALS(0u, event.modifiers, TEST_LOCATION);
+
+ event.modifiers = CTRL_MODIFIER; // Set to Ctrl Modifier
+
+ DALI_TEST_EQUALS(CTRL_MODIFIER, event.modifiers, TEST_LOCATION); // check able to set
+
+ DALI_TEST_EQUALS(true, event.IsCtrlModifier(), TEST_LOCATION); // check IsCtrlModifier
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliMouseWheelEventIsAltModifier(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ MouseWheelEvent event;
+ DALI_TEST_EQUALS(0u, event.modifiers, TEST_LOCATION);
+
+ event.modifiers = ALT_MODIFIER; // Set to Alt Modifier
+
+ DALI_TEST_EQUALS(ALT_MODIFIER, event.modifiers, TEST_LOCATION); // check able to set
+
+ DALI_TEST_EQUALS(true, event.IsAltModifier(), TEST_LOCATION); // IsAltModifier
+ END_TEST;
+}
+
+// Positive fail test case for a method
+int UtcDaliMouseWheelEventIsNotShiftModifier(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ MouseWheelEvent event(1, CTRL_MODIFIER, Vector2(1.0f, 1.0f), 1, 1000u);
+
+ DALI_TEST_EQUALS(CTRL_MODIFIER, event.modifiers, TEST_LOCATION); // check different modifier used
+
+ DALI_TEST_EQUALS(false, event.IsShiftModifier(), TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive fail test case for a method
+int UtcDaliMouseWheelEventIsNotCtrlModifier(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ MouseWheelEvent event(1, ALT_MODIFIER, Vector2(1.0f, 1.0f), 1, 1000u);
+
+ DALI_TEST_EQUALS(ALT_MODIFIER, event.modifiers, TEST_LOCATION); // check different modifier used
+
+ DALI_TEST_EQUALS(false, event.IsCtrlModifier(), TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive fail test case for a method
+int UtcDaliMouseWheelEventIsNotAltModifier(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ MouseWheelEvent event(1, SHIFT_MODIFIER, Vector2(1.0f, 1.0f), 1, 1000u);
+
+ DALI_TEST_EQUALS(SHIFT_MODIFIER, event.modifiers, TEST_LOCATION); // check different modifier used
+
+ DALI_TEST_EQUALS(false, event.IsAltModifier(), TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliMouseWheelEventANDModifer(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ MouseWheelEvent event(1, SHIFT_AND_CTRL_MODIFIER, Vector2(1.0f, 1.0f), 1, 1000u);
+ DALI_TEST_EQUALS(true, event.IsCtrlModifier() && event.IsShiftModifier(), TEST_LOCATION);
+
+ event.modifiers = SHIFT_MODIFIER;
+
+ DALI_TEST_EQUALS(false, event.IsCtrlModifier() && event.IsShiftModifier(), TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliMouseWheelEventORModifer(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ MouseWheelEvent event(1, SHIFT_AND_CTRL_MODIFIER, Vector2(1.0f, 1.0f), 1, 1000u);
+ DALI_TEST_EQUALS(true, event.IsCtrlModifier() || event.IsAltModifier(), TEST_LOCATION);
+
+ event.modifiers = SHIFT_MODIFIER;
+
+ DALI_TEST_EQUALS(false, event.IsCtrlModifier() && event.IsAltModifier(), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliMouseWheelEventSignalling(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to actor's mouse wheel event signal
+ SignalData data;
+ MouseWheelEventReceivedFunctor functor( data );
+ actor.MouseWheelEventSignal().Connect( &application, functor );
+
+ Vector2 screenCoordinates( 10.0f, 10.0f );
+ Integration::MouseWheelEvent event(0, SHIFT_MODIFIER, screenCoordinates, 1, 1000u);
+
+ // Emit a mouse wheel signal
+ application.ProcessEvent( event );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( actor == data.mouseWheeledActor );
+ DALI_TEST_EQUALS(0, data.receivedMouseWheelEvent.direction, TEST_LOCATION); // check direction
+ DALI_TEST_EQUALS(SHIFT_MODIFIER, data.receivedMouseWheelEvent.modifiers, TEST_LOCATION); // check modifier
+ DALI_TEST_EQUALS(screenCoordinates, data.receivedMouseWheelEvent.point, TEST_LOCATION); // check modifier
+ DALI_TEST_EQUALS(1, data.receivedMouseWheelEvent.z, TEST_LOCATION); // check modifier
+ DALI_TEST_EQUALS(1000u, data.receivedMouseWheelEvent.timeStamp, TEST_LOCATION); // check modifier
+ data.Reset();
+
+ // Emit a mouse wheel signal where the actor is not present, will hit the root actor though
+ Actor rootActor( Stage::GetCurrent().GetRootLayer() );
+
+ // Connect to root actor's mouse wheel event signal
+ SignalData rootData;
+ MouseWheelEventReceivedFunctor rootFunctor( rootData ); // Consumes signal
+ rootActor.MouseWheelEventSignal().Connect( &application, rootFunctor );
+
+ screenCoordinates.x = screenCoordinates.y = 300.0f;
+ Integration::MouseWheelEvent newEvent(0, SHIFT_MODIFIER, screenCoordinates, 1, 1000u);
+ application.ProcessEvent( newEvent );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( rootActor == rootData.mouseWheeledActor );
+ DALI_TEST_EQUALS(0, rootData.receivedMouseWheelEvent.direction, TEST_LOCATION); // check direction
+ DALI_TEST_EQUALS(SHIFT_MODIFIER, rootData.receivedMouseWheelEvent.modifiers, TEST_LOCATION); // check modifier
+ DALI_TEST_EQUALS(screenCoordinates, rootData.receivedMouseWheelEvent.point, TEST_LOCATION); // check modifier
+ DALI_TEST_EQUALS(1, rootData.receivedMouseWheelEvent.z, TEST_LOCATION); // check modifier
+ DALI_TEST_EQUALS(1000u, rootData.receivedMouseWheelEvent.timeStamp, TEST_LOCATION); // check modifier
+
+ // Remove actor from stage
+ Stage::GetCurrent().Remove( actor );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Emit a move at the same point, we should not be signalled.
+ application.ProcessEvent( event );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+#include <dali/public-api/dali-core.h>
+
+using namespace Dali;
+
+#include "mesh-builder.h"
+
+namespace
+{
+
+// Functors to test whether Object created/destroyed signal is emitted for different types of Objects
+
+struct TestObjectDestroyedCallback
+{
+ TestObjectDestroyedCallback(bool& signalReceived, Dali::RefObject*& objectPointer)
+ : mSignalVerified(signalReceived),
+ mObjectPointer(objectPointer)
+ {
+ }
+
+ void operator()(const Dali::RefObject* objectPointer)
+ {
+ tet_infoline("Verifying TestObjectDestroyedCallback()");
+
+ if(objectPointer == mObjectPointer)
+ {
+ mSignalVerified = true;
+ }
+ }
+
+ bool& mSignalVerified;
+ Dali::RefObject*& mObjectPointer;
+};
+
+struct TestActorCallback
+{
+ TestActorCallback(bool& signalReceived)
+ : mSignalVerified(signalReceived)
+ {
+ }
+
+ void operator()(BaseHandle object)
+ {
+ tet_infoline("Verifying TestActorCallback()");
+ Actor actor = Actor::DownCast(object);
+ if(actor)
+ {
+ mSignalVerified = true;
+ }
+ }
+
+ bool& mSignalVerified;
+};
+
+struct TestCameraActorCallback
+{
+ TestCameraActorCallback(bool& signalReceived)
+ : mSignalVerified(signalReceived)
+ {
+ }
+ void operator()(BaseHandle object)
+ {
+ tet_infoline("Verifying TestCameraActorCallback()");
+ CameraActor actor = CameraActor::DownCast(object);
+ if(actor)
+ {
+ mSignalVerified = true;
+ }
+ }
+ bool& mSignalVerified;
+};
+
+struct TestImageActorCallback
+{
+ TestImageActorCallback(bool& signalReceived)
+ : mSignalVerified(signalReceived)
+ {
+ }
+ void operator()(BaseHandle object)
+ {
+ tet_infoline("Verifying TestImageActorCallback()");
+ ImageActor actor = ImageActor::DownCast(object);
+ if(actor)
+ {
+ mSignalVerified = true;
+ }
+ }
+ bool& mSignalVerified;
+};
+
+struct TestLayerCallback
+{
+ TestLayerCallback(bool& signalReceived)
+ : mSignalVerified(signalReceived)
+ {
+ }
+ void operator()(BaseHandle object)
+ {
+ tet_infoline("Verifying TestLayerCallback()");
+ Layer actor = Layer::DownCast(object);
+ if(actor)
+ {
+ mSignalVerified = true;
+ }
+ }
+ bool& mSignalVerified;
+};
+
+struct TestLightActorCallback
+{
+ TestLightActorCallback(bool& signalReceived)
+ : mSignalVerified(signalReceived)
+ {
+ }
+ void operator()(BaseHandle object)
+ {
+ tet_infoline("Verifying TestLightActorCallback()");
+ LightActor actor = LightActor::DownCast(object);
+ if(actor)
+ {
+ mSignalVerified = true;
+ }
+ }
+ bool& mSignalVerified;
+};
+
+struct TestMeshActorCallback
+{
+ TestMeshActorCallback(bool& signalReceived)
+ : mSignalVerified(signalReceived)
+ {
+ }
+ void operator()(BaseHandle object)
+ {
+ tet_infoline("Verifying TestMeshActorCallback()");
+ MeshActor actor = MeshActor::DownCast(object);
+ if(actor)
+ {
+ mSignalVerified = true;
+ }
+ }
+ bool& mSignalVerified;
+};
+
+struct TestModelCallback
+{
+ TestModelCallback(bool& signalReceived)
+ : mSignalVerified(signalReceived)
+ {
+ }
+ void operator()(BaseHandle object)
+ {
+ tet_infoline("Verifying TestModelCallback()");
+ Model actor = Model::DownCast(object);
+ if(actor)
+ {
+ mSignalVerified = true;
+ }
+ }
+ bool& mSignalVerified;
+};
+
+struct TestTextActorCallback
+{
+ TestTextActorCallback(bool& signalReceived)
+ : mSignalVerified(signalReceived)
+ {
+ }
+ void operator()(BaseHandle object)
+ {
+ tet_infoline("Verifying TestTextActorCallback()");
+ TextActor actor = TextActor::DownCast(object);
+ if(actor)
+ {
+ mSignalVerified = true;
+ }
+ }
+ bool& mSignalVerified;
+};
+
+struct TestAnimationCallback
+{
+ TestAnimationCallback(bool& signalReceived)
+ : mSignalVerified(signalReceived)
+ {
+ }
+ void operator()(BaseHandle object)
+ {
+ tet_infoline("Verifying TestAnimationCallback()");
+ Animation actor = Animation::DownCast(object);
+ if(actor)
+ {
+ mSignalVerified = true;
+ }
+ }
+ bool& mSignalVerified;
+};
+
+struct TestShaderEffectCallback
+{
+ TestShaderEffectCallback(bool& signalReceived)
+ : mSignalVerified(signalReceived)
+ {
+ }
+ void operator()(BaseHandle object)
+ {
+ tet_infoline("Verifying TestShaderEffectCallback()");
+ ShaderEffect actor = ShaderEffect::DownCast(object);
+ if(actor)
+ {
+ mSignalVerified = true;
+ }
+ }
+ bool& mSignalVerified;
+};
+
+
+} // anonymous namespace
+
+
+
+
+int UtcDaliObjectRegistryGet(void)
+{
+ TestApplication application;
+
+ ObjectRegistry registry; // like this for ctor code coverage
+ registry= Stage::GetCurrent().GetObjectRegistry();
+
+ DALI_TEST_CHECK( registry );
+ END_TEST;
+}
+
+
+
+int UtcDaliObjectRegistrySignalActorCreated(void)
+{
+ tet_infoline("Testing GetObjectRegistry()");
+ TestApplication application;
+ ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
+ DALI_TEST_CHECK( registry );
+
+ bool verified = false;
+ TestActorCallback test(verified);
+
+ Dali::RefObject* objectPointer = NULL;
+ TestObjectDestroyedCallback test2(verified, objectPointer);
+
+ registry.ObjectCreatedSignal().Connect(&application, test);
+ registry.ObjectDestroyedSignal().Connect(&application, test2);
+
+ {
+ Actor actor = Actor::New();
+ DALI_TEST_CHECK( test.mSignalVerified );
+
+ verified = false;
+ objectPointer = actor.GetObjectPtr();
+ }
+ DALI_TEST_CHECK( test.mSignalVerified );
+ END_TEST;
+}
+
+int UtcDaliObjectRegistrySignalCameraCreated(void)
+{
+ TestApplication application;
+
+ ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
+
+ bool verified = false;
+ TestCameraActorCallback test(verified);
+
+ Dali::RefObject* objectPointer = NULL;
+ TestObjectDestroyedCallback test2(verified, objectPointer);
+
+ registry.ObjectCreatedSignal().Connect(&application, test);
+ registry.ObjectDestroyedSignal().Connect(&application, test2);
+
+ {
+ CameraActor actor = CameraActor::New();
+ DALI_TEST_CHECK( test.mSignalVerified );
+
+ verified = false;
+ objectPointer = actor.GetObjectPtr();
+ }
+ DALI_TEST_CHECK( test.mSignalVerified );
+ END_TEST;
+}
+
+int UtcDaliObjectRegistrySignalImageActorCreated(void)
+{
+ TestApplication application;
+ ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
+
+ static const char* TestImageFilename = "icon_wrt.png";
+ Image image = Image::New(TestImageFilename);
+
+ bool verified = false;
+ TestImageActorCallback test(verified);
+
+ Dali::RefObject* objectPointer = NULL;
+ TestObjectDestroyedCallback test2(verified, objectPointer);
+
+ registry.ObjectCreatedSignal().Connect(&application, test);
+ registry.ObjectDestroyedSignal().Connect(&application, test2);
+
+ {
+ ImageActor actor = ImageActor::New(image);
+ DALI_TEST_CHECK( test.mSignalVerified );
+
+ verified = false;
+ objectPointer = actor.GetObjectPtr();
+ }
+ DALI_TEST_CHECK( test.mSignalVerified );
+ END_TEST;
+}
+
+int UtcDaliObjectRegistrySignalLayerCreated(void)
+{
+ TestApplication application;
+ ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
+
+ bool verified = false;
+ TestLayerCallback test(verified);
+
+ Dali::RefObject* objectPointer = NULL;
+ TestObjectDestroyedCallback test2(verified, objectPointer);
+
+ registry.ObjectCreatedSignal().Connect(&application, test);
+ registry.ObjectDestroyedSignal().Connect(&application, test2);
+
+ {
+ Layer actor = Layer::New();
+ DALI_TEST_CHECK( test.mSignalVerified );
+
+ verified = false;
+ objectPointer = actor.GetObjectPtr();
+ }
+ DALI_TEST_CHECK( test.mSignalVerified );
+ END_TEST;
+}
+
+int UtcDaliObjectRegistrySignalLightActorCreated(void)
+{
+ TestApplication application;
+ ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
+
+ bool verified = false;
+ TestLightActorCallback test(verified);
+
+ Dali::RefObject* objectPointer = NULL;
+ TestObjectDestroyedCallback test2(verified, objectPointer);
+
+ registry.ObjectCreatedSignal().Connect(&application, test);
+ registry.ObjectDestroyedSignal().Connect(&application, test2);
+
+ {
+ LightActor actor = LightActor::New();
+ DALI_TEST_CHECK( test.mSignalVerified );
+
+ verified = false;
+ objectPointer = actor.GetObjectPtr();
+ }
+ DALI_TEST_CHECK( test.mSignalVerified );
+ END_TEST;
+}
+
+int UtcDaliObjectRegistrySignalMeshActorCreated(void)
+{
+ TestApplication application;
+ ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
+
+ bool verified = false;
+ TestMeshActorCallback test(verified);
+
+ Dali::RefObject* objectPointer = NULL;
+ TestObjectDestroyedCallback test2(verified, objectPointer);
+
+ registry.ObjectCreatedSignal().Connect(&application, test);
+ registry.ObjectDestroyedSignal().Connect(&application, test2);
+
+ Mesh mesh = ConstructMesh(60);
+
+ {
+ MeshActor actor = MeshActor::New(mesh);
+
+ DALI_TEST_CHECK(actor);
+ DALI_TEST_CHECK( test.mSignalVerified );
+
+ verified = false;
+ objectPointer = actor.GetObjectPtr();
+ }
+ DALI_TEST_CHECK( test.mSignalVerified );
+ END_TEST;
+}
+
+int UtcDaliObjectRegistrySignalModelCreated(void)
+{
+ TestApplication application;
+ ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
+
+ bool verified = false;
+ TestModelCallback test(verified);
+
+ Dali::RefObject* objectPointer = NULL;
+ TestObjectDestroyedCallback test2(verified, objectPointer);
+
+ registry.ObjectCreatedSignal().Connect(&application, test);
+ registry.ObjectDestroyedSignal().Connect(&application, test2);
+
+ {
+ Model model = Model::New("blah");
+ DALI_TEST_CHECK( test.mSignalVerified );
+
+ verified = false;
+ objectPointer = model.GetObjectPtr();
+ }
+ DALI_TEST_CHECK( test.mSignalVerified );
+ END_TEST;
+}
+
+int UtcDaliObjectRegistrySignalTextActorCreated(void)
+{
+ TestApplication application;
+ ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
+
+ bool verified = false;
+ TestTextActorCallback test(verified);
+
+ Dali::RefObject* objectPointer = NULL;
+ TestObjectDestroyedCallback test2(verified, objectPointer);
+
+ registry.ObjectCreatedSignal().Connect(&application, test);
+ registry.ObjectDestroyedSignal().Connect(&application, test2);
+
+ {
+ TextActor actor = TextActor::New("Hello");
+ DALI_TEST_CHECK( test.mSignalVerified );
+
+ verified = false;
+ objectPointer = actor.GetObjectPtr();
+ }
+ DALI_TEST_CHECK( test.mSignalVerified );
+ END_TEST;
+}
+
+int UtcDaliObjectRegistrySignalAnimationCreated(void)
+{
+ TestApplication application;
+ ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
+
+ bool verified = false;
+ TestAnimationCallback test(verified);
+
+ Dali::RefObject* objectPointer = NULL;
+ TestObjectDestroyedCallback test2(verified, objectPointer);
+
+ registry.ObjectCreatedSignal().Connect(&application, test);
+ registry.ObjectDestroyedSignal().Connect(&application, test2);
+
+ {
+ Animation animation = Animation::New(1.0f);
+ DALI_TEST_CHECK( test.mSignalVerified );
+
+ verified = false;
+ objectPointer = animation.GetObjectPtr();
+ }
+ DALI_TEST_CHECK( test.mSignalVerified );
+ END_TEST;
+}
+
+int UtcDaliObjectRegistrySignalShaderEffectCreated(void)
+{
+ TestApplication application;
+ ObjectRegistry registry = Stage::GetCurrent().GetObjectRegistry();
+
+ static const char* VertexSource =
+ "void main()\n"
+ "{\n"
+ " gl_Position = uProjection * uModelView * vec4(aPosition, 1.0);\n"
+ " vTexCoord = aTexCoord;\n"
+ "}\n";
+
+ static const char* FragmentSource =
+ "void main()\n"
+ "{\n"
+ " gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n"
+ "}\n";
+
+ bool verified = false;
+ TestShaderEffectCallback test(verified);
+
+ Dali::RefObject* objectPointer = NULL;
+ TestObjectDestroyedCallback test2(verified, objectPointer);
+
+ registry.ObjectCreatedSignal().Connect(&application, test);
+ registry.ObjectDestroyedSignal().Connect(&application, test2);
+
+ {
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( test.mSignalVerified );
+
+ verified = false;
+ objectPointer = effect.GetObjectPtr();
+ }
+ DALI_TEST_CHECK( test.mSignalVerified );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+
+int UtcDaliRandomRangeMethod(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ float a=0, b=1;
+ for(size_t i=0; i<100; i++)
+ {
+ float r = Dali::Random::Range(a, b);
+ DALI_TEST_CHECK(r >= a && r <= b);
+ }
+
+ a=100; b=-100;
+ for(size_t i=0; i<100; i++)
+ {
+ float r = Dali::Random::Range(a, b);
+ DALI_TEST_CHECK(r >= b && r <= a);
+ }
+ END_TEST;
+}
+
+
+int UtcDaliRandomAxisMethod(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ for(size_t i=0; i<100; i++)
+ {
+ Vector4 axis = Dali::Random::Axis();
+ DALI_TEST_EQUALS(axis.Length(), 1.0f, 0.0001f, TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliRandomChanceMethod(void)
+{
+ int bin_zero=0, bin_one=0;
+
+ for(size_t i=0; i<100000; i++)
+ {
+ bool chance = Dali::Random::Chance();
+ if(chance)
+ {
+ bin_one++;
+ }
+ else
+ {
+ bin_zero++;
+ }
+ }
+ // Check distribution
+ DALI_TEST_EQUALS((float)bin_zero / (float)bin_one, 1.0f, 0.1f, TEST_LOCATION);
+
+ bin_zero=0; bin_one = 0;
+ for(size_t i=0; i<100000; i++)
+ {
+ bool chance = Dali::Random::Chance(0.25);
+ if(chance) {bin_one++;} else {bin_zero++;}
+ }
+ // Check distribution
+ DALI_TEST_EQUALS((float)bin_zero / (float)bin_one, 3.0f, 0.1f, TEST_LOCATION);
+
+ bin_zero=0; bin_one = 0;
+ for(size_t i=0; i<100000; i++)
+ {
+ bool chance = Dali::Random::Chance(0.1);
+ if(chance) {bin_one++;} else {bin_zero++;}
+ }
+ // Check distribution
+ DALI_TEST_EQUALS((float)bin_zero / (float)bin_one, 9.0f, 0.1f, TEST_LOCATION);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+namespace
+{
+// The functor to be used in the hit-test algorithm to check whether the actor is hittable.
+bool IsActorHittableFunction(Actor actor, Dali::HitTestAlgorithm::TraverseType type)
+{
+ bool hittable = false;
+
+ switch (type)
+ {
+ case Dali::HitTestAlgorithm::CHECK_ACTOR:
+ {
+ // Check whether the actor is visible and not fully transparent.
+ if( actor.IsVisible()
+ && actor.GetCurrentWorldColor().a > 0.01f) // not FULLY_TRANSPARENT
+ {
+
+ hittable = true;
+ }
+ break;
+ }
+ case Dali::HitTestAlgorithm::DESCEND_ACTOR_TREE:
+ {
+ if( actor.IsVisible() ) // Actor is visible, if not visible then none of its children are visible.
+ {
+ hittable = true;
+ }
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ return hittable;
+};
+
+} // anonymous namespace
+
+
+int UtcDaliRenderTaskSetScreenToFrameBufferMappingActor(void)
+{
+ TestApplication application;
+ tet_infoline("Testing RenderTask::SetScreenToFrameBufferMappingActor ");
+
+ Stage stage = Stage::GetCurrent();
+ Size stageSize = stage.GetSize();
+ Actor mappingActor = Actor::New();
+ Vector2 scale( 0.6f, 0.75f);
+ Vector2 offset( stageSize.x*0.1f, stageSize.y*0.15f);
+ mappingActor.SetSize( stageSize * scale );
+ mappingActor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+ mappingActor.SetPosition( offset.x, offset.y );
+ stage.Add( mappingActor );
+
+ Actor offscreenActor = Actor::New();
+ offscreenActor.SetSize( stageSize );
+ offscreenActor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+ stage.Add( offscreenActor );
+
+ RenderTaskList taskList = stage.GetRenderTaskList();
+ RenderTask renderTask = taskList.CreateTask();
+ FrameBufferImage frameBufferImage = FrameBufferImage::New(stageSize.width*scale.x, stageSize.height*scale.y, Pixel::A8, Image::Never);
+ renderTask.SetSourceActor( offscreenActor );
+ renderTask.SetExclusive( true );
+ renderTask.SetInputEnabled( true );
+ renderTask.SetTargetFrameBuffer( frameBufferImage );
+ renderTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
+ renderTask.SetScreenToFrameBufferMappingActor( mappingActor );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ Vector2 screenCoordinates( stageSize.x * 0.05f, stageSize.y * 0.05f );
+ Dali::HitTestAlgorithm::Results results;
+ Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction );
+ DALI_TEST_CHECK( !results.actor);
+ DALI_TEST_EQUALS( Vector2::ZERO, results.actorCoordinates, 0.1f, TEST_LOCATION );
+
+ screenCoordinates.x = stageSize.x * 0.265f;
+ screenCoordinates.y = stageSize.y * 0.33f;
+ results.actor = Actor();
+ results.actorCoordinates = Vector2::ZERO;
+ Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction );
+ DALI_TEST_CHECK( results.actor == offscreenActor);
+ DALI_TEST_EQUALS( (screenCoordinates-offset)/scale , results.actorCoordinates, 0.1f, TEST_LOCATION );
+
+ screenCoordinates.x = stageSize.x * 0.435f;
+ screenCoordinates.y = stageSize.y * 0.52f;
+ Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction );
+ DALI_TEST_CHECK( results.actor == offscreenActor);
+ DALI_TEST_EQUALS( (screenCoordinates-offset)/scale , results.actorCoordinates, 0.1f, TEST_LOCATION );
+
+ screenCoordinates.x = stageSize.x * 0.65f;
+ screenCoordinates.y = stageSize.y * 0.95f;
+ Dali::HitTestAlgorithm::HitTest( renderTask, screenCoordinates, results, IsActorHittableFunction );
+ DALI_TEST_CHECK( !results.actor);
+ DALI_TEST_EQUALS( Vector2::ZERO, results.actorCoordinates, 0.1f, TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+using namespace Dali::Scripting;
+
+namespace
+{
+
+struct StringEnum
+{
+ const char * string;
+ int value;
+};
+
+const StringEnum COLOR_MODE_VALUES[] =
+{
+ { "USE_OWN_COLOR", USE_OWN_COLOR },
+ { "USE_PARENT_COLOR", USE_PARENT_COLOR },
+ { "USE_OWN_MULTIPLY_PARENT_COLOR", USE_OWN_MULTIPLY_PARENT_COLOR },
+ { "USE_OWN_MULTIPLY_PARENT_ALPHA", USE_OWN_MULTIPLY_PARENT_ALPHA },
+};
+const unsigned int COLOR_MODE_VALUES_COUNT = sizeof( COLOR_MODE_VALUES ) / sizeof( COLOR_MODE_VALUES[0] );
+
+const StringEnum POSITION_INHERITANCE_MODE_VALUES[] =
+{
+ { "INHERIT_PARENT_POSITION", INHERIT_PARENT_POSITION },
+ { "USE_PARENT_POSITION", USE_PARENT_POSITION },
+ { "USE_PARENT_POSITION_PLUS_LOCAL_POSITION", USE_PARENT_POSITION_PLUS_LOCAL_POSITION },
+ { "DONT_INHERIT_POSITION", DONT_INHERIT_POSITION },
+};
+const unsigned int POSITION_INHERITANCE_MODE_VALUES_COUNT = sizeof( POSITION_INHERITANCE_MODE_VALUES ) / sizeof( POSITION_INHERITANCE_MODE_VALUES[0] );
+
+const StringEnum DRAW_MODE_VALUES[] =
+{
+ { "NORMAL", DrawMode::NORMAL },
+ { "OVERLAY", DrawMode::OVERLAY },
+ { "STENCIL", DrawMode::STENCIL },
+};
+const unsigned int DRAW_MODE_VALUES_COUNT = sizeof( DRAW_MODE_VALUES ) / sizeof( DRAW_MODE_VALUES[0] );
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Helpers for string to enum comparisons for Image and ImageAttributes
+//////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Template to check enumerations of type T, with a class of type X
+ */
+template< typename T, typename X >
+void TestEnumStrings(
+ Property::Map& map, // The map used to create instance of type X
+ const StringEnum* values, // An array of string values
+ unsigned int num, // Number of items in the array
+ T ( X::*method )() const, // The member method of X to call to get the enum
+ X ( *creator ) ( const Property::Value& ) // The method which creates an instance of type X
+)
+{
+ Property::Map::iterator iter = map.end() - 1;
+ for ( unsigned int i = 0; i < num; ++i )
+ {
+ iter->second = values[i].string;
+ tet_printf("Checking: %s: %s\n", iter->first.c_str(), values[i].string );
+ X instance = creator( map );
+ DALI_TEST_EQUALS( values[i].value, ( instance.*method )(), TEST_LOCATION );
+ }
+}
+
+/// Helper method to create ImageAttributes using an Image
+ImageAttributes NewImageAttributes( const Property::Value& map )
+{
+ Image image = NewImage( map );
+ return image.GetAttributes();
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Helpers for string to enum comparisons for Actor to Property::Map
+//////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Template to check enumerations of type T
+ */
+template< typename T >
+void TestEnumStrings(
+ const char * const keyName, // The name of the key to check
+ TestApplication& application, // Reference to the application class
+ const StringEnum* values, // An array of string values
+ unsigned int num, // Number of items in the array
+ void ( Actor::*method )( T ) // The Actor member method to set the enumeration
+)
+{
+ for ( unsigned int i = 0; i < num; ++i )
+ {
+ tet_printf("Checking: %s: %s\n", keyName, values[i].string );
+
+ Actor actor = Actor::New();
+ (actor.*method)( ( T ) values[i].value );
+
+ Stage::GetCurrent().Add( actor );
+ application.SendNotification();
+ application.Render();
+
+ Property::Map map;
+ CreatePropertyMap( actor, map );
+
+ DALI_TEST_CHECK( !map.empty() );
+ Property::Value value( map );
+ DALI_TEST_CHECK( value.HasKey( keyName ) );
+ DALI_TEST_EQUALS( value.GetValue( keyName ).Get< std::string >(), values[i].string, TEST_LOCATION );
+
+ Stage::GetCurrent().Remove( actor );
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+
+} // anon namespace
+
+
+
+int UtcDaliScriptingGetColorMode(void)
+{
+ TestApplication application;
+
+ for ( unsigned int i = 0; i < COLOR_MODE_VALUES_COUNT; ++i )
+ {
+ tet_printf( "Checking %s == %d\n", COLOR_MODE_VALUES[i].string, COLOR_MODE_VALUES[i].value );
+ DALI_TEST_EQUALS( COLOR_MODE_VALUES[i].value, GetColorMode( COLOR_MODE_VALUES[i].string ), TEST_LOCATION );
+ DALI_TEST_EQUALS( COLOR_MODE_VALUES[i].string, GetColorMode( (ColorMode) COLOR_MODE_VALUES[i].value ), TEST_LOCATION );
+ }
+
+ try
+ {
+ (void)GetColorMode("INVALID_ARG");
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "!\"Unknown", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliScriptingGetPositionInheritanceMode(void)
+{
+ TestApplication application;
+
+ for ( unsigned int i = 0; i < POSITION_INHERITANCE_MODE_VALUES_COUNT; ++i )
+ {
+ tet_printf( "Checking %s == %d\n", POSITION_INHERITANCE_MODE_VALUES[i].string, POSITION_INHERITANCE_MODE_VALUES[i].value );
+ DALI_TEST_EQUALS( POSITION_INHERITANCE_MODE_VALUES[i].value, GetPositionInheritanceMode( POSITION_INHERITANCE_MODE_VALUES[i].string ), TEST_LOCATION );
+ DALI_TEST_EQUALS( POSITION_INHERITANCE_MODE_VALUES[i].string, GetPositionInheritanceMode( (PositionInheritanceMode) POSITION_INHERITANCE_MODE_VALUES[i].value ), TEST_LOCATION );
+ }
+
+ try
+ {
+ (void)GetPositionInheritanceMode("INVALID_ARG");
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "!\"Unknown", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+
+int UtcDaliScriptingGetDrawMode(void)
+{
+ TestApplication application;
+
+ for ( unsigned int i = 0; i < DRAW_MODE_VALUES_COUNT; ++i )
+ {
+ tet_printf( "Checking %s == %d\n", DRAW_MODE_VALUES[i].string, DRAW_MODE_VALUES[i].value );
+ DALI_TEST_EQUALS( DRAW_MODE_VALUES[i].value, GetDrawMode( DRAW_MODE_VALUES[i].string ), TEST_LOCATION );
+ DALI_TEST_EQUALS( DRAW_MODE_VALUES[i].string, GetDrawMode( (DrawMode::Type) DRAW_MODE_VALUES[i].value ), TEST_LOCATION );
+ }
+
+ try
+ {
+ (void)GetDrawMode("INVALID_ARG");
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "!\"Unknown", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliScriptingGetAnchorConstant(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( Dali::ParentOrigin::BACK_TOP_LEFT, GetAnchorConstant( "BACK_TOP_LEFT" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::BACK_TOP_CENTER, GetAnchorConstant( "BACK_TOP_CENTER" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::BACK_TOP_RIGHT, GetAnchorConstant( "BACK_TOP_RIGHT" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::BACK_CENTER_LEFT, GetAnchorConstant( "BACK_CENTER_LEFT" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::BACK_CENTER, GetAnchorConstant( "BACK_CENTER" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::BACK_CENTER_RIGHT, GetAnchorConstant( "BACK_CENTER_RIGHT" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::BACK_BOTTOM_LEFT, GetAnchorConstant( "BACK_BOTTOM_LEFT" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::BACK_BOTTOM_CENTER, GetAnchorConstant( "BACK_BOTTOM_CENTER" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::BACK_BOTTOM_RIGHT, GetAnchorConstant( "BACK_BOTTOM_RIGHT" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::TOP_LEFT, GetAnchorConstant( "TOP_LEFT" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::TOP_CENTER, GetAnchorConstant( "TOP_CENTER" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::TOP_RIGHT, GetAnchorConstant( "TOP_RIGHT" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::CENTER_LEFT, GetAnchorConstant( "CENTER_LEFT" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::CENTER, GetAnchorConstant( "CENTER" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::CENTER_RIGHT, GetAnchorConstant( "CENTER_RIGHT" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::BOTTOM_LEFT, GetAnchorConstant( "BOTTOM_LEFT" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::BOTTOM_CENTER, GetAnchorConstant( "BOTTOM_CENTER" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::BOTTOM_RIGHT, GetAnchorConstant( "BOTTOM_RIGHT" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::FRONT_TOP_LEFT, GetAnchorConstant( "FRONT_TOP_LEFT" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::FRONT_TOP_CENTER, GetAnchorConstant( "FRONT_TOP_CENTER" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::FRONT_TOP_RIGHT, GetAnchorConstant( "FRONT_TOP_RIGHT" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::FRONT_CENTER_LEFT, GetAnchorConstant( "FRONT_CENTER_LEFT" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::FRONT_CENTER, GetAnchorConstant( "FRONT_CENTER" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::FRONT_CENTER_RIGHT, GetAnchorConstant( "FRONT_CENTER_RIGHT" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::FRONT_BOTTOM_LEFT, GetAnchorConstant( "FRONT_BOTTOM_LEFT" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::FRONT_BOTTOM_CENTER, GetAnchorConstant( "FRONT_BOTTOM_CENTER" ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Dali::ParentOrigin::FRONT_BOTTOM_RIGHT, GetAnchorConstant( "FRONT_BOTTOM_RIGHT" ), TEST_LOCATION );
+
+ try
+ {
+ (void)GetAnchorConstant("INVALID_ARG");
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "!\"Unknown", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliScriptingNewImageNegative(void)
+{
+ TestApplication application;
+
+ // Invalid filename
+ try
+ {
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "filename", Vector3::ZERO ) );
+ Image image = NewImage( map );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "map.GetValue(field).GetType()", TEST_LOCATION );
+ }
+
+ // Invalid load-policy
+ try
+ {
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "load-policy", Vector3::ZERO ) );
+ Image image = NewImage( map );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "map.GetValue(field).GetType()", TEST_LOCATION );
+
+ // Invalid value
+ try
+ {
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "load-policy", "INVALID" ) );
+ Image image = NewImage( map );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "!\"Unknown", TEST_LOCATION );
+ }
+ }
+
+ // Invalid release-policy
+ try
+ {
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "release-policy", Vector3::ZERO ) );
+ Image image = NewImage( map );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "map.GetValue(field).GetType()", TEST_LOCATION );
+
+ // Invalid value
+ try
+ {
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "release-policy", "INVALID" ) );
+ Image image = NewImage( map );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "!\"Unknown", TEST_LOCATION );
+ }
+ }
+
+ // Invalid width
+ try
+ {
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "width", "Invalid" ) );
+ map.push_back( Property::StringValuePair( "height", "Invalid" ) );
+ Image image = NewImage( map );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "value.GetType()", TEST_LOCATION );
+ }
+
+ // Invalid height
+ try
+ {
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "width", 10 ) );
+ map.push_back( Property::StringValuePair( "height", "Invalid" ) );
+ Image image = NewImage( map );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "value.GetType()", TEST_LOCATION );
+ }
+
+ // Invalid pixel-format
+ try
+ {
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "pixel-format", Vector3::ZERO ) );
+ Image image = NewImage( map );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "map.GetValue(field).GetType()", TEST_LOCATION );
+
+ // Invalid value
+ try
+ {
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "pixel-format", "INVALID" ) );
+ Image image = NewImage( map );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "!\"Unknown", TEST_LOCATION );
+ }
+ }
+
+ // Invalid scaling-mode
+ try
+ {
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "scaling-mode", Vector3::ZERO ) );
+ Image image = NewImage( map );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "map.GetValue(field).GetType()", TEST_LOCATION );
+
+ // Invalid value
+ try
+ {
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "scaling-mode", "INVALID" ) );
+ Image image = NewImage( map );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "!\"Unknown", TEST_LOCATION );
+ }
+ }
+
+ // Invalid crop
+ try
+ {
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "crop", "Invalid" ) );
+ Image image = NewImage( map );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "map.GetValue(field).GetType()", TEST_LOCATION );
+ }
+
+ // Invalid type
+ try
+ {
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "type", Vector3::ZERO ) );
+ Image image = NewImage( map );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "map.GetValue(\"type\").GetType()", TEST_LOCATION );
+
+ // Invalid value
+ try
+ {
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "type", "INVALID" ) );
+ Image image = NewImage( map );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "!\"Unknown", TEST_LOCATION );
+ }
+ }
+ END_TEST;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+
+int UtcDaliScriptingNewImage(void)
+{
+ TestApplication application;
+
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "filename", "TEST_FILE" ) );
+
+ // Filename only
+ {
+ Image image = NewImage( map );
+ DALI_TEST_EQUALS( "TEST_FILE", image.GetFilename(), TEST_LOCATION );
+ }
+
+ // load-policy
+ map.push_back( Property::StringValuePair( "load-policy", "" ) );
+ {
+ const StringEnum values[] =
+ {
+ { "IMMEDIATE", Image::Immediate },
+ { "ON_DEMAND", Image::OnDemand }
+ };
+ TestEnumStrings< Image::LoadPolicy, Image >( map, values, ( sizeof( values ) / sizeof ( values[0] ) ), &Image::GetLoadPolicy, &NewImage );
+ }
+
+ // release-policy
+ map.push_back( Property::StringValuePair( "release-policy", "" ) );
+ {
+ const StringEnum values[] =
+ {
+ { "UNUSED", Image::Unused },
+ { "NEVER", Image::Never }
+ };
+ TestEnumStrings< Image::ReleasePolicy, Image >( map, values, ( sizeof( values ) / sizeof ( values[0] ) ), &Image::GetReleasePolicy, &NewImage );
+ }
+
+ // float width and height
+ map.push_back( Property::StringValuePair( "width", (float) 10.0f ) );
+ map.push_back( Property::StringValuePair( "height", (float) 20.0f ) );
+ {
+ Image image = NewImage( map );
+ DALI_TEST_EQUALS( image.GetWidth(), 10.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( image.GetHeight(), 20.0f, TEST_LOCATION );
+ }
+
+ // int width and height
+ map.erase( map.end() - 2, map.end() );
+ map.push_back( Property::StringValuePair( "width", 50 ) );
+ map.push_back( Property::StringValuePair( "height", 70 ) );
+ {
+ Image image = NewImage( map );
+ DALI_TEST_EQUALS( image.GetWidth(), 50u, TEST_LOCATION );
+ DALI_TEST_EQUALS( image.GetHeight(), 70u, TEST_LOCATION );
+ }
+
+ //map.erase( map.end() - 2, map.end() );
+
+ // pixel-format
+ map.push_back( Property::StringValuePair( "pixel-format", "" ) );
+ {
+ const StringEnum values[] =
+ {
+ { "A8", Pixel::A8 },
+ { "L8", Pixel::L8 },
+ { "LA88", Pixel::LA88 },
+ { "RGB565", Pixel::RGB565 },
+ { "BGR565", Pixel::BGR565 },
+ { "RGBA4444", Pixel::RGBA4444 },
+ { "BGRA4444", Pixel::BGRA4444 },
+ { "RGBA5551", Pixel::RGBA5551 },
+ { "BGRA5551", Pixel::BGRA5551 },
+ { "RGB888", Pixel::RGB888 },
+ { "RGB8888", Pixel::RGB8888 },
+ { "BGR8888", Pixel::BGR8888 },
+ { "RGBA8888", Pixel::RGBA8888 },
+ { "BGRA8888", Pixel::BGRA8888 },
+ { "COMPRESSED_R11_EAC", Pixel::COMPRESSED_R11_EAC },
+ { "COMPRESSED_SIGNED_R11_EAC", Pixel::COMPRESSED_SIGNED_R11_EAC },
+ { "COMPRESSED_RG11_EAC", Pixel::COMPRESSED_RG11_EAC },
+ { "COMPRESSED_SIGNED_RG11_EAC", Pixel::COMPRESSED_SIGNED_RG11_EAC },
+ { "COMPRESSED_RGB8_ETC2", Pixel::COMPRESSED_RGB8_ETC2 },
+ { "COMPRESSED_SRGB8_ETC2", Pixel::COMPRESSED_SRGB8_ETC2 },
+ { "COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2", Pixel::COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 },
+ { "COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2", Pixel::COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 },
+ { "COMPRESSED_RGBA8_ETC2_EAC", Pixel::COMPRESSED_RGBA8_ETC2_EAC },
+ { "COMPRESSED_SRGB8_ALPHA8_ETC2_EAC", Pixel::COMPRESSED_SRGB8_ALPHA8_ETC2_EAC },
+ { "COMPRESSED_RGB8_ETC1", Pixel::COMPRESSED_RGB8_ETC1 },
+ { "COMPRESSED_RGB_PVRTC_4BPPV1", Pixel::COMPRESSED_RGB_PVRTC_4BPPV1 },
+ { "A8", Pixel::A8 }, // Checked already but reset so that BitmapImage works
+ };
+ TestEnumStrings< Pixel::Format, ImageAttributes >( map, values, ( sizeof( values ) / sizeof ( values[0] ) ), &ImageAttributes::GetPixelFormat, &NewImageAttributes );
+ }
+
+ // scaling-mode
+ map.push_back( Property::StringValuePair( "scaling-mode", "" ) );
+ {
+ const StringEnum values[] =
+ {
+ { "SHRINK_TO_FIT", ImageAttributes::ShrinkToFit },
+ { "SCALE_TO_FILL", ImageAttributes::ScaleToFill },
+ { "FIT_WIDTH", ImageAttributes::FitWidth },
+ { "FIT_HEIGHT", ImageAttributes::FitHeight },
+ };
+ TestEnumStrings< ImageAttributes::ScalingMode, ImageAttributes >( map, values, ( sizeof( values ) / sizeof ( values[0] ) ), &ImageAttributes::GetScalingMode, &NewImageAttributes );
+ }
+
+ // crop
+ map.push_back( Property::StringValuePair( "crop", Vector4( 50, 60, 70, 80 ) ) );
+ {
+ Image image = NewImage( map );
+ ImageAttributes attributes = image.GetAttributes();
+ Rect<float> crop = attributes.GetCrop();
+ DALI_TEST_EQUALS( crop.x, 50, TEST_LOCATION );
+ DALI_TEST_EQUALS( crop.y, 60, TEST_LOCATION );
+ DALI_TEST_EQUALS( crop.width, 70, TEST_LOCATION );
+ DALI_TEST_EQUALS( crop.height, 80, TEST_LOCATION );
+ }
+
+ // type FrameBufferImage
+ map.push_back( Property::StringValuePair( "type", "FrameBufferImage" ) );
+ {
+ Image image = NewImage( map );
+ DALI_TEST_CHECK( FrameBufferImage::DownCast( image ) );
+ }
+ // type BitMapImage
+ (map.end() - 1)->second = "BitmapImage";
+ {
+ Image image = NewImage( map );
+ DALI_TEST_CHECK( BitmapImage::DownCast( image ) );
+ }
+ // type Image
+ (map.end() - 1)->second = "Image";
+ {
+ Image image = NewImage( map );
+ DALI_TEST_CHECK( Image::DownCast( image ) );
+ DALI_TEST_CHECK( !FrameBufferImage::DownCast( image ) );
+ DALI_TEST_CHECK( !BitmapImage::DownCast( image ) );
+ }
+ END_TEST;
+}
+
+int UtcDaliScriptingNewShaderEffect(void)
+{
+ TestApplication application;
+
+ Property::Map programMap;
+ programMap.push_back( Property::StringValuePair( "vertex-filename", "bump.vert" ) );
+ programMap.push_back( Property::StringValuePair( "fragment-filename", "bump.frag" ) );
+
+ Property::Map imageMap;
+ imageMap.push_back( Property::StringValuePair( "filename", "image.png" ) );
+
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "image", imageMap ) );
+ map.push_back( Property::StringValuePair( "program", programMap ) );
+ map.push_back( Property::StringValuePair( "uLightPosition", Vector3( 0.0, 0.0, -1.5) ) );
+ map.push_back( Property::StringValuePair( "uAmbientLight", (int)10 ) );
+
+ ShaderEffect shader = NewShaderEffect( map );
+
+ DALI_TEST_CHECK( shader );
+ END_TEST;
+}
+
+int UtcDaliScriptingNewActorNegative(void)
+{
+ TestApplication application;
+
+ // Empty map
+ {
+ Actor handle = NewActor( Property::Map() );
+ DALI_TEST_CHECK( !handle );
+ }
+
+ // Map with only properties
+ {
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "parent-origin", ParentOrigin::TOP_CENTER ) );
+ map.push_back( Property::StringValuePair( "anchor-point", AnchorPoint::TOP_CENTER ) );
+ Actor handle = NewActor( map );
+ DALI_TEST_CHECK( !handle );
+ }
+
+ // Add some signals to the map, we should have no signal connections as its not yet supported
+ {
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "type", "Actor" ) );
+ map.push_back( Property::StringValuePair( "signals", Property::MAP ) );
+ Actor handle = NewActor( map );
+ DALI_TEST_CHECK( handle );
+ DALI_TEST_CHECK( !handle.MouseWheelEventSignal().GetConnectionCount() );
+ DALI_TEST_CHECK( !handle.OffStageSignal().GetConnectionCount() );
+ DALI_TEST_CHECK( !handle.OnStageSignal().GetConnectionCount() );
+ DALI_TEST_CHECK( !handle.SetSizeSignal().GetConnectionCount() );
+ DALI_TEST_CHECK( !handle.TouchedSignal().GetConnectionCount() );
+ }
+ END_TEST;
+}
+
+int UtcDaliScriptingNewActorProperties(void)
+{
+ TestApplication application;
+
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "type", "Actor" ) );
+ map.push_back( Property::StringValuePair( "size", Vector3::ONE ) );
+ map.push_back( Property::StringValuePair( "position", Vector3::XAXIS ) );
+ map.push_back( Property::StringValuePair( "scale", Vector3::ONE ) );
+ map.push_back( Property::StringValuePair( "visible", false ) );
+ map.push_back( Property::StringValuePair( "color", Color::MAGENTA ) );
+ map.push_back( Property::StringValuePair( "name", "MyActor" ) );
+ map.push_back( Property::StringValuePair( "color-mode", "USE_PARENT_COLOR" ) );
+ map.push_back( Property::StringValuePair( "inherit-shader-effect", false ) );
+ map.push_back( Property::StringValuePair( "sensitive", false ) );
+ map.push_back( Property::StringValuePair( "leave-required", true ) );
+ map.push_back( Property::StringValuePair( "position-inheritance", "DONT_INHERIT_POSITION" ) );
+ map.push_back( Property::StringValuePair( "draw-mode", "STENCIL" ) );
+ map.push_back( Property::StringValuePair( "inherit-rotation", false ) );
+ map.push_back( Property::StringValuePair( "inherit-scale", false ) );
+
+ // Default properties
+ {
+ Actor handle = NewActor( map );
+ DALI_TEST_CHECK( handle );
+
+ Stage::GetCurrent().Add( handle );
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( handle.GetCurrentSize(), Vector3::ONE, TEST_LOCATION );
+ DALI_TEST_EQUALS( handle.GetCurrentPosition(), Vector3::XAXIS, TEST_LOCATION );
+ DALI_TEST_EQUALS( handle.GetCurrentScale(), Vector3::ONE, TEST_LOCATION );
+ DALI_TEST_EQUALS( handle.IsVisible(), false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handle.GetCurrentColor(), Color::MAGENTA, TEST_LOCATION );
+ DALI_TEST_EQUALS( handle.GetName(), "MyActor", TEST_LOCATION );
+ DALI_TEST_EQUALS( handle.GetColorMode(), USE_PARENT_COLOR, TEST_LOCATION );
+ DALI_TEST_EQUALS( handle.GetInheritShaderEffect(), false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handle.IsSensitive(), false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handle.GetLeaveRequired(), true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handle.GetPositionInheritanceMode(), DONT_INHERIT_POSITION, TEST_LOCATION );
+ DALI_TEST_EQUALS( handle.GetDrawMode(), DrawMode::STENCIL, TEST_LOCATION );
+ DALI_TEST_EQUALS( handle.IsRotationInherited(), false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handle.IsScaleInherited(), false, TEST_LOCATION );
+
+ Stage::GetCurrent().Remove( handle );
+ }
+
+ // Check Anchor point and parent origin vector3s
+ map.push_back( Property::StringValuePair( "parent-origin", ParentOrigin::TOP_CENTER ) );
+ map.push_back( Property::StringValuePair( "anchor-point", AnchorPoint::TOP_LEFT ) );
+ {
+ Actor handle = NewActor( map );
+ DALI_TEST_CHECK( handle );
+
+ Stage::GetCurrent().Add( handle );
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( handle.GetCurrentParentOrigin(), ParentOrigin::TOP_CENTER, TEST_LOCATION );
+ DALI_TEST_EQUALS( handle.GetCurrentAnchorPoint(), AnchorPoint::TOP_LEFT, TEST_LOCATION );
+
+ Stage::GetCurrent().Remove( handle );
+ }
+
+ // Check Anchor point and parent origin STRINGS
+ map.erase( map.end() - 2, map.end() ); // delete previously added parent origin and anchor point
+ map.push_back( Property::StringValuePair( "parent-origin", "BACK_TOP_LEFT" ) );
+ map.push_back( Property::StringValuePair( "anchor-point", "FRONT_CENTER_LEFT" ) );
+ {
+ Actor handle = NewActor( map );
+ DALI_TEST_CHECK( handle );
+
+ Stage::GetCurrent().Add( handle );
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( handle.GetCurrentParentOrigin(), ParentOrigin::BACK_TOP_LEFT, TEST_LOCATION );
+ DALI_TEST_EQUALS( handle.GetCurrentAnchorPoint(), AnchorPoint::FRONT_CENTER_LEFT, TEST_LOCATION );
+
+ Stage::GetCurrent().Remove( handle );
+ }
+ END_TEST;
+}
+
+int UtcDaliScriptingNewActorChildren(void)
+{
+ TestApplication application;
+
+ Property::Map map;
+ map.push_back( Property::StringValuePair( "type", "Actor" ) );
+ map.push_back( Property::StringValuePair( "position", Vector3::XAXIS ) );
+
+ Property::Map child1Map;
+ child1Map.push_back( Property::StringValuePair( "type", "ImageActor" ) );
+ child1Map.push_back( Property::StringValuePair( "position", Vector3::YAXIS ) );
+
+ Property::Map child2Map;
+ child2Map.push_back( Property::StringValuePair( "type", "TextActor" ) );
+ child2Map.push_back( Property::StringValuePair( "position", Vector3::ZAXIS ) );
+
+ Property::Map grandChildMap;
+ grandChildMap.push_back( Property::StringValuePair( "type", "LightActor" ) );
+ grandChildMap.push_back( Property::StringValuePair( "position", Vector3::ONE ) );
+
+ // Add arrays to appropriate maps
+ Property::Array grandChildArray;
+ grandChildArray.push_back( grandChildMap );
+ Property::Array childArray;
+ child1Map.push_back( Property::StringValuePair( "actors", grandChildArray ) );
+ childArray.push_back( child1Map );
+ childArray.push_back( child2Map );
+ map.push_back( Property::StringValuePair( "actors", childArray ) );
+
+ // Create
+ Actor handle = NewActor( map );
+ DALI_TEST_CHECK( handle );
+
+ Stage::GetCurrent().Add( handle );
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( handle.GetCurrentPosition(), Vector3::XAXIS, TEST_LOCATION );
+ DALI_TEST_EQUALS( handle.GetChildCount(), 2u, TEST_LOCATION );
+
+ Actor child1 = handle.GetChildAt(0);
+ DALI_TEST_CHECK( child1 );
+ DALI_TEST_CHECK( ImageActor::DownCast( child1 ) );
+ DALI_TEST_EQUALS( child1.GetCurrentPosition(), Vector3::YAXIS, TEST_LOCATION );
+ DALI_TEST_EQUALS( child1.GetChildCount(), 1u, TEST_LOCATION );
+
+ Actor child2 = handle.GetChildAt(1);
+ DALI_TEST_CHECK( child2 );
+ DALI_TEST_CHECK( TextActor::DownCast( child2 ) );
+ DALI_TEST_EQUALS( child2.GetCurrentPosition(), Vector3::ZAXIS, TEST_LOCATION );
+ DALI_TEST_EQUALS( child2.GetChildCount(), 0u, TEST_LOCATION );
+
+ Actor grandChild = child1.GetChildAt( 0 );
+ DALI_TEST_CHECK( grandChild );
+ DALI_TEST_CHECK( LightActor::DownCast( grandChild ) );
+ DALI_TEST_EQUALS( grandChild.GetCurrentPosition(), Vector3::ONE, TEST_LOCATION );
+ DALI_TEST_EQUALS( grandChild.GetChildCount(), 0u, TEST_LOCATION );
+
+ Stage::GetCurrent().Remove( handle );
+ END_TEST;
+}
+
+
+int UtcDaliScriptingCreatePropertyMapActor(void)
+{
+ TestApplication application;
+
+ // Actor Type
+ {
+ Actor actor = Actor::New();
+
+ Property::Map map;
+ CreatePropertyMap( actor, map );
+ DALI_TEST_CHECK( !map.empty() );
+ Property::Value value( map );
+ DALI_TEST_CHECK( value.HasKey( "type" ) );
+ DALI_TEST_EQUALS( value.GetValue( "type").Get< std::string >(), "Actor", TEST_LOCATION );
+
+ Stage::GetCurrent().Remove( actor );
+ }
+
+ // ImageActor Type
+ {
+ Actor actor = ImageActor::New();
+
+ Property::Map map;
+ CreatePropertyMap( actor, map );
+ DALI_TEST_CHECK( !map.empty() );
+ Property::Value value( map );
+ DALI_TEST_CHECK( value.HasKey( "type" ) );
+ DALI_TEST_EQUALS( value.GetValue( "type").Get< std::string >(), "ImageActor", TEST_LOCATION );
+
+ Stage::GetCurrent().Remove( actor );
+ }
+
+ // Default properties
+ {
+ Actor actor = Actor::New();
+ actor.SetSize( Vector3::ONE );
+ actor.SetPosition( Vector3::XAXIS );
+ actor.SetScale( Vector3::ZAXIS );
+ actor.SetVisible( false );
+ actor.SetColor( Color::MAGENTA );
+ actor.SetName( "MyActor" );
+ actor.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
+ actor.SetParentOrigin( ParentOrigin::TOP_RIGHT );
+ actor.SetInheritShaderEffect( false );
+ actor.SetSensitive( false );
+ actor.SetLeaveRequired( true );
+ actor.SetInheritRotation( false );
+ actor.SetInheritScale( false );
+
+ Stage::GetCurrent().Add( actor );
+ application.SendNotification();
+ application.Render();
+
+ Property::Map map;
+ CreatePropertyMap( actor, map );
+
+ DALI_TEST_CHECK( !map.empty() );
+ Property::Value value( map );
+ DALI_TEST_CHECK( value.HasKey( "size" ) );
+ DALI_TEST_EQUALS( value.GetValue( "size" ).Get< Vector3 >(), Vector3::ONE, TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "position" ) );
+ DALI_TEST_EQUALS( value.GetValue( "position" ).Get< Vector3 >(), Vector3::XAXIS, TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "scale" ) );
+ DALI_TEST_EQUALS( value.GetValue( "scale" ).Get< Vector3 >(), Vector3::ZAXIS, TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "visible" ) );
+ DALI_TEST_EQUALS( value.GetValue( "visible" ).Get< bool >(), false, TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "color" ) );
+ DALI_TEST_EQUALS( value.GetValue( "color" ).Get< Vector4 >(), Color::MAGENTA, TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "name" ) );
+ DALI_TEST_EQUALS( value.GetValue( "name").Get< std::string >(), "MyActor", TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "anchor-point" ) );
+ DALI_TEST_EQUALS( value.GetValue( "anchor-point" ).Get< Vector3 >(), AnchorPoint::CENTER_LEFT, TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "parent-origin" ) );
+ DALI_TEST_EQUALS( value.GetValue( "parent-origin" ).Get< Vector3 >(), ParentOrigin::TOP_RIGHT, TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "inherit-shader-effect" ) );
+ DALI_TEST_EQUALS( value.GetValue( "inherit-shader-effect" ).Get< bool >(), false, TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "sensitive" ) );
+ DALI_TEST_EQUALS( value.GetValue( "sensitive" ).Get< bool >(), false, TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "leave-required" ) );
+ DALI_TEST_EQUALS( value.GetValue( "leave-required" ).Get< bool >(), true, TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "inherit-rotation" ) );
+ DALI_TEST_EQUALS( value.GetValue( "inherit-rotation" ).Get< bool >(), false, TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "inherit-scale" ) );
+ DALI_TEST_EQUALS( value.GetValue( "inherit-scale" ).Get< bool >(), false, TEST_LOCATION );
+
+ Stage::GetCurrent().Remove( actor );
+ }
+
+ // ColorMode
+ TestEnumStrings< ColorMode >( "color-mode", application, COLOR_MODE_VALUES, COLOR_MODE_VALUES_COUNT, &Actor::SetColorMode );
+
+ // PositionInheritanceMode
+ TestEnumStrings< PositionInheritanceMode >( "position-inheritance", application, POSITION_INHERITANCE_MODE_VALUES, POSITION_INHERITANCE_MODE_VALUES_COUNT, &Actor::SetPositionInheritanceMode );
+
+ // DrawMode
+ TestEnumStrings< DrawMode::Type >( "draw-mode", application, DRAW_MODE_VALUES, DRAW_MODE_VALUES_COUNT, &Actor::SetDrawMode );
+
+ // Children
+ {
+ Actor actor = Actor::New();
+ Actor child = ImageActor::New();
+ Actor grandChild = TextActor::New();
+ Actor grandChild2 = LightActor::New();
+ actor.Add( child );
+ child.Add( grandChild );
+ child.Add( grandChild2 );
+
+ Stage::GetCurrent().Add( actor );
+ application.SendNotification();
+ application.Render();
+
+ Property::Map map;
+ CreatePropertyMap( actor, map );
+ DALI_TEST_CHECK( !map.empty() );
+
+ Property::Value value( map );
+ DALI_TEST_CHECK( value.HasKey( "type" ) );
+ DALI_TEST_EQUALS( value.GetValue( "type" ).Get< std::string >(), "Actor", TEST_LOCATION );
+
+ DALI_TEST_CHECK( value.HasKey( "actors" ) );
+ Property::Array children( value.GetValue( "actors").Get< Property::Array >() );
+ DALI_TEST_CHECK( !children.empty() );
+ Property::Map childMap( children[0].Get< Property::Map >() );
+ DALI_TEST_CHECK( !childMap.empty() );
+ Property::Value childValue( childMap );
+ DALI_TEST_CHECK( childValue.HasKey( "type" ) );
+ DALI_TEST_EQUALS( childValue.GetValue( "type" ).Get< std::string >(), "ImageActor", TEST_LOCATION );
+
+ DALI_TEST_CHECK( childValue.HasKey( "actors" ) );
+ Property::Array grandChildren( childValue.GetValue( "actors").Get< Property::Array >() );
+ DALI_TEST_CHECK( grandChildren.size() == 2u );
+
+ Property::Map grandChildMap( grandChildren[0].Get< Property::Map >() );
+ DALI_TEST_CHECK( !grandChildMap.empty() );
+ Property::Value grandChildValue( grandChildMap );
+ DALI_TEST_CHECK( grandChildValue.HasKey( "type" ) );
+ DALI_TEST_EQUALS( grandChildValue.GetValue( "type" ).Get< std::string >(), "TextActor", TEST_LOCATION );
+
+ Property::Map grandChild2Map( grandChildren[1].Get< Property::Map >() );
+ DALI_TEST_CHECK( !grandChild2Map.empty() );
+ Property::Value grandChild2Value( grandChild2Map );
+ DALI_TEST_CHECK( grandChild2Value.HasKey( "type" ) );
+ DALI_TEST_EQUALS( grandChild2Value.GetValue( "type" ).Get< std::string >(), "LightActor", TEST_LOCATION );
+
+ Stage::GetCurrent().Remove( actor );
+ }
+ END_TEST;
+}
+
+int UtcDaliScriptingCreatePropertyMapImage(void)
+{
+ TestApplication application;
+
+ // Empty
+ {
+ Image image;
+ Property::Map map;
+ CreatePropertyMap( image, map );
+ DALI_TEST_CHECK( map.empty() );
+ }
+
+ // Default
+ {
+ Image image = Image::New( "MY_PATH" );
+
+ Property::Map map;
+ CreatePropertyMap( image, map );
+ DALI_TEST_CHECK( !map.empty() );
+
+ Property::Value value( map );
+ DALI_TEST_CHECK( value.HasKey( "type" ) );
+ DALI_TEST_EQUALS( value.GetValue( "type" ).Get< std::string >(), "Image", TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "filename" ) );
+ DALI_TEST_EQUALS( value.GetValue( "filename" ).Get< std::string >(), "MY_PATH", TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "load-policy") );
+ DALI_TEST_EQUALS( value.GetValue( "load-policy" ).Get< std::string >(), "IMMEDIATE", TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "release-policy") );
+ DALI_TEST_EQUALS( value.GetValue( "release-policy" ).Get< std::string >(), "NEVER", TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "pixel-format") );
+ DALI_TEST_EQUALS( value.GetValue( "pixel-format" ).Get< std::string >(), "RGBA8888", TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "scaling-mode") );
+ DALI_TEST_EQUALS( value.GetValue( "scaling-mode" ).Get< std::string >(), "SHRINK_TO_FIT", TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "crop" ) );
+ DALI_TEST_EQUALS( value.GetValue( "crop" ).Get< Vector4 >(), Vector4( 0.0f, 0.0f, 1.0f, 1.0f ), TEST_LOCATION );
+ DALI_TEST_CHECK( !value.HasKey( "width" ) );
+ DALI_TEST_CHECK( !value.HasKey( "height" ) );
+ }
+
+ // Change values
+ {
+ ImageAttributes attributes;
+ attributes.SetPixelFormat( Pixel::A8 );
+ attributes.SetScalingMode( ImageAttributes::FitWidth );
+ attributes.SetCrop( Rect< float >( 0.5f, 0.2f, 0.2f, 0.4f ) );
+ attributes.SetSize( 300, 400 );
+ Image image = Image::New( "MY_PATH", attributes, Image::OnDemand, Image::Unused );
+
+ Property::Map map;
+ CreatePropertyMap( image, map );
+ DALI_TEST_CHECK( !map.empty() );
+
+ Property::Value value( map );
+ DALI_TEST_CHECK( value.HasKey( "type" ) );
+ DALI_TEST_EQUALS( value.GetValue( "type" ).Get< std::string >(), "Image", TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "filename" ) );
+ DALI_TEST_EQUALS( value.GetValue( "filename" ).Get< std::string >(), "MY_PATH", TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "load-policy") );
+ DALI_TEST_EQUALS( value.GetValue( "load-policy" ).Get< std::string >(), "ON_DEMAND", TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "release-policy") );
+ DALI_TEST_EQUALS( value.GetValue( "release-policy" ).Get< std::string >(), "UNUSED", TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "pixel-format") );
+ DALI_TEST_EQUALS( value.GetValue( "pixel-format" ).Get< std::string >(), "A8", TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "scaling-mode") );
+ DALI_TEST_EQUALS( value.GetValue( "scaling-mode" ).Get< std::string >(), "FIT_WIDTH", TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "crop" ) );
+ DALI_TEST_EQUALS( value.GetValue( "crop" ).Get< Vector4 >(), Vector4( 0.5f, 0.2f, 0.2f, 0.4f ), TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "width" ) );
+ DALI_TEST_EQUALS( value.GetValue( "width" ).Get< int >(), 300, TEST_LOCATION );
+ DALI_TEST_CHECK( value.HasKey( "height" ) );
+ DALI_TEST_EQUALS( value.GetValue( "height" ).Get< int >(), 400, TEST_LOCATION );
+ }
+
+ // BitmapImage
+ {
+ Image image = BitmapImage::New( 200, 300, Pixel::RGBA8888 );
+ Property::Map map;
+ CreatePropertyMap( image, map );
+ Property::Value value( map );
+ DALI_TEST_CHECK( value.HasKey( "type" ) );
+ DALI_TEST_EQUALS( value.GetValue( "type" ).Get< std::string >(), "BitmapImage", TEST_LOCATION );
+ }
+
+ // FrameBufferImage
+ {
+ Image image = FrameBufferImage::New( 200, 300, Pixel::RGBA8888 );
+ Property::Map map;
+ CreatePropertyMap( image, map );
+ Property::Value value( map );
+ DALI_TEST_CHECK( value.HasKey( "type" ) );
+ DALI_TEST_EQUALS( value.GetValue( "type" ).Get< std::string >(), "FrameBufferImage", TEST_LOCATION );
+ }
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+namespace
+{
+
+static const char* VertexSource =
+"void main()\n"
+"{\n"
+" gl_Position = uProjection * uModelView * vec4(aPosition, 1.0);\n"
+" vTexCoord = aTexCoord;\n"
+"}\n";
+
+static const char* FragmentSource =
+"void main()\n"
+"{\n"
+" gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n"
+"}\n";
+
+static const char* FragmentSourceUsingExtensions =
+"void main()\n"
+"{\n"
+" float floatValue = 0.5f;\n"
+" float test = fwidth(floatValue);\n"
+" gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n"
+" gl_FragColor.a *= test;\n"
+"}\n";
+
+const int GETSOURCE_BUFFER_SIZE = 0x10000;
+
+static const char* TestImageFilename = "icon_wrt.png";
+
+} // Anonymous namespace
+
+
+int UtcDaliShaderEffectFromProperties01(void)
+{
+ TestApplication application;
+ tet_infoline("UtcDaliShaderEffectFromProperties01()");
+
+ std::string fragmentShaderPrefix = "#define TEST_FS 1\n#extension GL_OES_standard_derivatives : enable";
+ std::string vertexShaderPrefix = "#define TEST_VS 1";
+
+ // Call render to compile default shaders.
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.Render();
+
+ GLuint lastShaderCompiledBefore = application.GetGlAbstraction().GetLastShaderCompiled();
+
+ // create from type registry
+
+ TypeInfo typeInfo = TypeRegistry::Get().GetTypeInfo( "ShaderEffect" );
+ DALI_TEST_CHECK( typeInfo );
+ ShaderEffect effect = ShaderEffect::DownCast( typeInfo.CreateInstance() );
+ DALI_TEST_CHECK( effect );
+
+ Property::Value programMap = Property::Value(Property::MAP);
+
+ programMap.SetValue("vertex", std::string(VertexSource));
+ programMap.SetValue("fragment", std::string(FragmentSource));
+
+ programMap.SetValue("vertex-prefix", std::string(fragmentShaderPrefix));
+ programMap.SetValue("fragment-prefix", std::string(vertexShaderPrefix));
+
+ programMap.SetValue("geometry-type", "GEOMETRY_TYPE_IMAGE");
+
+ effect.SetProperty(effect.GetPropertyIndex("program"), programMap);
+
+ Property::Value imageMap = Property::Value(Property::MAP);
+ imageMap.SetValue("filename", Property::Value(TestImageFilename));
+
+ effect.SetProperty(effect.GetPropertyIndex("image"), imageMap);
+
+ BitmapImage image(CreateBitmapImage());
+
+ ImageActor actor = ImageActor::New( image );
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("TestImageFilenameActor");
+ actor.SetShaderEffect(effect);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+ GLuint lastShaderCompiledAfter = application.GetGlAbstraction().GetLastShaderCompiled();
+ bool testResult = false;
+
+ // we should have compiled 4 shaders.
+ DALI_TEST_CHECK(lastShaderCompiledAfter - lastShaderCompiledBefore == 4);
+ if (lastShaderCompiledAfter - lastShaderCompiledBefore == 4)
+ {
+ char testVertexSourceResult[GETSOURCE_BUFFER_SIZE];
+ char testFragmentSourceResult[GETSOURCE_BUFFER_SIZE];
+
+ // we are interested in the first two.
+ GLuint vertexShaderId = lastShaderCompiledBefore + 1;
+ GLuint fragmentShaderId = lastShaderCompiledBefore + 2;
+
+ GLsizei lengthVertexResult;
+ GLsizei lengthFragmentResult;
+
+ application.GetGlAbstraction().GetShaderSource(vertexShaderId, GETSOURCE_BUFFER_SIZE, &lengthVertexResult, testVertexSourceResult);
+ application.GetGlAbstraction().GetShaderSource(fragmentShaderId, GETSOURCE_BUFFER_SIZE, &lengthFragmentResult, testFragmentSourceResult);
+
+ int vertexShaderHasPrefix = strncmp(testVertexSourceResult, "#define ", strlen("#define "));
+ int fragmentShaderHasPrefix = strncmp(testFragmentSourceResult, "#define ", strlen("#define "));
+ testResult = (vertexShaderHasPrefix == 0) && (fragmentShaderHasPrefix == 0);
+ }
+ DALI_TEST_CHECK(testResult);
+ END_TEST;
+}
+
+int UtcDaliShaderEffectFromProperties02(void)
+{
+ try
+ {
+ TestApplication application;
+ tet_infoline("UtcDaliShaderEffectFromProperties02()");
+
+ // Call render to compile default shaders.
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.Render();
+
+ // create from type registry (currently only way to get ShaderEffect with no shader setup in constructor
+ TypeInfo typeInfo = TypeRegistry::Get().GetTypeInfo( "ShaderEffect" );
+ DALI_TEST_CHECK( typeInfo );
+ ShaderEffect effect = ShaderEffect::DownCast( typeInfo.CreateInstance() );
+ DALI_TEST_CHECK( effect );
+
+ Property::Value programMap = Property::Value(Property::MAP);
+
+ programMap.SetValue("vertex", std::string(VertexSource));
+ programMap.SetValue("fragment", std::string(FragmentSource));
+
+ // programMap.SetValue("geometry-type", "GEOMETRY_TYPE_IMAGE");
+ // dont set by value
+ programMap.SetValue("geometry-type", GeometryType( GEOMETRY_TYPE_IMAGE ));
+
+ effect.SetProperty(effect.GetPropertyIndex("program"), programMap);
+
+ tet_result( TET_FAIL );
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ }
+ END_TEST;
+}
+
+int UtcDaliShaderEffectFromProperties03(void)
+{
+ try
+ {
+ TestApplication application;
+ tet_infoline("UtcDaliShaderEffectFromProperties03()");
+
+ // Call render to compile default shaders.
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.Render();
+
+ // create from type registry (currently only way to get ShaderEffect with no shader setup in constructor
+ TypeInfo typeInfo = TypeRegistry::Get().GetTypeInfo( "ShaderEffect" );
+ DALI_TEST_CHECK( typeInfo );
+ ShaderEffect effect = ShaderEffect::DownCast( typeInfo.CreateInstance() );
+ DALI_TEST_CHECK( effect );
+
+ // dont set unknown
+ effect.SetProperty( effect.GetPropertyIndex("geometry-hints"), "HINT_2" );
+
+ tet_result( TET_FAIL );
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ }
+ END_TEST;
+}
+
+int UtcDaliShaderEffectPropertyIndices(void)
+{
+ TestApplication application;
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+
+ Property::IndexContainer indices;
+ effect.GetPropertyIndices( indices );
+ DALI_TEST_CHECK( ! indices.empty() );
+ DALI_TEST_EQUALS( indices.size(), effect.GetPropertyCount(), TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+using namespace Dali::Internal;
+using Dali::Spline;
+using Dali::Vector3;
+
+namespace
+{
+
+// Knots fed into Allegro, which generates control points
+static Spline* SetupBezierSpline1()
+{
+ Spline *bezierSpline = new Spline();
+
+ bezierSpline->AddKnot(Vector3( 50.0, 50.0, 0.0));
+ bezierSpline->AddKnot(Vector3(120.0, 70.0, 0.0));
+ bezierSpline->AddKnot(Vector3(190.0, 250.0, 0.0));
+ bezierSpline->AddKnot(Vector3(260.0, 260.0, 0.0));
+ bezierSpline->AddKnot(Vector3(330.0, 220.0, 0.0));
+ bezierSpline->AddKnot(Vector3(400.0, 50.0, 0.0));
+
+ bezierSpline->SetInTangent (0, Vector3( 0.0, 0.0, 0.0));
+ bezierSpline->SetInTangent (1, Vector3(107.0, 58.0, 0.0));
+ bezierSpline->SetInTangent (2, Vector3(152.0, 220.0, 0.0));
+ bezierSpline->SetInTangent (3, Vector3(243.0, 263.0, 0.0));
+ bezierSpline->SetInTangent (4, Vector3(317.0, 235.0, 0.0));
+ bezierSpline->SetInTangent (5, Vector3(383.0, 93.0, 0.0));
+
+ bezierSpline->SetOutTangent(0, Vector3( 68.0, 55.0, 0.0));
+ bezierSpline->SetOutTangent(1, Vector3(156.0, 102.0, 0.0));
+ bezierSpline->SetOutTangent(2, Vector3(204.0, 261.0, 0.0));
+ bezierSpline->SetOutTangent(3, Vector3(280.0, 256.0, 0.0));
+ bezierSpline->SetOutTangent(4, Vector3(360.0, 185.0, 0.0));
+ bezierSpline->SetOutTangent(5, Vector3(410.0, 40.0, 0.0));
+ return bezierSpline;
+}
+
+// Knots fed into Allegro, which generates control points
+static Spline* SetupBezierSpline2()
+{
+ Spline *spline = new Spline();
+ spline->AddKnot(Vector3( 30.0, 80.0, 0.0));
+ spline->AddKnot(Vector3( 70.0, 120.0, 0.0));
+ spline->AddKnot(Vector3(100.0, 100.0, 0.0));
+ spline->SetInTangent (0, Vector3( 0.0, 0.0, 0.0));
+ spline->SetInTangent (1, Vector3( 56.0, 119.0, 0.0));
+ spline->SetInTangent (2, Vector3( 93.0, 104.0, 0.0));
+ spline->SetOutTangent(0, Vector3( 39.0, 90.0, 0.0));
+ spline->SetOutTangent(1, Vector3( 78.0, 120.0, 0.0));
+ spline->SetOutTangent(2, Vector3(110.0, 90.0, 0.0));
+ return spline;
+}
+
+
+typedef struct
+{
+ float x;
+ float y;
+} tPoint;
+
+tPoint test[] = {
+ {0.0f, 0.0f},
+ {50.0f, 50.0f},
+ {120.0f, 70.0f},
+ {190.0f, 250.0f},
+ {260.0f, 260.0f},
+ {330.0f, 220.0f},
+ {400.0f, 50.0f},
+ {106.0f, 62.5f},
+ {242.0f, 261.3f},
+ {320.0f, 229.3f},
+ {390.0f, 78.1f},
+ {399.9999f, 50.0f},
+ {401.0f, 0.0f},
+ {501.0f, 0.0f},
+ {-100.0f, 0.0f},
+};
+
+} // anonymous namespace
+
+
+
+// Positive test case for a method
+int UtcDaliSplineGetYFromMonotonicX(void)
+{
+ TestApplication application;
+
+ Spline *bezierSpline = SetupBezierSpline1();
+
+
+ for(unsigned int i=0; i<sizeof(test)/sizeof(tPoint); i++)
+ {
+ DALI_TEST_EQUALS(1, 1, (const char *)TEST_LOCATION);
+
+ DALI_TEST_EQUALS((float)bezierSpline->GetYFromMonotonicX(test[i].x),
+ (float)test[i].y, 0.1f,
+ TEST_LOCATION);
+ }
+
+ delete bezierSpline;
+ END_TEST;
+}
+
+int utcDaliSplineGetKnot01(void)
+{
+ TestApplication application;
+
+ Spline *bezierSpline= new Spline();
+ bezierSpline->AddKnot(Vector3( 50.0, 50.0, 0.0));
+ bezierSpline->AddKnot(Vector3(120.0, 70.0, 0.0));
+ bezierSpline->AddKnot(Vector3(190.0, 250.0, 0.0));
+ bezierSpline->AddKnot(Vector3(260.0, 260.0, 0.0));
+ bezierSpline->AddKnot(Vector3(330.0, 220.0, 0.0));
+ bezierSpline->AddKnot(Vector3(400.0, 50.0, 0.0));
+
+ DALI_TEST_EQUALS(bezierSpline->GetKnot(0), Vector3( 50.0, 50.0, 0.0), TEST_LOCATION);
+ DALI_TEST_EQUALS(bezierSpline->GetKnot(1), Vector3(120.0, 70.0, 0.0), TEST_LOCATION);
+ DALI_TEST_EQUALS(bezierSpline->GetKnot(2), Vector3(190.0, 250.0, 0.0), TEST_LOCATION);
+ DALI_TEST_EQUALS(bezierSpline->GetKnot(3), Vector3(260.0, 260.0, 0.0), TEST_LOCATION);
+ DALI_TEST_EQUALS(bezierSpline->GetKnot(4), Vector3(330.0, 220.0, 0.0), TEST_LOCATION);
+ DALI_TEST_EQUALS(bezierSpline->GetKnot(5), Vector3(400.0, 50.0, 0.0), TEST_LOCATION);
+ END_TEST;
+}
+
+int utcDaliSplineGetKnot02(void)
+{
+ TestApplication application;
+
+ Spline *bezierSpline= new Spline();
+ bezierSpline->AddKnot(Vector3( 50.0, 50.0, 0.0f));
+
+ try
+ {
+ bezierSpline->GetKnot(1);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "knotIndex < mKnots.size()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int utcDaliSplineGetKnot03(void)
+{
+ TestApplication application;
+
+ Spline *bezierSpline= new Spline();
+
+ try
+ {
+ bezierSpline->GetKnot(0);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "knotIndex < mKnots.size()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int utcDaliSplineGetInTangent01(void)
+{
+ TestApplication application;
+
+ Spline *bezierSpline= new Spline();
+ bezierSpline->AddKnot(Vector3( 50.0, 50.0, 0.0));
+ bezierSpline->AddKnot(Vector3(120.0, 70.0, 0.0));
+ bezierSpline->SetInTangent(0, Vector3(0.0f, 0.0f, 0.0)); // Intangent for initial value is unused
+ bezierSpline->SetInTangent(1, Vector3(108.0f, 57.0f, 0.0));
+
+ DALI_TEST_EQUALS(bezierSpline->GetInTangent(0), Vector3(0.0f, 0.0f, 0.0f), TEST_LOCATION);
+ DALI_TEST_EQUALS(bezierSpline->GetInTangent(1), Vector3(108.0f, 57.0f, 0.0f), TEST_LOCATION);
+ END_TEST;
+}
+
+
+
+int utcDaliSplineGetInTangent02(void)
+{
+ TestApplication application;
+
+ Spline *bezierSpline= new Spline();
+ bezierSpline->AddKnot(Vector3( 50.0, 50.0, 0.0));
+ bezierSpline->AddKnot(Vector3(120.0, 70.0, 0.0));
+ bezierSpline->SetInTangent(0, Vector3(0.0f, 0.0f, 0.0)); // Intangent for initial value is unused
+ bezierSpline->SetInTangent(1, Vector3(108.0f, 57.0f, 0.0));
+
+ try
+ {
+ bezierSpline->GetInTangent(5);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "knotIndex < mInTangents.size()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+int utcDaliSplineGetInTangent03(void)
+{
+ TestApplication application;
+
+ Spline *bezierSpline= new Spline();
+ try
+ {
+ bezierSpline->GetInTangent(0);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "knotIndex < mInTangents.size()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+int utcDaliSplineGetOutTangent01(void)
+{
+ TestApplication application;
+
+ Spline *bezierSpline= new Spline();
+ bezierSpline->AddKnot(Vector3( 50.0, 50.0, 0.0));
+ bezierSpline->AddKnot(Vector3(120.0, 70.0, 0.0));
+ bezierSpline->SetOutTangent(0, Vector3(0.0f, 0.0f, 0.0)); // Intangent for initial value is unused
+ bezierSpline->SetOutTangent(1, Vector3(108.0f, 57.0f, 0.0));
+
+ DALI_TEST_EQUALS(bezierSpline->GetOutTangent(0), Vector3(0.0f, 0.0f, 0.0f), TEST_LOCATION);
+ DALI_TEST_EQUALS(bezierSpline->GetOutTangent(1), Vector3(108.0f, 57.0f, 0.0f), TEST_LOCATION);
+ END_TEST;
+}
+
+
+
+int utcDaliSplineGetOutTangent02(void)
+{
+ TestApplication application;
+
+ Spline *bezierSpline= new Spline();
+ bezierSpline->AddKnot(Vector3( 50.0, 50.0, 0.0));
+ bezierSpline->AddKnot(Vector3(120.0, 70.0, 0.0));
+ bezierSpline->SetOutTangent(0, Vector3(0.0f, 0.0f, 0.0)); // Intangent for initial value is unused
+ bezierSpline->SetOutTangent(1, Vector3(108.0f, 57.0f, 0.0));
+
+ try
+ {
+ bezierSpline->GetOutTangent(5);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "knotIndex < mOutTangents.size()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+int utcDaliSplineGetOutTangent03(void)
+{
+ TestApplication application;
+
+ Spline *bezierSpline= new Spline();
+ try
+ {
+ bezierSpline->GetOutTangent(0);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "knotIndex < mOutTangents.size()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+int utcDaliSplineGenerateControlPoints01(void)
+{
+ TestApplication application;
+
+ Spline *bezierSpline = new Spline();
+
+ bezierSpline->AddKnot(Vector3( 50.0, 50.0, 0.0));
+ bezierSpline->AddKnot(Vector3(120.0, 70.0, 0.0));
+ bezierSpline->AddKnot(Vector3(190.0, 250.0, 0.0));
+ bezierSpline->AddKnot(Vector3(260.0, 260.0, 0.0));
+ bezierSpline->AddKnot(Vector3(330.0, 220.0, 0.0));
+ bezierSpline->AddKnot(Vector3(400.0, 50.0, 0.0));
+
+ bezierSpline->GenerateControlPoints(0.25);
+
+ // first in tangent is never used, ignore it.
+ DALI_TEST_EQUALS(bezierSpline->GetInTangent(1), Vector3(107.0, 58.0, 0.0), 1.0, TEST_LOCATION);
+ DALI_TEST_EQUALS(bezierSpline->GetInTangent(2), Vector3(152.0, 220.0, 0.0), 1.0, TEST_LOCATION);
+ DALI_TEST_EQUALS(bezierSpline->GetInTangent(3), Vector3(243.0, 263.0, 0.0), 1.0, TEST_LOCATION);
+ DALI_TEST_EQUALS(bezierSpline->GetInTangent(4), Vector3(317.0, 235.0, 0.0), 1.0, TEST_LOCATION);
+ DALI_TEST_EQUALS(bezierSpline->GetInTangent(5), Vector3(383.0, 93.0, 0.0), 1.0, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(bezierSpline->GetOutTangent(0), Vector3( 68.0, 55.0, 0.0), 1.0, TEST_LOCATION);
+ DALI_TEST_EQUALS(bezierSpline->GetOutTangent(1), Vector3(156.0, 102.0, 0.0), 1.0, TEST_LOCATION);
+ DALI_TEST_EQUALS(bezierSpline->GetOutTangent(2), Vector3(204.0, 261.0, 0.0), 1.0, TEST_LOCATION);
+ DALI_TEST_EQUALS(bezierSpline->GetOutTangent(3), Vector3(280.0, 256.0, 0.0), 1.0, TEST_LOCATION);
+ DALI_TEST_EQUALS(bezierSpline->GetOutTangent(4), Vector3(360.0, 185.0, 0.0), 1.0, TEST_LOCATION);
+ // last out tangent is never used, ignore it.
+ END_TEST;
+}
+
+int utcDaliSplineGenerateControlPoints02(void)
+{
+ TestApplication application;
+
+ Spline *bezierSpline = new Spline();
+ try
+ {
+ bezierSpline->GenerateControlPoints(0.25);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "numKnots > 1", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+int utcDaliSplineGenerateControlPoints03(void)
+{
+ TestApplication application;
+
+ Spline *bezierSpline = new Spline();
+ bezierSpline->AddKnot(Vector3(400.0, 50.0, 0.0f));
+ try
+ {
+ bezierSpline->GenerateControlPoints(0.25);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "numKnots > 1", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+int UtcDaliSplineGetY01(void)
+{
+ TestApplication application;
+ Spline *spline = SetupBezierSpline2();
+
+ DALI_TEST_EQUALS(spline->GetY(0, 0.0f), 80.0f, TEST_LOCATION); // First control point
+ DALI_TEST_EQUALS(spline->GetY(0, 0.5f), 102.0f, 2.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(spline->GetY(0, 1.0f), 120.0f, TEST_LOCATION); // Second control point
+ DALI_TEST_EQUALS(spline->GetY(1, 0.0f), 120.0f, TEST_LOCATION); // Second control point
+ DALI_TEST_EQUALS(spline->GetY(1, 0.5f), 112.0f, 2.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(spline->GetY(1, 1.0f), 100.0f, TEST_LOCATION); // Third control point
+ delete spline;
+ END_TEST;
+}
+
+// Test segments outside range (should assert and fail tetcase!)
+int UtcDaliSplineGetY02(void)
+{
+ TestApplication application;
+
+ try
+ {
+ Spline *spline = SetupBezierSpline2();
+ spline->GetY(3, 0.0f); // Segment outside range - expect assertion
+
+ // If we get here, assertion hasn't triggered.
+ tet_result(TET_FAIL);
+ delete spline;
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "segmentIndex+1 < mKnots.size() && segmentIndex < mKnots.size()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+// Test segments outside range (should assert and fail tetcase!)
+int UtcDaliSplineGetY02b(void)
+{
+ TestApplication application;
+ try
+ {
+ Spline *spline = SetupBezierSpline2();
+ spline->GetY(-1, 0.0f); // Segment outside range - expect assertion
+
+ // If we get here, assertion hasn't triggered.
+ tet_result(TET_FAIL);
+ delete spline;
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "segmentIndex+1 < mKnots.size() && segmentIndex < mKnots.size()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+// Test parameter ouside 0-1 - should return 0.
+int UtcDaliSplineGetY03(void)
+{
+ TestApplication application;
+ Spline *spline = SetupBezierSpline2();
+ DALI_TEST_EQUALS(spline->GetY(1, -1.0f), 0.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(spline->GetY(1, 2.0f), 0.0f, TEST_LOCATION);
+ delete spline;
+ END_TEST;
+}
+
+// Test on empty spline - should assert
+int UtcDaliSplineGetY04(void)
+{
+ TestApplication application;
+ try
+ {
+ Spline *spline = new Spline();
+ spline->GetY(0, 0.0f); // Should assert
+ tet_result(TET_FAIL);
+ delete spline;
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "segmentIndex+1 < mKnots.size() && segmentIndex < mKnots.size()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+// Test on empty spline - should assert
+int UtcDaliSplineGetY04b(void)
+{
+ TestApplication application;
+ try
+ {
+ Spline *spline = new Spline();
+ spline->GetY(0, 1.0f);
+ tet_result(TET_FAIL); // assertion didn't trigger
+ delete spline;
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "segmentIndex+1 < mKnots.size() && segmentIndex < mKnots.size()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+
+int UtcDaliSplineGetPoint01(void)
+{
+ TestApplication application;
+ Spline *spline = SetupBezierSpline2();
+
+ // Test control points
+ Vector3 pt = spline->GetPoint(0, 0.0f);
+ DALI_TEST_EQUALS(pt.x, 30.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(pt.y, 80.0f, TEST_LOCATION);
+
+ // Test control points
+ pt = spline->GetPoint(0, 1.0f);
+ DALI_TEST_EQUALS(pt.x, 70.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(pt.y, 120.0f, TEST_LOCATION);
+
+ // Halfway point computed using Allegro engine
+ pt = spline->GetPoint(0, 0.5f);
+ DALI_TEST_EQUALS(pt.x, 47.0f, 2.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(pt.y, 102.0f, 2.0f, TEST_LOCATION);
+
+ // Test control point
+ pt = spline->GetPoint(1, 0.0f);
+ DALI_TEST_EQUALS(pt.x, 70.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(pt.y, 120.0f, TEST_LOCATION);
+
+ // Halfway point computed using Allegro engine
+ pt = spline->GetPoint(1, 0.5f);
+ DALI_TEST_EQUALS(pt.x, 85.0f, 2.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(pt.y, 112.0f, 2.0f, TEST_LOCATION);
+
+ // Test control points
+ pt = spline->GetPoint(1, 1.0f);
+ DALI_TEST_EQUALS(pt.x, 100.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(pt.y, 100.0f, TEST_LOCATION);
+ delete spline;
+ END_TEST;
+}
+
+
+int UtcDaliSplineGetPoint02(void)
+{
+ TestApplication application;
+ Spline *spline = SetupBezierSpline2();
+
+ // Test control points
+ Vector3 pt = spline->GetPoint(0.0f);
+ DALI_TEST_EQUALS(pt.x, 30.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(pt.y, 80.0f, TEST_LOCATION);
+
+ // Halfway point computed using Allegro engine
+ pt = spline->GetPoint(0.25f);
+ DALI_TEST_EQUALS(pt.x, 47.0f, 2.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(pt.y, 102.0f, 2.0f, TEST_LOCATION);
+
+ // Test control points
+ pt = spline->GetPoint(0.5f);
+ DALI_TEST_EQUALS(pt.x, 70.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(pt.y, 120.0f, TEST_LOCATION);
+
+ // Halfway point computed using Allegro engine
+ pt = spline->GetPoint(0.75f);
+ DALI_TEST_EQUALS(pt.x, 85.0f, 2.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(pt.y, 112.0f, 2.0f, TEST_LOCATION);
+
+ // Test control points
+ pt = spline->GetPoint(1.0f);
+ DALI_TEST_EQUALS(pt.x, 100.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(pt.y, 100.0f, TEST_LOCATION);
+ delete spline;
+ END_TEST;
+}
+
+
+// Test on segment index out of bounds - should assert and fail tet case
+int UtcDaliSplineGetPoint03(void)
+{
+ TestApplication application;
+ try
+ {
+ Spline *spline = SetupBezierSpline2();
+
+ spline->GetPoint(-1, 0.5f); // should assert
+ tet_result(TET_FAIL);
+ delete spline;
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "segmentIndex+1 < mKnots.size() && segmentIndex < mKnots.size()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+// Test on segment index out of bounds - should assert and fail tet case
+int UtcDaliSplineGetPoint04(void)
+{
+ TestApplication application;
+ try
+ {
+ Spline *spline = SetupBezierSpline2();
+
+ spline->GetPoint(123, 0.5f); // should assert
+ tet_result(TET_FAIL);
+ delete spline;
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "segmentIndex+1 < mKnots.size() && segmentIndex < mKnots.size()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+// Test on parameter out of bounds - should return 0,0
+int UtcDaliSplineGetPoint05(void)
+{
+ TestApplication application;
+ Spline *spline = SetupBezierSpline2();
+
+ Vector3 pt = spline->GetPoint(0, -32.0f);
+ DALI_TEST_EQUALS(pt.x, 0.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(pt.y, 0.0f, TEST_LOCATION);
+
+ pt = spline->GetPoint(0, 23444.0f);
+ DALI_TEST_EQUALS(pt.x, 0.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(pt.y, 0.0f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Test on empty spline - should assert and fail tet case
+int UtcDaliSplineGetPoint06(void)
+{
+ TestApplication application;
+ try
+ {
+ Spline *spline = new Spline();
+ spline->GetPoint(0, 23444.0f);
+ tet_result(TET_FAIL);
+ delete(spline);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "segmentIndex+1 < mKnots.size() && segmentIndex < mKnots.size()", TEST_LOCATION);
+ }
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+#include <dali/integration-api/events/long-press-gesture-event.h>
+#include <dali/integration-api/events/pan-gesture-event.h>
+#include <dali/integration-api/events/pinch-gesture-event.h>
+#include <dali/integration-api/events/tap-gesture-event.h>
+#include <dali/integration-api/events/touch-event-integ.h>
+
+using namespace Dali;
+
+
+namespace
+{
+
+// Stores data that is populated in the callback and will be read by the Test cases
+struct SignalData
+{
+ SignalData()
+ : functorCalled( false ),
+ voidFunctorCalled( false ),
+ receivedGesture( Gesture::Clear ),
+ pressedActor()
+ {}
+
+ void Reset()
+ {
+ functorCalled = false;
+ voidFunctorCalled = false;
+
+ receivedGesture.numberOfTouches = 0u;
+ receivedGesture.screenPoint = Vector2(0.0f, 0.0f);
+ receivedGesture.localPoint = Vector2(0.0f, 0.0f);
+
+ pressedActor = NULL;
+ }
+
+ bool functorCalled;
+ bool voidFunctorCalled;
+ LongPressGesture receivedGesture;
+ Actor pressedActor;
+};
+
+// Functor that sets the data when called
+struct GestureReceivedFunctor
+{
+ GestureReceivedFunctor(SignalData& data) : signalData(data) { }
+
+ void operator()(Actor actor, LongPressGesture longPress)
+ {
+ signalData.functorCalled = true;
+ signalData.receivedGesture = longPress;
+ signalData.pressedActor = actor;
+ }
+
+ void operator()()
+ {
+ signalData.voidFunctorCalled = true;
+ }
+
+ SignalData& signalData;
+};
+
+// Generate a LongPressGestureEvent to send to Core
+Integration::LongPressGestureEvent GenerateLongPress(
+ Gesture::State state,
+ unsigned int numberOfTouches,
+ Vector2 point)
+{
+ Integration::LongPressGestureEvent longPress( state );
+
+ longPress.numberOfTouches = numberOfTouches;
+ longPress.point = point;
+
+ return longPress;
+}
+
+// Generate a PanGestureEvent to send to Core
+Integration::PanGestureEvent GeneratePan(
+ Gesture::State state,
+ Vector2 previousPosition,
+ Vector2 currentPosition,
+ unsigned long timeDelta,
+ unsigned int numberOfTouches = 1,
+ unsigned int time = 1u)
+{
+ Integration::PanGestureEvent pan(state);
+
+ pan.previousPosition = previousPosition;
+ pan.currentPosition = currentPosition;
+ pan.timeDelta = timeDelta;
+ pan.numberOfTouches = numberOfTouches;
+ pan.time = time;
+
+ return pan;
+}
+// Generate a PinchGestureEvent to send to Core
+Integration::PinchGestureEvent GeneratePinch(
+ Gesture::State state,
+ float scale,
+ float speed,
+ Vector2 centerpoint)
+{
+ Integration::PinchGestureEvent pinch(state);
+
+ pinch.scale = scale;
+ pinch.speed = speed;
+ pinch.centerPoint = centerpoint;
+
+ return pinch;
+}
+// Generate a TapGestureEvent to send to Core
+Integration::TapGestureEvent GenerateTap(
+ Gesture::State state,
+ unsigned int numberOfTaps,
+ unsigned int numberOfTouches,
+ Vector2 point)
+{
+ Integration::TapGestureEvent tap( state );
+
+ tap.numberOfTaps = numberOfTaps;
+ tap.numberOfTouches = numberOfTouches;
+ tap.point = point;
+
+ return tap;
+}
+
+//
+// Create function as Init function called
+//
+static bool CreateCustomInitCalled = false;
+BaseHandle CreateCustomInit(void)
+{
+ CreateCustomInitCalled = true;
+ return BaseHandle();
+}
+
+static bool CreateCustomNamedInitCalled = false;
+BaseHandle CreateCustomNamedInit(void)
+{
+ CreateCustomNamedInitCalled = true;
+ return BaseHandle();
+}
+
+const std::string scriptedName("PopupStyle");
+static TypeRegistration scriptedType( scriptedName, typeid(Dali::CustomActor), CreateCustomNamedInit );
+
+// Property Registration
+bool setPropertyCalled = false;
+bool getPropertyCalled = false;
+void SetProperty( BaseObject* object, Property::Index propertyIndex, const Property::Value& value )
+{
+ setPropertyCalled = true;
+}
+Property::Value GetProperty( BaseObject* object, Property::Index propertyIndex )
+{
+ getPropertyCalled = true;
+ return Property::Value( true );
+}
+
+
+
+/*******************************************************************************
+ *
+ * Custom Actor
+ *
+ ******************************************************************************/
+namespace Impl
+{
+struct MyTestCustomActor : public CustomActorImpl
+{
+ typedef SignalV2< void ()> SignalType;
+ typedef SignalV2< void (float)> SignalTypeFloat;
+
+ MyTestCustomActor() : CustomActorImpl( true ) // requires touch
+ { }
+
+ virtual ~MyTestCustomActor()
+ { }
+
+ void ResetCallStack()
+ {
+ }
+
+ // From CustomActorImpl
+ virtual void OnStageConnection()
+ {
+ }
+ virtual void OnStageDisconnection()
+ {
+ }
+ virtual void OnChildAdd(Actor& child)
+ {
+ }
+ virtual void OnChildRemove(Actor& child)
+ {
+ }
+ virtual void OnSizeSet(const Vector3& targetSize)
+ {
+ }
+ virtual void OnSizeAnimation(Animation& animation, const Vector3& targetSize)
+ {
+ }
+ virtual bool OnTouchEvent(const TouchEvent& event)
+ {
+ return true;
+ }
+ virtual bool OnMouseWheelEvent(const MouseWheelEvent& event)
+ {
+ return true;
+ }
+ virtual bool OnKeyEvent(const KeyEvent& event)
+ {
+ return true;
+ }
+ virtual void OnKeyInputFocusGained()
+ {
+ }
+ virtual void OnKeyInputFocusLost()
+ {
+ }
+ virtual Actor GetChildByAlias(const std::string& actorAlias)
+ {
+ return Actor::New();
+ }
+
+public:
+
+ SignalType mSignal;
+};
+
+}; // namespace Impl
+
+class MyTestCustomActor : public CustomActor
+{
+public:
+
+ typedef SignalV2< void ()> SignalType;
+ typedef SignalV2< void (float)> SignalTypeFloat;
+
+ MyTestCustomActor()
+ {
+ }
+
+ static MyTestCustomActor New()
+ {
+ Impl::MyTestCustomActor* p = new Impl::MyTestCustomActor;
+ return MyTestCustomActor( *p ); // takes ownership
+ }
+
+ virtual ~MyTestCustomActor()
+ {
+ }
+
+ static MyTestCustomActor DownCast( BaseHandle handle )
+ {
+ MyTestCustomActor result;
+
+ CustomActor custom = Dali::CustomActor::DownCast( handle );
+ if ( custom )
+ {
+ CustomActorImpl& customImpl = custom.GetImplementation();
+
+ Impl::MyTestCustomActor* impl = dynamic_cast<Impl::MyTestCustomActor*>(&customImpl);
+
+ if (impl)
+ {
+ result = MyTestCustomActor(customImpl.GetOwner());
+ }
+ }
+
+ return result;
+ }
+
+ SignalType& GetCustomSignal()
+ {
+ Dali::RefObject& obj = GetImplementation();
+ return static_cast<Impl::MyTestCustomActor&>( obj ).mSignal;
+ }
+
+private:
+
+ MyTestCustomActor(Internal::CustomActor* internal)
+ : CustomActor(internal)
+ {
+ }
+
+ MyTestCustomActor( Impl::MyTestCustomActor& impl )
+ : CustomActor( impl )
+ {
+ }
+};
+
+
+class MyTestCustomActor2 : public CustomActor
+{
+public:
+
+ MyTestCustomActor2()
+ {
+ }
+
+ static MyTestCustomActor2 New()
+ {
+ return MyTestCustomActor2(); // takes ownership
+ }
+
+ virtual ~MyTestCustomActor2()
+ {
+ }
+
+ static MyTestCustomActor2 DownCast( BaseHandle handle )
+ {
+ MyTestCustomActor2 result;
+
+ CustomActor custom = Dali::CustomActor::DownCast( handle );
+ if ( custom )
+ {
+ CustomActorImpl& customImpl = custom.GetImplementation();
+
+ Impl::MyTestCustomActor* impl = dynamic_cast<Impl::MyTestCustomActor*>(&customImpl);
+
+ if (impl)
+ {
+ result = MyTestCustomActor2(customImpl.GetOwner());
+ }
+ }
+
+ return result;
+ }
+
+private:
+
+ MyTestCustomActor2(Internal::CustomActor* internal)
+ : CustomActor(internal)
+ {
+ }
+
+ MyTestCustomActor2( Impl::MyTestCustomActor& impl )
+ : CustomActor( impl )
+ {
+ }
+};
+
+static TypeRegistration customTypeInit( typeid(MyTestCustomActor2), typeid(Dali::CustomActor), CreateCustomInit, true );
+
+
+BaseHandle CreateCustom(void)
+{
+ return MyTestCustomActor::New();
+}
+
+static std::string lastSignalConnectionCustom;
+
+bool DoConnectSignalCustom( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
+{
+ lastSignalConnectionCustom = signalName;
+
+ bool connected( true );
+
+ Dali::BaseHandle handle(object);
+ MyTestCustomActor customActor = MyTestCustomActor::DownCast(handle);
+
+ if( "sig1" == signalName )
+ {
+ customActor.GetCustomSignal().Connect( tracker, functor );
+ }
+ else
+ {
+ // signalName does not match any signal
+ connected = false;
+ }
+
+ return connected;
+}
+
+bool DoConnectSignalCustomFailure( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
+{
+ lastSignalConnectionCustom = "failed";
+
+ return false; // This is supposed to fail
+}
+
+struct CustomTestFunctor
+{
+ CustomTestFunctor()
+ {
+ ++mTotalInstanceCount;
+ ++mCurrentInstanceCount;
+ }
+
+ CustomTestFunctor( const CustomTestFunctor& copyMe )
+ {
+ ++mTotalInstanceCount;
+ ++mCurrentInstanceCount;
+ }
+
+ ~CustomTestFunctor()
+ {
+ --mCurrentInstanceCount;
+ }
+
+ void operator()()
+ {
+ ++mCallbackCount;
+ }
+
+ static int mTotalInstanceCount;
+ static int mCurrentInstanceCount;
+ static int mCallbackCount;
+};
+
+int CustomTestFunctor::mTotalInstanceCount = 0;
+int CustomTestFunctor::mCurrentInstanceCount = 0;
+int CustomTestFunctor::mCallbackCount = 0;
+
+static void ResetFunctorCounts()
+{
+ CustomTestFunctor::mTotalInstanceCount = 0;
+ CustomTestFunctor::mCurrentInstanceCount = 0;
+ CustomTestFunctor::mCallbackCount = 0;
+}
+
+static std::string lastActionCustom;
+bool DoActionCustom(BaseObject* object, const std::string& actionName, const std::vector<Property::Value>& attributes)
+{
+ lastActionCustom = actionName;
+ return true;
+}
+
+// Custom type registration
+static TypeRegistration customType1( typeid(MyTestCustomActor), typeid(Dali::CustomActor), CreateCustom );
+
+// Custom signals
+static SignalConnectorType customSignalConnector1( customType1, "sig1", DoConnectSignalCustom );
+static SignalConnectorType customSignalConnector2( customType1, "sig2", DoConnectSignalCustomFailure );
+static const int TEST_SIGNAL_COUNT = 2;
+
+// Custom actions
+static TypeAction customAction1( customType1, "act1", DoActionCustom);
+static const int TEST_ACTION_COUNT = 1;
+
+class TestConnectionTracker : public ConnectionTracker
+{
+public:
+
+ TestConnectionTracker()
+ {
+ }
+};
+
+} // Anonymous namespace
+
+
+// Positive test case for a method
+int UtcDaliTypeRegistryCreateDaliObjects(void)
+{
+ TestApplication application;
+
+ TypeRegistry registry; // like this for ctor test coverage
+ registry = TypeRegistry::Get();
+
+ TypeInfo type;
+
+ type = registry.GetTypeInfo( "ImageActor" );
+ DALI_TEST_CHECK( type );
+ DALI_TEST_CHECK( type.GetCreator() );
+ DALI_TEST_CHECK( ImageActor::DownCast( type.GetCreator()() ) );
+ ImageActor ia = ImageActor::DownCast(type.CreateInstance());
+ DALI_TEST_CHECK( ia );
+ Stage::GetCurrent().Add( ia );
+ application.Render();
+
+ type = registry.GetTypeInfo( "TextActor" );
+ DALI_TEST_CHECK( type );
+ TextActor ta = TextActor::DownCast(type.CreateInstance());
+ DALI_TEST_CHECK( ta );
+ Stage::GetCurrent().Add( ta );
+ application.Render();
+
+ type = registry.GetTypeInfo( "CameraActor" );
+ DALI_TEST_CHECK( type );
+ CameraActor ca = CameraActor::DownCast(type.CreateInstance());
+ DALI_TEST_CHECK( ca );
+ Stage::GetCurrent().Add( ca );
+ application.Render();
+
+ type = registry.GetTypeInfo( "LightActor" );
+ DALI_TEST_CHECK( type );
+ LightActor la = LightActor::DownCast(type.CreateInstance());
+ DALI_TEST_CHECK( la );
+ Stage::GetCurrent().Add( la );
+ application.Render();
+
+ // animations
+ type = registry.GetTypeInfo( "Animation" );
+ DALI_TEST_CHECK( type );
+ Animation an = Animation::DownCast(type.CreateInstance());
+ DALI_TEST_CHECK( an );
+ an.Play();
+ application.Render();
+
+ //
+ type = registry.GetTypeInfo( "ShaderEffect" );
+ DALI_TEST_CHECK( type );
+ ShaderEffect ef = ShaderEffect::DownCast(type.CreateInstance());
+ DALI_TEST_CHECK( ef );
+ application.Render();
+
+ END_TEST;
+}
+
+/*******************************************************************************
+ *
+ * Action through the base handle
+ *
+ ******************************************************************************/
+int UtcDaliTypeRegistryActionViaBaseHandle(void)
+{
+ TestApplication application;
+
+ TypeInfo type;
+
+ type = TypeRegistry::Get().GetTypeInfo( "Actor" );
+ DALI_TEST_CHECK( type );
+
+ BaseHandle hdl = type.CreateInstance();
+ DALI_TEST_CHECK( hdl );
+
+ Actor a = Actor::DownCast(hdl);
+ DALI_TEST_CHECK( a );
+
+ a.SetVisible(false);
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK(!a.IsVisible());
+
+ std::vector<Property::Value> attributes;
+
+ DALI_TEST_CHECK(hdl.DoAction(Actor::ACTION_SHOW, attributes));
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK(a.IsVisible());
+
+ DALI_TEST_CHECK(!hdl.DoAction("unknown-action", attributes));
+ END_TEST;
+}
+
+int UtcDaliTypeRegistryNames(void)
+{
+ TestApplication application;
+
+ TypeInfo type;
+
+ TypeRegistry::NameContainer names = TypeRegistry::Get().GetTypeNames();
+
+ for(TypeRegistry::NameContainer::iterator iter = names.begin();
+ iter != names.end(); ++iter)
+ {
+ type = TypeRegistry::Get().GetTypeInfo( *iter );
+ DALI_TEST_CHECK( type );
+ }
+
+ END_TEST;
+}
+
+// Check named and typeid are equivalent
+int UtcDaliTypeRegistryNameEquivalence(void)
+{
+ TypeInfo named_type = TypeRegistry::Get().GetTypeInfo( "TextActor" );
+ TypeInfo typeinfo_type = TypeRegistry::Get().GetTypeInfo( typeid(Dali::TextActor) );
+
+ DALI_TEST_CHECK( named_type );
+ DALI_TEST_CHECK( typeinfo_type );
+
+ DALI_TEST_CHECK( named_type == typeinfo_type );
+
+ DALI_TEST_CHECK( named_type.GetName() == typeinfo_type.GetName() );
+ DALI_TEST_CHECK( named_type.GetBaseName() == typeinfo_type.GetBaseName() );
+
+ END_TEST;
+}
+
+
+int UtcDaliTypeRegistryCustomActor(void)
+{
+ ResetFunctorCounts();
+
+ TestApplication application;
+
+ TypeInfo type = TypeRegistry::Get().GetTypeInfo( "MyTestCustomActor" );
+ DALI_TEST_CHECK( type );
+
+ TypeInfo baseType = TypeRegistry::Get().GetTypeInfo( "CustomActor" );
+ DALI_TEST_CHECK( baseType );
+
+ BaseHandle handle = type.CreateInstance();
+ DALI_TEST_CHECK( handle );
+
+ MyTestCustomActor customHandle = MyTestCustomActor::DownCast( handle );
+ DALI_TEST_CHECK( customHandle );
+
+ DALI_TEST_EQUALS( type.GetActions().size(), TEST_ACTION_COUNT + baseType.GetActions().size(), TEST_LOCATION );
+ DALI_TEST_EQUALS( type.GetSignals().size(), TEST_SIGNAL_COUNT + baseType.GetSignals().size(), TEST_LOCATION );
+
+ {
+ TestConnectionTracker tracker;
+
+ bool connected = handle.ConnectSignal( &tracker, "sig1", CustomTestFunctor() );
+ DALI_TEST_EQUALS( connected, true, TEST_LOCATION );
+ DALI_TEST_CHECK( lastSignalConnectionCustom == "sig1" );
+ DALI_TEST_EQUALS( CustomTestFunctor::mTotalInstanceCount, 2/*temporary copy + FunctorDelegate copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( CustomTestFunctor::mCurrentInstanceCount, 1, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( CustomTestFunctor::mCallbackCount, 0, TEST_LOCATION );
+ customHandle.GetCustomSignal().Emit();
+ DALI_TEST_EQUALS( CustomTestFunctor::mCallbackCount, 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( CustomTestFunctor::mTotalInstanceCount, 2/*temporary copy + FunctorDelegate copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( CustomTestFunctor::mCurrentInstanceCount, 1, TEST_LOCATION );
+ }
+ // tracker should automatically disconnect here
+ DALI_TEST_EQUALS( CustomTestFunctor::mTotalInstanceCount, 2/*temporary copy + FunctorDelegate copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( CustomTestFunctor::mCurrentInstanceCount, 0, TEST_LOCATION );
+
+ // Test that functor is disconnected
+ DALI_TEST_EQUALS( CustomTestFunctor::mCallbackCount, 1, TEST_LOCATION );
+ customHandle.GetCustomSignal().Emit();
+ DALI_TEST_EQUALS( CustomTestFunctor::mCallbackCount, 1/*not incremented*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( CustomTestFunctor::mTotalInstanceCount, 2/*temporary copy + FunctorDelegate copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( CustomTestFunctor::mCurrentInstanceCount, 0, TEST_LOCATION );
+
+ std::vector<Property::Value> attributes;
+ handle.DoAction("act1", attributes);
+ DALI_TEST_CHECK( lastActionCustom == "act1" );
+ END_TEST;
+}
+
+int UtcDaliTypeRegistryCustomSignalFailure(void)
+{
+ // Test what happens when signal connnector (DoConnectSignalFailure method) returns false
+
+ ResetFunctorCounts();
+
+ TestApplication application;
+
+ TypeInfo type = TypeRegistry::Get().GetTypeInfo( "MyTestCustomActor" );
+ DALI_TEST_CHECK( type );
+
+ TypeInfo baseType = TypeRegistry::Get().GetTypeInfo( "CustomActor" );
+ DALI_TEST_CHECK( baseType );
+
+ BaseHandle handle = type.CreateInstance();
+ DALI_TEST_CHECK( handle );
+
+ MyTestCustomActor customHandle = MyTestCustomActor::DownCast( handle );
+ DALI_TEST_CHECK( customHandle );
+
+ DALI_TEST_EQUALS( type.GetActions().size(), TEST_ACTION_COUNT + baseType.GetActions().size(), TEST_LOCATION );
+ DALI_TEST_EQUALS( type.GetSignals().size(), TEST_SIGNAL_COUNT + baseType.GetSignals().size(), TEST_LOCATION );
+
+ {
+ TestConnectionTracker tracker;
+
+ bool connected = handle.ConnectSignal( &tracker, "sig2", CustomTestFunctor() );
+ DALI_TEST_EQUALS( connected, false/*This is supposed to fail*/, TEST_LOCATION );
+ DALI_TEST_CHECK( lastSignalConnectionCustom == "failed" );
+ DALI_TEST_EQUALS( CustomTestFunctor::mTotalInstanceCount, 2/*temporary copy + FunctorDelegate copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( CustomTestFunctor::mCurrentInstanceCount, 0/*deleted along with FunctorDelegate*/, TEST_LOCATION );
+
+ // Should be a NOOP
+ DALI_TEST_EQUALS( CustomTestFunctor::mCallbackCount, 0, TEST_LOCATION );
+ customHandle.GetCustomSignal().Emit();
+ DALI_TEST_EQUALS( CustomTestFunctor::mCallbackCount, 0/*never called*/, TEST_LOCATION );
+ }
+ // tracker should have nothing to disconnect here
+
+ // Should be a NOOP
+ DALI_TEST_EQUALS( CustomTestFunctor::mCallbackCount, 0, TEST_LOCATION );
+ customHandle.GetCustomSignal().Emit();
+ DALI_TEST_EQUALS( CustomTestFunctor::mCallbackCount, 0/*never called*/, TEST_LOCATION );
+ END_TEST;
+}
+
+
+
+int UtcDaliTypeRegistryInitFunctions(void)
+{
+ TestApplication application;
+
+ DALI_TEST_CHECK( "MyTestCustomActor2" == customTypeInit.RegisteredName() );
+
+ DALI_TEST_CHECK( true == CreateCustomInitCalled );
+ TypeInfo type = TypeRegistry::Get().GetTypeInfo( "MyTestCustomActor2" );
+ DALI_TEST_CHECK( type );
+ END_TEST;
+}
+
+
+
+
+int UtcDaliTypeRegistryNameInitFunctions(void)
+{
+ TestApplication application;
+
+ DALI_TEST_CHECK( scriptedName == scriptedType.RegisteredName() );
+
+ TypeInfo baseType = TypeRegistry::Get().GetTypeInfo( scriptedName );
+ DALI_TEST_CHECK( baseType );
+
+ BaseHandle handle = baseType.CreateInstance();
+
+ DALI_TEST_CHECK( true == CreateCustomNamedInitCalled );
+ TypeInfo type = TypeRegistry::Get().GetTypeInfo( scriptedName );
+ DALI_TEST_CHECK( type );
+ END_TEST;
+}
+
+
+int UtcDaliPropertyRegistration(void)
+{
+ TestApplication application;
+ TypeRegistry typeRegistry = TypeRegistry::Get();
+
+ // Check property count before property registration
+ TypeInfo typeInfo = typeRegistry.GetTypeInfo( typeid(MyTestCustomActor) );
+ DALI_TEST_CHECK( typeInfo );
+ BaseHandle handle = typeInfo.CreateInstance();
+ DALI_TEST_CHECK( handle );
+ Actor customActor = Actor::DownCast( handle );
+ DALI_TEST_CHECK( customActor );
+ unsigned int initialPropertyCount( customActor.GetPropertyCount() );
+
+ std::string propertyName( "prop-1" );
+ int propertyIndex( PROPERTY_REGISTRATION_START_INDEX );
+ Property::Type propertyType( Property::BOOLEAN );
+ PropertyRegistration property1( customType1, propertyName, propertyIndex, propertyType, &SetProperty, &GetProperty );
+
+ // Check property count after registration
+ unsigned int postRegistrationPropertyCount( customActor.GetPropertyCount() );
+ DALI_TEST_EQUALS( initialPropertyCount + 1u, postRegistrationPropertyCount, TEST_LOCATION );
+
+ // Add custom property and check property count
+ customActor.RegisterProperty( "custom-prop-1", true );
+ unsigned int customPropertyCount( customActor.GetPropertyCount() );
+ DALI_TEST_EQUALS( postRegistrationPropertyCount + 1u, customPropertyCount, TEST_LOCATION );
+
+ // Set the property, ensure SetProperty called
+ DALI_TEST_CHECK( !setPropertyCalled );
+ customActor.SetProperty( propertyIndex, false );
+ DALI_TEST_CHECK( setPropertyCalled );
+
+ // Get the property, ensure GetProperty called
+ DALI_TEST_CHECK( !getPropertyCalled );
+ (void)customActor.GetProperty< bool >( propertyIndex );
+ DALI_TEST_CHECK( getPropertyCalled );
+
+ // Check the property name
+ DALI_TEST_EQUALS( customActor.GetPropertyName( propertyIndex ), propertyName, TEST_LOCATION );
+ DALI_TEST_EQUALS( typeInfo.GetPropertyName( propertyIndex ), propertyName, TEST_LOCATION );
+
+ // Check the property index
+ DALI_TEST_EQUALS( customActor.GetPropertyIndex( propertyName ), propertyIndex, TEST_LOCATION );
+
+ // Check the property type
+ DALI_TEST_EQUALS( customActor.GetPropertyType( propertyIndex ), propertyType, TEST_LOCATION );
+
+ // Check property count of type-info is 1
+ Property::IndexContainer indices;
+ typeInfo.GetPropertyIndices( indices );
+ DALI_TEST_EQUALS( indices.size(), 1u, TEST_LOCATION );
+
+ // Ensure indices returned from actor and customActor differ by two
+ Actor actor = Actor::New();
+ actor.GetPropertyIndices( indices );
+ unsigned int actorIndices = indices.size();
+ customActor.GetPropertyIndices( indices );
+ unsigned int customActorIndices = indices.size();
+ DALI_TEST_EQUALS( actorIndices + 2u, customActorIndices, TEST_LOCATION ); // Custom property + registered property
+ END_TEST;
+}
+
+int UtcDaliPropertyRegistrationIndexOutOfBounds(void)
+{
+ TestApplication application;
+ TypeRegistry typeRegistry = TypeRegistry::Get();
+
+ // Attempt to register a property type out-of-bounds index (less than)
+ try
+ {
+ PropertyRegistration property1( customType1, "prop-name", PROPERTY_REGISTRATION_START_INDEX - 1, Property::BOOLEAN, &SetProperty, &GetProperty );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "( index >= PROPERTY_REGISTRATION_START_INDEX ) && ( index <= PROPERTY_REGISTRATION_MAX_INDEX )", TEST_LOCATION );
+ }
+
+ // Attempt to register a property type out-of-bounds index (greater than)
+ try
+ {
+ PropertyRegistration property1( customType1, "prop-name", PROPERTY_REGISTRATION_MAX_INDEX + 1, Property::BOOLEAN, &SetProperty, &GetProperty );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "( index >= PROPERTY_REGISTRATION_START_INDEX ) && ( index <= PROPERTY_REGISTRATION_MAX_INDEX )", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliPropertyRegistrationFunctions(void)
+{
+ TestApplication application;
+ int propertyIndex = PROPERTY_REGISTRATION_START_INDEX + 10;
+
+ // Attempt to register a property without a setter
+ try
+ {
+ PropertyRegistration property1( customType1, "prop-name", propertyIndex++, Property::BOOLEAN, NULL, &GetProperty );
+ tet_result( TET_PASS );
+ }
+ catch ( DaliException& e )
+ {
+ tet_result( TET_FAIL );
+ }
+
+ // Attempt to register a property without a getter
+ try
+ {
+ PropertyRegistration property1( customType1, "prop-name", propertyIndex++, Property::BOOLEAN, NULL, NULL );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "! \"GetProperty", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliPropertyRegistrationAddSameIndex(void)
+{
+ TestApplication application;
+ int propertyIndex = PROPERTY_REGISTRATION_START_INDEX + 100;
+
+ // Add one property with a valid property index
+ PropertyRegistration property1( customType1, "prop-name", propertyIndex, Property::BOOLEAN, &SetProperty, &GetProperty );
+
+ // Attempt to add another property with the same index
+ try
+ {
+ PropertyRegistration property2( customType1, "prop-name-2", propertyIndex, Property::BOOLEAN, &SetProperty, &GetProperty );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "! \"Property index already added", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliPropertyRegistrationPropertyWritable(void)
+{
+ TestApplication application;
+ int propertyIndex1 = PROPERTY_REGISTRATION_START_INDEX + 200;
+ int propertyIndex2 = PROPERTY_REGISTRATION_START_INDEX + 201;
+
+ // Add two properties, one with SetProperty, one without
+ PropertyRegistration property1( customType1, "prop-name-readwrite", propertyIndex1, Property::BOOLEAN, &SetProperty, &GetProperty );
+ PropertyRegistration property2( customType1, "prop-name-readonly", propertyIndex2, Property::BOOLEAN, NULL, &GetProperty );
+
+ // Create custom-actor
+ TypeInfo typeInfo = TypeRegistry::Get().GetTypeInfo( typeid(MyTestCustomActor) );
+ DALI_TEST_CHECK( typeInfo );
+ BaseHandle handle = typeInfo.CreateInstance();
+ DALI_TEST_CHECK( handle );
+ Actor customActor = Actor::DownCast( handle );
+ DALI_TEST_CHECK( customActor );
+
+ // Check whether properties are writable
+ DALI_TEST_CHECK( customActor.IsPropertyWritable( propertyIndex1 ) );
+ DALI_TEST_CHECK( ! customActor.IsPropertyWritable( propertyIndex2 ) );
+ END_TEST;
+}
+
+int UtcDaliPropertyRegistrationPropertyAnimatable(void)
+{
+ TestApplication application;
+ int propertyIndex = PROPERTY_REGISTRATION_START_INDEX + 400;
+
+ // These properties are not animatable
+ PropertyRegistration property1( customType1, "prop-name", propertyIndex, Property::BOOLEAN, &SetProperty, &GetProperty );
+
+ // Create custom-actor
+ TypeInfo typeInfo = TypeRegistry::Get().GetTypeInfo( typeid(MyTestCustomActor) );
+ DALI_TEST_CHECK( typeInfo );
+ BaseHandle handle = typeInfo.CreateInstance();
+ DALI_TEST_CHECK( handle );
+ Actor customActor = Actor::DownCast( handle );
+ DALI_TEST_CHECK( customActor );
+
+ // Check if animatable
+ DALI_TEST_CHECK( ! customActor.IsPropertyAnimatable( propertyIndex ) );
+ END_TEST;
+}
+
+int UtcDaliPropertyRegistrationInvalidGetAndSet(void)
+{
+ TestApplication application;
+ int propertyIndex = PROPERTY_REGISTRATION_START_INDEX + 2000;
+
+ // Create custom-actor
+ TypeInfo typeInfo = TypeRegistry::Get().GetTypeInfo( typeid(MyTestCustomActor) );
+ DALI_TEST_CHECK( typeInfo );
+ BaseHandle handle = typeInfo.CreateInstance();
+ DALI_TEST_CHECK( handle );
+ Actor customActor = Actor::DownCast( handle );
+ DALI_TEST_CHECK( customActor );
+
+ // Try to set an index that hasn't been added
+ try
+ {
+ customActor.SetProperty( propertyIndex, true );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "! \"Cannot find property index", TEST_LOCATION );
+ }
+
+ // Try to get an index that hasn't been added
+ try
+ {
+ (void) customActor.GetProperty< bool >( propertyIndex );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "! \"Cannot find property index", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+
+
+int UtcDaliLongPressGestureDetectorTypeRegistry(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Register Type
+ TypeInfo type;
+ type = TypeRegistry::Get().GetTypeInfo( "LongPressGestureDetector" );
+ DALI_TEST_CHECK( type );
+ BaseHandle handle = type.CreateInstance();
+ DALI_TEST_CHECK( handle );
+ LongPressGestureDetector detector = LongPressGestureDetector::DownCast( handle );
+ DALI_TEST_CHECK( detector );
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ detector.Attach(actor);
+
+ // Connect to signal through type
+ handle.ConnectSignal( &application, LongPressGestureDetector::SIGNAL_LONG_PRESS_DETECTED, functor );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Emit gesture
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.voidFunctorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureDetectorTypeRegistry(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Register Type
+ TypeInfo type;
+ type = TypeRegistry::Get().GetTypeInfo( "PanGestureDetector" );
+ DALI_TEST_CHECK( type );
+ BaseHandle handle = type.CreateInstance();
+ DALI_TEST_CHECK( handle );
+ PanGestureDetector detector = PanGestureDetector::DownCast( handle );
+ DALI_TEST_CHECK( detector );
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ detector.Attach(actor);
+
+ // Connect to signal through type
+ handle.ConnectSignal( &application, PanGestureDetector::SIGNAL_PAN_DETECTED, functor );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Emit gesture
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.voidFunctorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureDetectorTypeRegistry(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Register Type
+ TypeInfo type;
+ type = TypeRegistry::Get().GetTypeInfo( "PinchGestureDetector" );
+ DALI_TEST_CHECK( type );
+ BaseHandle handle = type.CreateInstance();
+ DALI_TEST_CHECK( handle );
+ PinchGestureDetector detector = PinchGestureDetector::DownCast( handle );
+ DALI_TEST_CHECK( detector );
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ detector.Attach(actor);
+
+ // Connect to signal through type
+ handle.ConnectSignal( &application, PinchGestureDetector::SIGNAL_PINCH_DETECTED, functor );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Emit gesture
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.voidFunctorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureDetectorTypeRegistry(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Register Type
+ TypeInfo type;
+ type = TypeRegistry::Get().GetTypeInfo( "TapGestureDetector" );
+ DALI_TEST_CHECK( type );
+ BaseHandle handle = type.CreateInstance();
+ DALI_TEST_CHECK( handle );
+ TapGestureDetector detector = TapGestureDetector::DownCast( handle );
+ DALI_TEST_CHECK( detector );
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ detector.Attach(actor);
+
+ // Connect to signal through type
+ handle.ConnectSignal( &application, TapGestureDetector::SIGNAL_TAP_DETECTED, functor );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Emit gesture
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.voidFunctorCalled, TEST_LOCATION);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+
+// Positive test case for a method
+int UtcDaliUtf8SequenceLength(void)
+{
+ tet_infoline("UtcDaliUtf8SequenceLength ");
+ TestApplication application;
+
+ std::string latinText( "amazing" );
+ std::string japaneseText( "すごい" );
+ std::string accent("é");
+
+ tet_infoline("utf8 1 byte Test ");
+ DALI_TEST_EQUALS( Utf8SequenceLength( latinText[0] ), 1u, TEST_LOCATION );
+ tet_infoline("utf8 3 byte Test ");
+ DALI_TEST_EQUALS( Utf8SequenceLength( japaneseText[0] ), 3u, TEST_LOCATION );
+ tet_infoline("utf8 2 byte Test ");
+ DALI_TEST_EQUALS( Utf8SequenceLength( accent[0] ), 2u, TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/public-api/dali-core.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+namespace
+{
+
+const Dali::VectorBase::SizeType ZERO(0);
+
+}
+
+
+int UtcDaliEmptyVectorInt(void)
+{
+ tet_infoline("Testing Dali::Vector<int>");
+
+ Vector< int > intvector;
+
+ DALI_TEST_EQUALS( ZERO, intvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, intvector.Capacity(), TEST_LOCATION );
+
+ intvector.Clear();
+ DALI_TEST_EQUALS( ZERO, intvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, intvector.Capacity(), TEST_LOCATION );
+
+ intvector.Release();
+ DALI_TEST_EQUALS( ZERO, intvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, intvector.Capacity(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliVectorInt(void)
+{
+ tet_infoline("Testing Dali::Vector<int>");
+
+ Vector< int > intvector;
+
+ DALI_TEST_EQUALS( ZERO, intvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, intvector.Capacity(), TEST_LOCATION );
+
+ intvector.PushBack( 11 );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(1), intvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(2), intvector.Capacity(), TEST_LOCATION );
+ DALI_TEST_EQUALS( 11, intvector[ 0 ], TEST_LOCATION );
+
+ intvector.PushBack( 99 );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(2), intvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(2), intvector.Capacity(), TEST_LOCATION );
+ DALI_TEST_EQUALS( 99, intvector[ 1 ], TEST_LOCATION );
+
+ intvector.PushBack( 34 );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(3), intvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(6), intvector.Capacity(), TEST_LOCATION );
+ DALI_TEST_EQUALS( 11, intvector[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( 99, intvector[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( 34, intvector[ 2 ], TEST_LOCATION );
+
+ intvector.Clear();
+ DALI_TEST_EQUALS( ZERO, intvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(6), intvector.Capacity(), TEST_LOCATION );
+ intvector.PushBack( 123 );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(1), intvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( 123, intvector[ 0 ], TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliVectorIntCopy(void)
+{
+ tet_infoline("Testing Dali::Vector<int>::Copy");
+
+ Vector< int > intvector;
+ DALI_TEST_EQUALS( ZERO, intvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, intvector.Capacity(), TEST_LOCATION );
+
+ intvector.PushBack( 99 );
+ intvector.PushBack( 11 );
+ intvector.PushBack( 34 );
+
+ // copy construct
+ Vector< int > intvector2( intvector );
+
+ DALI_TEST_EQUALS( intvector2.Count(), intvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( intvector2.Capacity(), intvector.Capacity(), TEST_LOCATION );
+ DALI_TEST_EQUALS( intvector2[ 0 ], intvector[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( intvector2[ 1 ], intvector[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( intvector2[ 2 ], intvector[ 2 ], TEST_LOCATION );
+
+ // assign
+ Vector< int > intvector3;
+ DALI_TEST_EQUALS( ZERO, intvector3.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, intvector3.Capacity(), TEST_LOCATION );
+ intvector2 = intvector3;
+ DALI_TEST_EQUALS( intvector2.Count(), intvector3.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( intvector2.Capacity(), intvector3.Capacity(), TEST_LOCATION );
+
+ // copy empty
+ Vector< int > intvector4;
+ intvector4.Reserve( 100 );
+ DALI_TEST_EQUALS( ZERO, intvector4.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(100), intvector4.Capacity(), TEST_LOCATION );
+ intvector3 = intvector4;
+ DALI_TEST_EQUALS( ZERO, intvector3.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(100), intvector3.Capacity(), TEST_LOCATION );
+
+ // self copy
+ intvector4 = intvector4;
+ DALI_TEST_EQUALS( ZERO, intvector4.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(100), intvector4.Capacity(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliVectorIntResize(void)
+{
+ tet_infoline("Testing Dali::Vector<short>::Resize");
+
+ Vector< short > vector;
+ DALI_TEST_EQUALS( ZERO, vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, vector.Capacity(), TEST_LOCATION );
+
+ vector.Resize( 10u );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(10), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(10), vector.Capacity(), TEST_LOCATION );
+
+ vector.Resize( 4u );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(4), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(10), vector.Capacity(), TEST_LOCATION );
+
+ vector.Resize( 4u );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(4), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(10), vector.Capacity(), TEST_LOCATION );
+
+ vector.Resize( 0u );
+ DALI_TEST_EQUALS( ZERO, vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(10), vector.Capacity(), TEST_LOCATION );
+
+ vector.Resize( 12u, 123 );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(12), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(12), vector.Capacity(), TEST_LOCATION );
+
+ DALI_TEST_EQUALS( vector[ 0 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 1 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 2 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 3 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 4 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 5 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 6 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 7 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 8 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 9 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 10 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 11 ], 123, TEST_LOCATION );
+
+ vector.Resize( 13u, 321 );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(13), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(13), vector.Capacity(), TEST_LOCATION );
+
+ DALI_TEST_EQUALS( vector[ 0 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 1 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 2 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 3 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 4 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 5 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 6 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 7 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 8 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 9 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 10 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 11 ], 123, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 12 ], 321, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliVectorIntErase(void)
+{
+ tet_infoline("Testing Dali::Vector<short>::Erase");
+
+ Vector< char > vector;
+ DALI_TEST_EQUALS( ZERO, vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, vector.Capacity(), TEST_LOCATION );
+ vector.PushBack( 1 );
+ vector.PushBack( 2 );
+ vector.PushBack( 3 );
+ vector.PushBack( 4 );
+ vector.PushBack( 5 );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(5), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 0 ], 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 1 ], 2, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 2 ], 3, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 3 ], 4, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 4 ], 5, TEST_LOCATION );
+
+ vector.Erase( vector.Begin() );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(4), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 0 ], 2, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 1 ], 3, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 2 ], 4, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 3 ], 5, TEST_LOCATION );
+
+ Vector< char >::Iterator ret = vector.Erase( std::find( vector.Begin(), vector.End(), 4 ) );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(3), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 0 ], 2, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 1 ], 3, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 2 ], 5, TEST_LOCATION );
+ DALI_TEST_EQUALS( *ret, 5, TEST_LOCATION );
+
+ // try erasing last
+ vector.PushBack( 99 );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(4), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 3 ], 99, TEST_LOCATION );
+ ret = vector.Erase( vector.End() - 1 );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(3), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ret, vector.End(), TEST_LOCATION );
+
+ try
+ {
+ // illegal erase, one past the end
+ vector.Erase( vector.End() );
+ tet_result(TET_FAIL);
+ }
+ catch( Dali::DaliException& e )
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, "(iterator < End())", TEST_LOCATION );
+ }
+ catch( ... )
+ {
+ tet_printf("Assertion test failed - wrong Exception\n" );
+ tet_result(TET_FAIL);
+ }
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(3), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 0 ], 2, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 1 ], 3, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 2 ], 5, TEST_LOCATION );
+
+ vector.Erase( vector.Begin() + 1 );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(2), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 0 ], 2, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 1 ], 5, TEST_LOCATION );
+
+ vector.Erase( vector.Begin() + 1 );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(1), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 0 ], 2, TEST_LOCATION );
+
+ try
+ {
+ // illegal erase, one past the end
+ vector.Erase( vector.Begin() + 1 );
+ tet_result(TET_FAIL);
+ }
+ catch( Dali::DaliException& e )
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, "(iterator < End())", TEST_LOCATION );
+ }
+ catch( ... )
+ {
+ tet_printf("Assertion test failed - wrong Exception\n" );
+ tet_result(TET_FAIL);
+ }
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(1), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 0 ], 2, TEST_LOCATION );
+
+ vector.Erase( vector.Begin() );
+ DALI_TEST_EQUALS( ZERO, vector.Count(), TEST_LOCATION );
+
+ try
+ {
+ // illegal erase, one before the beginning
+ vector.Erase( vector.Begin() - 1 );
+ tet_result(TET_FAIL);
+ }
+ catch( Dali::DaliException& e )
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, "(iterator < End())", TEST_LOCATION );
+ }
+ catch( ... )
+ {
+ tet_printf("Assertion test failed - wrong Exception\n" );
+ tet_result(TET_FAIL);
+ }
+
+ DALI_TEST_EQUALS( ZERO, vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( vector.Begin(), vector.End(), TEST_LOCATION );
+
+ Vector< char >::Iterator endIter = vector.End();
+ for( Vector< char >::Iterator iter = vector.Begin(); iter != endIter; ++iter )
+ {
+ tet_result(TET_FAIL);
+ }
+
+ vector.PushBack( 3 );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(1), vector.Count(), TEST_LOCATION );
+
+ vector.Clear();
+ DALI_TEST_EQUALS( ZERO, vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( vector.Begin(), vector.End(), TEST_LOCATION );
+
+ endIter = vector.End();
+ for( Vector< char >::Iterator iter = vector.Begin(); iter != endIter; ++iter )
+ {
+ tet_result(TET_FAIL);
+ }
+
+ // test a vector of pointers
+ Vector< int* > ptrVector;
+ DALI_TEST_EQUALS( ZERO, ptrVector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ptrVector.Begin(), ptrVector.End(), TEST_LOCATION );
+
+ int* pointer = NULL;
+ ptrVector.PushBack( pointer );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(1), ptrVector.Count(), TEST_LOCATION );
+
+ Vector< int* >::Iterator ptriter = std::find( ptrVector.Begin(), ptrVector.End(), pointer );
+ ptriter = ptrVector.Erase( ptriter );
+ DALI_TEST_EQUALS( ZERO, ptrVector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ptrVector.Begin(), ptrVector.End(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ptrVector.Begin(), ptriter, TEST_LOCATION );
+ END_TEST;
+}
+
+
+int UtcDaliVectorDoubleRemove(void)
+{
+ tet_infoline("Testing Dali::Vector<double>::Remove");
+
+ Vector< double > vector;
+ DALI_TEST_EQUALS( ZERO, vector.Count(), TEST_LOCATION );
+
+ vector.PushBack( 11.1 );
+ vector.PushBack( 22.2 );
+ vector.PushBack( 33.3 );
+ vector.PushBack( 44.4 );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(4), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 0 ], 11.1, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 1 ], 22.2, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 2 ], 33.3, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 3 ], 44.4, TEST_LOCATION );
+
+ Vector< double >::Iterator res = std::find( vector.Begin(), vector.End(), 22.2 );
+ DALI_TEST_EQUALS( 22.2, *res, TEST_LOCATION );
+ vector.Remove( res );
+ res = std::find( vector.Begin(), vector.End(), 22.2 );
+ DALI_TEST_EQUALS( vector.End(), res, TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(3), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 0 ], 11.1, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 1 ], 44.4, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 2 ], 33.3, TEST_LOCATION );
+
+ vector.Remove( vector.End() - 1 );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(2), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 0 ], 11.1, TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 1 ], 44.4, TEST_LOCATION );
+
+ vector.Remove( vector.Begin() );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(1), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 0 ], 44.4, TEST_LOCATION );
+
+ try
+ {
+ // illegal erase, one past the end
+ vector.Remove( vector.Begin() + 1 );
+ tet_result(TET_FAIL);
+ }
+ catch( Dali::DaliException& e )
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, "(iterator < end)", TEST_LOCATION );
+ }
+ catch( ... )
+ {
+ tet_printf("Assertion test failed - wrong Exception\n" );
+ tet_result(TET_FAIL);
+ }
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(1), vector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( vector[ 0 ], 44.4, TEST_LOCATION );
+
+ vector.Remove( vector.Begin() );
+ DALI_TEST_EQUALS( ZERO, vector.Count(), TEST_LOCATION );
+
+ try
+ {
+ // illegal erase, one before the beginning
+ vector.Remove( vector.Begin() - 1 );
+ tet_result(TET_FAIL);
+ }
+ catch( Dali::DaliException& e )
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, "(iterator < end) && (iterator >= Begin()", TEST_LOCATION );
+ }
+ catch( ... )
+ {
+ tet_printf("Assertion test failed - wrong Exception\n" );
+ tet_result(TET_FAIL);
+ }
+
+ END_TEST;
+}
+
+int UtcDaliVectorIntSwap(void)
+{
+ tet_infoline("Testing Dali::Vector<int>::Swap");
+
+ Vector< int > intvector;
+ DALI_TEST_EQUALS( ZERO, intvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, intvector.Capacity(), TEST_LOCATION );
+
+ intvector.PushBack( 11 );
+ intvector.PushBack( 22 );
+ intvector.PushBack( 33 );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(3), intvector.Count(), TEST_LOCATION );
+
+ Vector< int > intvector2;
+ DALI_TEST_EQUALS( ZERO, intvector2.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, intvector2.Capacity(), TEST_LOCATION );
+
+ intvector2.Swap( intvector );
+ DALI_TEST_EQUALS( ZERO, intvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, intvector.Capacity(), TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(3), intvector2.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( 11, intvector2[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( 22, intvector2[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( 33, intvector2[ 2 ], TEST_LOCATION );
+
+ intvector.PushBack( 99 );
+ intvector.PushBack( 88 );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(2), intvector.Count(), TEST_LOCATION );
+
+ intvector.Swap( intvector2 );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(2), intvector2.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( 99, intvector2[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( 88, intvector2[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(3), intvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( 11, intvector[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( 22, intvector[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( 33, intvector[ 2 ], TEST_LOCATION );
+
+ Vector< int > empty;
+ intvector.Swap( empty );
+ DALI_TEST_EQUALS( ZERO, intvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, intvector.Capacity(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliVectorIterate(void)
+{
+ tet_infoline("Testing Dali::Vector<float>::Begin");
+
+ Vector< float > floatvector;
+ DALI_TEST_EQUALS( ZERO, floatvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, floatvector.Capacity(), TEST_LOCATION );
+
+ floatvector.PushBack( 0.9f );
+ floatvector.PushBack( 1.1f );
+ floatvector.PushBack( 1.2f );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(3), floatvector.Count(), TEST_LOCATION );
+
+ Vector< float >::Iterator iter = floatvector.Begin();
+ int index = 0;
+ for( ; iter != floatvector.End(); ++iter, ++index )
+ {
+ std::cout << "value " << *iter << std::endl;
+ DALI_TEST_EQUALS( *iter, floatvector[ index ], TEST_LOCATION );
+ }
+ DALI_TEST_EQUALS( 3, index, TEST_LOCATION );
+
+ iter = std::find( floatvector.Begin(), floatvector.End(), 1.1f );
+ DALI_TEST_EQUALS( 1.1f, *iter, TEST_LOCATION );
+
+ floatvector.Clear();
+ iter = std::find( floatvector.Begin(), floatvector.End(), 1.1f );
+ DALI_TEST_EQUALS( floatvector.End(), iter, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliVectorPair(void)
+{
+ tet_infoline("Testing Dali::Vector< std::pair< int, float > >");
+
+ Vector< std::pair< int, float > > pairvector;
+ DALI_TEST_EQUALS( ZERO, pairvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, pairvector.Capacity(), TEST_LOCATION );
+
+ pairvector.PushBack( std::make_pair( 5, 0.1f ) );
+ pairvector.PushBack( std::make_pair( 3, 0.2f ) );
+ pairvector.PushBack( std::make_pair( 4, 0.3f ) );
+ pairvector.PushBack( std::make_pair( 1, 0.4f ) );
+ pairvector.PushBack( std::make_pair( 2, 0.5f ) );
+ DALI_TEST_EQUALS( static_cast<Dali::VectorBase::SizeType>(5), pairvector.Count(), TEST_LOCATION );
+
+ Vector< std::pair< int, float > >::Iterator iter = pairvector.Begin();
+ int index = 0;
+ for( ; iter != pairvector.End(); ++iter, ++index )
+ {
+ std::cout << "pair " << (*iter).first << ":" << (*iter).second << std::endl;
+ DALI_TEST_EQUALS( (*iter).first, pairvector[ index ].first, TEST_LOCATION );
+ DALI_TEST_EQUALS( (*iter).second, pairvector[ index ].second, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliVectorAsserts(void)
+{
+ tet_infoline("Testing Dali::Vector< int* > exception handling");
+
+ // empty vector
+ Vector< int* > pointervector;
+ try
+ {
+ int* value = NULL;
+ pointervector[ 1 ] = value;
+ tet_printf("Assertion expected, but not occurred at %s\n", TEST_LOCATION );
+ tet_result(TET_FAIL);
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, "VectorBase::mData", TEST_LOCATION );
+ }
+ catch(...)
+ {
+ tet_printf("Assertion test failed - wrong Exception\n" );
+ tet_result(TET_FAIL);
+ }
+
+ try
+ {
+ int* value = NULL;
+ value = pointervector[ 0 ];
+ (void)value; // to "use" the value
+ tet_printf("Assertion expected, but not occurred at %s\n", TEST_LOCATION );
+ tet_result(TET_FAIL);
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, "VectorBase::mData", TEST_LOCATION );
+ }
+ catch(...)
+ {
+ tet_printf("Assertion test failed - wrong Exception\n" );
+ tet_result(TET_FAIL);
+ }
+
+ Vector< int* >::Iterator iter = pointervector.Begin();
+ if( iter != pointervector.End() )
+ {
+ tet_result(TET_FAIL);
+ }
+
+ try
+ {
+ pointervector.Erase( pointervector.Begin() );
+ tet_printf("Assertion expected, but not occurred at %s\n", TEST_LOCATION );
+ tet_result(TET_FAIL);
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, "VectorBase::mData", TEST_LOCATION );
+ }
+ catch(...)
+ {
+ tet_printf("Assertion test failed - wrong Exception\n" );
+ tet_result(TET_FAIL);
+ }
+
+ iter = pointervector.Begin();
+ if( iter != pointervector.End() )
+ {
+ tet_result(TET_FAIL);
+ }
+
+ try
+ {
+ pointervector.Remove( pointervector.Begin() );
+ tet_printf("Assertion expected, but not occurred at %s\n", TEST_LOCATION );
+ tet_result(TET_FAIL);
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, "VectorBase::mData", TEST_LOCATION );
+ }
+ catch(...)
+ {
+ tet_printf("Assertion test failed - wrong Exception\n" );
+ tet_result(TET_FAIL);
+ }
+
+ iter = pointervector.Begin();
+ if( iter != pointervector.End() )
+ {
+ tet_result(TET_FAIL);
+ }
+
+ // reserve 0 space
+ pointervector.Reserve( 0 );
+ iter = pointervector.Begin();
+ if( iter != pointervector.End() )
+ {
+ tet_result(TET_FAIL);
+ }
+
+ // reserve 1 space
+ pointervector.Reserve( 1 );
+ iter = pointervector.Begin();
+ if( iter != pointervector.End() )
+ {
+ tet_result(TET_FAIL);
+ }
+
+ try
+ {
+ int* value = NULL;
+ pointervector[ 1 ] = value;
+ tet_printf("Assertion expected, but not occurred at %s\n", TEST_LOCATION );
+ tet_result(TET_FAIL);
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, "index < VectorBase::Count()", TEST_LOCATION );
+ }
+ catch(...)
+ {
+ tet_printf("Assertion test failed - wrong Exception\n" );
+ tet_result(TET_FAIL);
+ }
+
+ try
+ {
+ int* value = pointervector[ 1 ];
+ (void)value; // to "use" the value
+ tet_printf("Assertion expected, but not occurred at %s\n", TEST_LOCATION );
+ tet_result(TET_FAIL);
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, "index < VectorBase::Count()", TEST_LOCATION );
+ }
+ catch(...)
+ {
+ tet_printf("Assertion test failed - wrong Exception\n" );
+ tet_result(TET_FAIL);
+ }
+
+ END_TEST;
+}
+
+int UtcDaliVectorAcidTest(void)
+{
+ tet_infoline("Testing multiple Dali::Vector's");
+
+ // create multiple vectors
+ Vector< std::pair< float, float > > pairvector;
+ DALI_TEST_EQUALS( ZERO, pairvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, pairvector.Capacity(), TEST_LOCATION );
+ Vector< double > doublevector;
+ DALI_TEST_EQUALS( ZERO, doublevector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, doublevector.Capacity(), TEST_LOCATION );
+ Vector< int* > intptrvector;
+ DALI_TEST_EQUALS( ZERO, intptrvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, intptrvector.Capacity(), TEST_LOCATION );
+ Vector< Dali::Actor* > actorptrvector;
+ DALI_TEST_EQUALS( ZERO, actorptrvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, actorptrvector.Capacity(), TEST_LOCATION );
+ Vector< long > longvector;
+ DALI_TEST_EQUALS( ZERO, longvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, longvector.Capacity(), TEST_LOCATION );
+ Vector< char > charvector;
+ DALI_TEST_EQUALS( ZERO, charvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, charvector.Capacity(), TEST_LOCATION );
+
+ // add items
+ static unsigned int acidCount = 10000;
+ int* ptr = NULL;
+ for( unsigned int i = 0; i < acidCount; ++i )
+ {
+ ++ptr;
+ pairvector.PushBack( std::make_pair( i, i ) );
+ doublevector.PushBack( (double)i );
+ intptrvector.PushBack( (int*)ptr );
+ actorptrvector.PushBack( (Dali::Actor*)ptr );
+ longvector.PushBack( (long)i );
+ charvector.PushBack( (char)i );
+ }
+ DALI_TEST_EQUALS( acidCount, pairvector.Count(), TEST_LOCATION );
+ std::size_t pairCapacity = pairvector.Capacity();
+ DALI_TEST_EQUALS( acidCount, doublevector.Count(), TEST_LOCATION );
+ std::size_t doubleCapacity = doublevector.Capacity();
+ DALI_TEST_EQUALS( acidCount, intptrvector.Count(), TEST_LOCATION );
+ std::size_t intptrCapacity = intptrvector.Capacity();
+ DALI_TEST_EQUALS( acidCount, actorptrvector.Count(), TEST_LOCATION );
+ std::size_t actorptrCapacity = actorptrvector.Capacity();
+ DALI_TEST_EQUALS( acidCount, longvector.Count(), TEST_LOCATION );
+ std::size_t longCapacity = longvector.Capacity();
+ DALI_TEST_EQUALS( acidCount, charvector.Count(), TEST_LOCATION );
+ std::size_t charCapacity = charvector.Capacity();
+
+ tet_printf("Dali::Vector< pair > capacity after %d pushbacks is %d", acidCount, pairCapacity );
+ tet_printf("Dali::Vector< double > capacity after %d pushbacks is %d", acidCount, doubleCapacity );
+ tet_printf("Dali::Vector< int* > capacity after %d pushbacks is %d", acidCount, intptrCapacity );
+ tet_printf("Dali::Vector< Actor* > capacity after %d pushbacks is %d", acidCount, actorptrCapacity );
+ tet_printf("Dali::Vector< long > capacity after %d pushbacks is %d", acidCount, longCapacity );
+ tet_printf("Dali::Vector< char > capacity after %d pushbacks is %d", acidCount, charCapacity );
+
+ // erase items
+ for( unsigned int i = 0; i < acidCount; ++i )
+ {
+ pairvector.Erase( pairvector.Begin() + ( i % pairvector.Count() ) );
+ doublevector.Erase( doublevector.Begin() + ( i % doublevector.Count() ) );
+ intptrvector.Erase( intptrvector.Begin() + ( i % intptrvector.Count() ) );
+ actorptrvector.Erase( actorptrvector.Begin() + ( i % actorptrvector.Count() ) );
+ longvector.Erase( longvector.Begin() + ( i % longvector.Count() ) );
+ charvector.Erase( charvector.Begin() + ( i % charvector.Count() ) );
+ }
+ DALI_TEST_EQUALS( ZERO, pairvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( pairCapacity, pairvector.Capacity(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, doublevector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( doubleCapacity, doublevector.Capacity(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, intptrvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( intptrCapacity, intptrvector.Capacity(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, actorptrvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( actorptrCapacity, actorptrvector.Capacity(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, longvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( longCapacity, longvector.Capacity(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, charvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( charCapacity, charvector.Capacity(), TEST_LOCATION );
+
+ END_TEST;
+}
+
+namespace
+{
+
+bool gConstructorCalled = false;
+bool gDestructorCalled = false;
+
+struct ComplexType
+{
+ ComplexType()
+ {
+ gConstructorCalled = true;
+ }
+ ~ComplexType()
+ {
+ gDestructorCalled = true;
+ }
+};
+
+} // anonymous namespace
+
+
+int UtcDaliVectorComplex(void)
+{
+ tet_infoline("Testing Dali::Vector< int* > exception handling");
+
+ // this does not compile at the moment
+/* Vector< ComplexType > classvector;
+ DALI_TEST_EQUALS( ZERO, classvector.Count(), TEST_LOCATION );
+ DALI_TEST_EQUALS( ZERO, classvector.Capacity(), TEST_LOCATION );
+
+ DALI_TEST_EQUALS( false, gConstructorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( false, gDestructorCalled, TEST_LOCATION );
+ classvector.PushBack( ComplexType() );
+ DALI_TEST_EQUALS( true, gConstructorCalled, TEST_LOCATION );
+ classvector.Clear();
+ DALI_TEST_EQUALS( true, gDestructorCalled, TEST_LOCATION );
+*/
+// Vector< Actor > classvector; this does not compile yet either
+ tet_result(TET_PASS); // for now
+ END_TEST;
+}
--- /dev/null
+SET(PKG_NAME "dali")
+
+SET(EXEC_NAME "tct-${PKG_NAME}-core")
+SET(RPM_NAME "core-${PKG_NAME}-tests")
+
+SET(CAPI_LIB "dali")
+
+SET(TC_SOURCES
+ utc-Dali-ActiveConstraint.cpp
+ utc-Dali-Actor.cpp
+ utc-Dali-AlphaFunctions.cpp
+ utc-Dali-AngleAxis.cpp
+ utc-Dali-AnimatableMesh.cpp
+ utc-Dali-Animation.cpp
+ utc-Dali-Any.cpp
+ utc-Dali-BaseHandle.cpp
+ utc-Dali-BitmapImage.cpp
+ utc-Dali-CameraActor.cpp
+ utc-Dali-Character.cpp
+ utc-Dali-Constraint.cpp
+ utc-Dali-CustomActor.cpp
+ utc-Dali-Degree.cpp
+ utc-Dali-EventProcessing.cpp
+ utc-Dali-Font.cpp
+ utc-Dali-FontParameters.cpp
+ utc-Dali-FrameBufferImage.cpp
+ utc-Dali-Gesture.cpp
+ utc-Dali-GestureDetector.cpp
+ utc-Dali-Handle.cpp
+ utc-Dali-Image.cpp
+ utc-Dali-ImageActor.cpp
+ utc-Dali-ImageAttributes.cpp
+ utc-Dali-KeyEvent.cpp
+ utc-Dali-Layer.cpp
+ utc-Dali-LongPressGesture.cpp
+ utc-Dali-LongPressGestureDetector.cpp
+ utc-Dali-Material.cpp
+ utc-Dali-MathUtils.cpp
+ utc-Dali-Matrix.cpp
+ utc-Dali-Matrix3.cpp
+ utc-Dali-MeshActor.cpp
+ utc-Dali-PanGesture.cpp
+ utc-Dali-PanGestureDetector.cpp
+ utc-Dali-PinchGesture.cpp
+ utc-Dali-PinchGestureDetector.cpp
+ utc-Dali-Pixel.cpp
+ utc-Dali-PropertyNotification.cpp
+ utc-Dali-Quaternion.cpp
+ utc-Dali-Radian.cpp
+ utc-Dali-Rect.cpp
+ utc-Dali-RenderTask.cpp
+ utc-Dali-RenderTaskList.cpp
+ utc-Dali-RenderableActor.cpp
+ utc-Dali-ShaderEffect.cpp
+ utc-Dali-SignalTemplatesFunctors.cpp
+ utc-Dali-SignalTemplatesV2.cpp
+ utc-Dali-Stage.cpp
+ utc-Dali-TapGesture.cpp
+ utc-Dali-TapGestureDetector.cpp
+ utc-Dali-Text.cpp
+ utc-Dali-TextActor.cpp
+ utc-Dali-TextStyle.cpp
+ utc-Dali-TouchEventCombiner.cpp
+ utc-Dali-TouchProcessing.cpp
+ utc-Dali-Vector2.cpp
+ utc-Dali-Vector3.cpp
+ utc-Dali-Vector4.cpp
+)
+
+LIST(APPEND TC_SOURCES
+ dali-test-suite-utils/dali-test-suite-utils.cpp
+ dali-test-suite-utils/test-application.cpp
+ dali-test-suite-utils/test-gesture-manager.cpp
+ dali-test-suite-utils/test-gl-abstraction.cpp
+ dali-test-suite-utils/test-gl-sync-abstraction.cpp
+ dali-test-suite-utils/test-native-image.cpp
+ dali-test-suite-utils/test-platform-abstraction.cpp
+ dali-test-suite-utils/test-render-controller.cpp
+ dali-test-suite-utils/test-trace-call-stack.cpp
+)
+
+PKG_CHECK_MODULES(${CAPI_LIB} REQUIRED
+ dali-core
+)
+
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -ggdb --coverage")
+
+FOREACH(directory ${${CAPI_LIB}_LIBRARY_DIRS})
+ SET(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} -L${directory}")
+ENDFOREACH(directory ${CAPI_LIB_LIBRARY_DIRS})
+
+INCLUDE_DIRECTORIES(
+ ${${CAPI_LIB}_INCLUDE_DIRS}
+ dali-test-suite-utils
+)
+
+ADD_EXECUTABLE(${EXEC_NAME} ${EXEC_NAME}.cpp ${TC_SOURCES})
+TARGET_LINK_LIBRARIES(${EXEC_NAME}
+ ${${CAPI_LIB}_LIBRARIES}
+)
+
+INSTALL(PROGRAMS ${EXEC_NAME}
+ DESTINATION ${BIN_DIR}/${EXEC_NAME}
+)
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+// INTERNAL INCLUDES
+#include <dali/dali.h>
+#include <stdarg.h>
+
+#include "dali-test-suite-utils.h"
+
+using namespace Dali;
+
+int test_return_value = TET_UNDEF;
+
+void tet_result(int value)
+{
+ // First TET_PASS should set to zero
+ // first TET_FAIL should prevent any further TET_PASS from setting back to zero
+ // Any TET_FAIL should set to fail or leave as fail
+ if( test_return_value != 1 )
+ test_return_value = value;
+}
+
+#define END_TEST \
+ return ((test_return_value>0)?1:0)
+
+
+void tet_infoline(const char* str)
+{
+ fprintf(stderr, "%s\n", str);
+}
+
+void tet_printf(const char *format, ...)
+{
+ va_list arg;
+ va_start(arg, format);
+ vfprintf(stderr, format, arg);
+ va_end(arg);
+}
+
+/**
+ * DALI_TEST_CHECK is a wrapper for tet_result.
+ * If the condition evaluates to false, then the function & line number is printed.
+ * @param[in] The boolean expression to check
+ */
+#define DALI_TEST_CHECK(condition) \
+if ( (condition) ) \
+{ \
+ tet_result(TET_PASS); \
+} \
+else \
+{ \
+ fprintf(stderr, "%s Failed in %s at line %d\n", __PRETTY_FUNCTION__, __FILE__, __LINE__); \
+ tet_result(TET_FAIL); \
+}
+
+bool operator==(TimePeriod a, TimePeriod b)
+{
+ return Equals(a.durationSeconds, b.durationSeconds) && Equals(a.delaySeconds, b.delaySeconds) ;
+}
+
+std::ostream& operator<< (std::ostream& o, const TimePeriod value)
+{
+ return o << "( Duration:" << value.durationSeconds << " Delay:" << value.delaySeconds << ")";
+}
+
+void DALI_TEST_EQUALS( const Matrix3& matrix1, const Matrix3& matrix2, const char* location)
+{
+ const float* m1 = matrix1.AsFloat();
+ const float* m2 = matrix2.AsFloat();
+ bool equivalent = true;
+
+ for (int i=0;i<9;++i)
+ {
+ equivalent &= (m1[i] != m2[i]);
+ }
+
+ if (!equivalent)
+ {
+ fprintf(stderr, "%s, checking\n"
+ "(%f, %f, %f) (%f, %f, %f)\n"
+ "(%f, %f, %f) == (%f, %f, %f)\n"
+ "(%f, %f, %f) (%f, %f, %f)\n",
+ location,
+ m1[0], m1[1], m1[2], m2[0], m2[1], m2[2],
+ m1[3], m1[4], m1[5], m2[3], m2[4], m2[5],
+ m1[6], m1[7], m1[8], m2[6], m2[7], m2[8]);
+
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+}
+
+void DALI_TEST_EQUALS( const Matrix3& matrix1, const Matrix3& matrix2, float epsilon, const char* location)
+{
+ const float* m1 = matrix1.AsFloat();
+ const float* m2 = matrix2.AsFloat();
+ bool equivalent = true;
+
+ for (int i=0;i<9;++i)
+ {
+ equivalent &= (fabsf(m1[i] - m2[i])<epsilon);
+ }
+
+ if (!equivalent)
+ {
+ fprintf(stderr, "%s, checking\n"
+ "(%f, %f, %f) (%f, %f, %f)\n"
+ "(%f, %f, %f) == (%f, %f, %f)\n"
+ "(%f, %f, %f) (%f, %f, %f)\n",
+ location,
+ m1[0], m1[1], m1[2], m2[0], m2[1], m2[2],
+ m1[3], m1[4], m1[5], m2[3], m2[4], m2[5],
+ m1[6], m1[7], m1[8], m2[6], m2[7], m2[8]);
+
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+}
+
+void DALI_TEST_EQUALS( const Matrix& matrix1, const Matrix& matrix2, const char* location)
+{
+ const float* m1 = matrix1.AsFloat();
+ const float* m2 = matrix2.AsFloat();
+ bool identical = true;
+
+ int i;
+ for (i=0;i<16;++i)
+ {
+ if(m1[i] != m2[i])
+ {
+ identical = false;
+ break;
+ }
+ }
+
+ if (!identical)
+ {
+ fprintf(stderr, "%s, checking\n"
+ "(%f, %f, %f, %f) (%f, %f, %f, %f)\n"
+ "(%f, %f, %f, %f) == (%f, %f, %f, %f)\n"
+ "(%f, %f, %f, %f) (%f, %f, %f, %f)\n"
+ "(%f, %f, %f, %f) (%f, %f, %f, %f)\n", location,
+ m1[0], m1[1], m1[2], m1[3], m2[0], m2[1], m2[2], m2[3],
+ m1[4], m1[5], m1[6], m1[7], m2[4], m2[5], m2[6], m2[7],
+ m1[8], m1[9], m1[10], m1[11], m2[8], m2[9], m2[10], m2[11],
+ m1[12], m1[13], m1[14], m1[15], m2[12], m2[13], m2[14], m2[15]);
+
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+}
+
+void DALI_TEST_EQUALS( const Matrix& matrix1, const Matrix& matrix2, float epsilon, const char* location)
+{
+ const float* m1 = matrix1.AsFloat();
+ const float* m2 = matrix2.AsFloat();
+ bool equivalent = true;
+
+ for (int i=0;i<16;++i)
+ {
+ equivalent &= (fabsf(m1[i] - m2[i])<epsilon);
+ }
+
+ if (!equivalent)
+ {
+ fprintf(stderr, "%s, checking\n"
+ "(%f, %f, %f, %f) (%f, %f, %f, %f)\n"
+ "(%f, %f, %f, %f) == (%f, %f, %f, %f)\n"
+ "(%f, %f, %f, %f) (%f, %f, %f, %f)\n"
+ "(%f, %f, %f, %f) (%f, %f, %f, %f)\n", location,
+ m1[0], m1[1], m1[2], m1[3], m2[0], m2[1], m2[2], m2[3],
+ m1[4], m1[5], m1[6], m1[7], m2[4], m2[5], m2[6], m2[7],
+ m1[8], m1[9], m1[10], m1[11], m2[8], m2[9], m2[10], m2[11],
+ m1[12], m1[13], m1[14], m1[15], m2[12], m2[13], m2[14], m2[15]);
+
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+}
+
+
+/**
+ * Test whether two strings are equal.
+ * @param[in] str1 The first string
+ * @param[in] str2 The second string
+ * @param[in] location The TEST_LOCATION macro should be used here
+ */
+void DALI_TEST_EQUALS( const std::string &str1, const char* str2, const char* location)
+{
+ DALI_TEST_EQUALS(str1.c_str(), str2, location);
+}
+
+/**
+ * Test whether two strings are equal.
+ * @param[in] str1 The first string
+ * @param[in] str2 The second string
+ * @param[in] location The TEST_LOCATION macro should be used here
+ */
+void DALI_TEST_EQUALS( const char* str1, const std::string &str2, const char* location)
+{
+ DALI_TEST_EQUALS(str1, str2.c_str(), location);
+}
+
+
+/**
+ * Test whether one unsigned integer value is greater than another.
+ * Test succeeds if value1 > value2
+ * @param[in] value1 The first value
+ * @param[in] value2 The second value
+ * @param[in] location The TEST_LOCATION macro should be used here
+ */
+void DALI_TEST_GREATER(unsigned int value1, unsigned int value2, const char* location)
+{
+ if (!(value1 > value2))
+ {
+ fprintf(stderr, "%s, checking %d > %d\n", location, value1, value2);
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+}
+
+/**
+ * Test whether one float value is greater than another.
+ * Test succeeds if value1 > value2
+ * @param[in] value1 The first value
+ * @param[in] value2 The second value
+ * @param[in] location The TEST_LOCATION macro should be used here
+ */
+void DALI_TEST_GREATER( float value1, float value2, const char* location)
+{
+ if (!(value1 > value2))
+ {
+ fprintf(stderr, "%s, checking %f > %f\n", location, value1, value2);
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+}
+
+/**
+ * Test whether the assertion condition that failed and thus triggered the
+ * exception \b e contained a given substring at the start of its literal text.
+ * @param[in] e The exception that we expect was fired by a runtime assertion
+ * failure.
+ * @param[in] conditionSubString The text that we expect to be present in an
+ * assertion which triggered the exception.
+ * @param[in] location The TEST_LOCATION macro should be used here.
+ *
+ * @remark **Side-effects:** The result of the tet test is set to TET_PASS if
+ * the substring is at the start of the exception's condition and
+ * TET_FAIL if it isn't. Note, if the result of a test is set multiple
+ * times, a TET_FAIL will override any number of TET_PASSes.
+ */
+void DALI_TEST_ASSERT( DaliException& e, std::string conditionSubString, const char* location )
+{
+ if( 0u != e.mCondition.find( conditionSubString ))
+ {
+ fprintf(stderr, "Assertion %s failed at %s\n", conditionSubString.c_str(), location);
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+}
+
+/** Self-documenting wrapper for DALI_TEST_ASSERT.
+ * @copydoc DALI_TEST_ASSERT()
+ */
+void DALI_TEST_ASSERT_CONDITION_STARTS_WITH_SUBSTRING( DaliException& exceptionFromAssertion, std::string conditionSubString, const char* location )
+{
+ DALI_TEST_ASSERT(exceptionFromAssertion, conditionSubString, location);
+}
+
+// Functor to test whether an Applied signal is emitted
+ConstraintAppliedCheck::ConstraintAppliedCheck( bool& signalReceived )
+: mSignalReceived( signalReceived )
+{
+}
+
+void ConstraintAppliedCheck::operator()( ActiveConstraint& constraint )
+{
+ mSignalReceived = true;
+}
+
+void ConstraintAppliedCheck::Reset()
+{
+ mSignalReceived = false;
+}
+
+void ConstraintAppliedCheck::CheckSignalReceived()
+{
+ if ( !mSignalReceived )
+ {
+ fprintf(stderr, "Expected Applied signal was not received\n" );
+ tet_result( TET_FAIL );
+ }
+ else
+ {
+ tet_result( TET_PASS );
+ }
+}
+
+void ConstraintAppliedCheck::CheckSignalNotReceived()
+{
+ if ( mSignalReceived )
+ {
+ fprintf(stderr, "Unexpected Applied signal was received\n" );
+ tet_result( TET_FAIL );
+ }
+ else
+ {
+ tet_result( TET_PASS );
+ }
+}
+
+BitmapImage CreateBitmapImage()
+{
+ BitmapImage image = BitmapImage::New(4,4,Pixel::RGBA8888);
+
+ PixelBuffer* pixbuf = image.GetBuffer();
+
+ // Using a 4x4 image gives a better blend with the GL implementation
+ // than a 3x3 image
+ for(size_t i=0; i<16; i++)
+ {
+ pixbuf[i*4+0] = 0xFF;
+ pixbuf[i*4+1] = 0xFF;
+ pixbuf[i*4+2] = 0xFF;
+ pixbuf[i*4+3] = 0xFF;
+ }
+
+ return image;
+}
--- /dev/null
+#ifndef __DALI_TEST_SUITE_UTILS_H__
+#define __DALI_TEST_SUITE_UTILS_H__
+
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+// INTERNAL INCLUDES
+#include <dali/dali.h>
+#include <stdarg.h>
+
+void tet_infoline(const char*str);
+void tet_printf(const char *format, ...);
+
+#include "test-application.h"
+
+using namespace Dali;
+
+#define STRINGIZE_I(text) #text
+#define STRINGIZE(text) STRINGIZE_I(text)
+
+// the following is the other compilers way of token pasting, gcc seems to just concatenate strings automatically
+//#define TOKENPASTE(x,y) x ## y
+#define TOKENPASTE(x,y) x y
+#define TOKENPASTE2(x,y) TOKENPASTE( x, y )
+#define TEST_LOCATION TOKENPASTE2( "Test failed in ", TOKENPASTE2( __FILE__, TOKENPASTE2( ", line ", STRINGIZE(__LINE__) ) ) )
+
+#define TET_UNDEF 2
+#define TET_FAIL 1
+#define TET_PASS 0
+
+extern int test_return_value;
+
+void tet_result(int value);
+
+#define END_TEST \
+ return ((test_return_value>0)?1:0)
+
+void tet_infoline(const char* str);
+void tet_printf(const char *format, ...);
+
+/**
+ * DALI_TEST_CHECK is a wrapper for tet_result.
+ * If the condition evaluates to false, then the function & line number is printed.
+ * @param[in] The boolean expression to check
+ */
+#define DALI_TEST_CHECK(condition) \
+if ( (condition) ) \
+{ \
+ tet_result(TET_PASS); \
+} \
+else \
+{ \
+ fprintf(stderr, "%s Failed in %s at line %d\n", __PRETTY_FUNCTION__, __FILE__, __LINE__); \
+ tet_result(TET_FAIL); \
+}
+
+template <typename Type>
+inline bool CompareType(Type value1, Type value2, float epsilon);
+
+/**
+ * A helper for fuzzy-comparing Vector2 objects
+ * @param[in] vector1 the first object
+ * @param[in] vector2 the second object
+ * @param[in] epsilon difference threshold
+ * @returns true if difference is smaller than epsilon threshold, false otherwise
+ */
+template <>
+inline bool CompareType<float>(float value1, float value2, float epsilon)
+{
+ return fabsf(value1 - value2) < epsilon;
+}
+
+/**
+ * A helper for fuzzy-comparing Vector2 objects
+ * @param[in] vector1 the first object
+ * @param[in] vector2 the second object
+ * @param[in] epsilon difference threshold
+ * @returns true if difference is smaller than epsilon threshold, false otherwise
+ */
+template <>
+inline bool CompareType<Vector2>(Vector2 vector1, Vector2 vector2, float epsilon)
+{
+ return fabsf(vector1.x - vector2.x)<epsilon && fabsf(vector1.y - vector2.y)<epsilon;
+}
+
+/**
+ * A helper for fuzzy-comparing Vector3 objects
+ * @param[in] vector1 the first object
+ * @param[in] vector2 the second object
+ * @param[in] epsilon difference threshold
+ * @returns true if difference is smaller than epsilon threshold, false otherwise
+ */
+template <>
+inline bool CompareType<Vector3>(Vector3 vector1, Vector3 vector2, float epsilon)
+{
+ return fabsf(vector1.x - vector2.x)<epsilon &&
+ fabsf(vector1.y - vector2.y)<epsilon &&
+ fabsf(vector1.z - vector2.z)<epsilon;
+}
+
+
+/**
+ * A helper for fuzzy-comparing Vector4 objects
+ * @param[in] vector1 the first object
+ * @param[in] vector2 the second object
+ * @param[in] epsilon difference threshold
+ * @returns true if difference is smaller than epsilon threshold, false otherwise
+ */
+template <>
+inline bool CompareType<Vector4>(Vector4 vector1, Vector4 vector2, float epsilon)
+{
+ return fabsf(vector1.x - vector2.x)<epsilon &&
+ fabsf(vector1.y - vector2.y)<epsilon &&
+ fabsf(vector1.z - vector2.z)<epsilon &&
+ fabsf(vector1.w - vector2.w)<epsilon;
+}
+
+template <>
+inline bool CompareType<Quaternion>(Quaternion q1, Quaternion q2, float epsilon)
+{
+ Quaternion q2N = -q2; // These quaternions represent the same rotation
+ return CompareType<Vector4>(q1.mVector, q2.mVector, epsilon) || CompareType<Vector4>(q1.mVector, q2N.mVector, epsilon);
+}
+
+template <>
+inline bool CompareType<Radian>(Radian q1, Radian q2, float epsilon)
+{
+ return CompareType<float>(float(q1), float(q2), epsilon);
+}
+
+template <>
+inline bool CompareType<Degree>(Degree q1, Degree q2, float epsilon)
+{
+ return CompareType<float>(float(q1), float(q2), epsilon);
+}
+
+bool operator==(TimePeriod a, TimePeriod b);
+std::ostream& operator<< (std::ostream& o, const TimePeriod value);
+
+/**
+ * Test whether two values are equal.
+ * @param[in] value1 The first value
+ * @param[in] value2 The second value
+ * @param[in] location The TEST_LOCATION macro should be used here
+ */
+template<typename TypeA, typename TypeB>
+inline void DALI_TEST_EQUALS(TypeA value1, TypeB value2, const char* location)
+{
+ if (!(value1 == value2))
+ {
+ std::ostringstream o;
+ o << value1 << " == " << value2 << std::endl;
+ fprintf(stderr, "%s, checking %s", location, o.str().c_str());
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+}
+
+template<typename Type>
+inline void DALI_TEST_EQUALS(Type value1, Type value2, float epsilon, const char* location)
+{
+ if( !CompareType<Type>(value1, value2, epsilon) )
+ {
+ std::ostringstream o;
+ o << value1 << " == " << value2 << std::endl;
+ fprintf(stderr, "%s, checking %s", location, o.str().c_str());
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+}
+
+/**
+ * Test whether two TimePeriods are within a certain distance of each other.
+ * @param[in] value1 The first value
+ * @param[in] value2 The second value
+ * @param[in] epsilon The values must be within this distance of each other
+ * @param[in] location The TEST_LOCATION macro should be used here
+ */
+template<>
+inline void DALI_TEST_EQUALS<TimePeriod>( TimePeriod value1, TimePeriod value2, float epsilon, const char* location)
+{
+ if ((fabs(value1.durationSeconds - value2.durationSeconds) > epsilon))
+ {
+ fprintf(stderr, "%s, checking durations %f == %f, epsilon %f\n", location, value1.durationSeconds, value2.durationSeconds, epsilon);
+ tet_result(TET_FAIL);
+ }
+ else if ((fabs(value1.delaySeconds - value2.delaySeconds) > epsilon))
+ {
+ fprintf(stderr, "%s, checking delays %f == %f, epsilon %f\n", location, value1.delaySeconds, value2.delaySeconds, epsilon);
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+}
+
+/**
+ * Test whether two Matrix3 objects are equal.
+ * @param[in] matrix1 The first object
+ * @param[in] matrix2 The second object
+ * @param[in] location The TEST_LOCATION macro should be used here
+ */
+void DALI_TEST_EQUALS( const Matrix3& matrix1, const Matrix3& matrix2, const char* location);
+
+/** Test whether two Matrix3 objects are equal (fuzzy compare).
+ * @param[in] matrix1 The first object
+ * @param[in] matrix2 The second object
+ * @param[in] epsilon The epsilon to use for comparison
+ * @param[in] location The TEST_LOCATION macro should be used here
+ */
+void DALI_TEST_EQUALS( const Matrix3& matrix1, const Matrix3& matrix2, float epsilon, const char* location);
+
+/**
+ * Test whether two Matrix objects are equal.
+ * @param[in] matrix1 The first object
+ * @param[in] matrix2 The second object
+ * @param[in] location The TEST_LOCATION macro should be used here
+ */
+void DALI_TEST_EQUALS( const Matrix& matrix1, const Matrix& matrix2, const char* location);
+
+/**
+ * Test whether two Matrix objects are equal (fuzzy-compare).
+ * @param[in] matrix1 The first object
+ * @param[in] matrix2 The second object
+ * @param[in] location The TEST_LOCATION macro should be used here
+ */
+void DALI_TEST_EQUALS( const Matrix& matrix1, const Matrix& matrix2, float epsilon, const char* location);
+
+/**
+ * Test whether two strings are equal.
+ * @param[in] str1 The first string
+ * @param[in] str2 The second string
+ * @param[in] location The TEST_LOCATION macro should be used here
+ */
+template<>
+inline void DALI_TEST_EQUALS<const char*>( const char* str1, const char* str2, const char* location)
+{
+ if (strcmp(str1, str2))
+ {
+ fprintf(stderr, "%s, checking '%s' == '%s'\n", location, str1, str2);
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+}
+
+/**
+ * Test whether two strings are equal.
+ * @param[in] str1 The first string
+ * @param[in] str2 The second string
+ * @param[in] location The TEST_LOCATION macro should be used here
+ */
+template<>
+inline void DALI_TEST_EQUALS<const std::string&>( const std::string &str1, const std::string &str2, const char* location)
+{
+ DALI_TEST_EQUALS(str1.c_str(), str2.c_str(), location);
+}
+
+/**
+ * Test whether two strings are equal.
+ * @param[in] str1 The first string
+ * @param[in] str2 The second string
+ * @param[in] location The TEST_LOCATION macro should be used here
+ */
+void DALI_TEST_EQUALS( const std::string &str1, const char* str2, const char* location);
+
+/**
+ * Test whether two strings are equal.
+ * @param[in] str1 The first string
+ * @param[in] str2 The second string
+ * @param[in] location The TEST_LOCATION macro should be used here
+ */
+void DALI_TEST_EQUALS( const char* str1, const std::string &str2, const char* location);
+
+
+/**
+ * Test whether two UTF32 strings are equal.
+ * @param[in] str1 The first string
+ * @param[in] str2 The second string
+ * @param[in] location The TEST_LOCATION macro should be used here
+ */
+template<>
+inline void DALI_TEST_EQUALS<const TextArray&>( const TextArray& str1, const TextArray& str2, const char* location)
+{
+ if (!std::equal(str1.begin(), str1.end(), str2.begin()))
+ {
+ fprintf(stderr, "%s, checking '", location);
+
+ for( unsigned int i = 0; i < str1.size(); ++i)
+ {
+ fprintf(stderr, "%c", str1[i]);
+ }
+
+ fprintf(stderr, "' == '");
+
+ for( unsigned int i = 0; i < str2.size(); ++i)
+ {
+ fprintf(stderr, "%c", str2[i]);
+ }
+
+ fprintf(stderr, "'\n");
+
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+}
+
+/**
+ * Test whether one unsigned integer value is greater than another.
+ * Test succeeds if value1 > value2
+ * @param[in] value1 The first value
+ * @param[in] value2 The second value
+ * @param[in] location The TEST_LOCATION macro should be used here
+ */
+void DALI_TEST_GREATER(unsigned int value1, unsigned int value2, const char* location);
+
+/**
+ * Test whether one float value is greater than another.
+ * Test succeeds if value1 > value2
+ * @param[in] value1 The first value
+ * @param[in] value2 The second value
+ * @param[in] location The TEST_LOCATION macro should be used here
+ */
+void DALI_TEST_GREATER( float value1, float value2, const char* location);
+
+/**
+ * Test whether the assertion condition that failed and thus triggered the
+ * exception \b e contained a given substring at the start of its literal text.
+ * @param[in] e The exception that we expect was fired by a runtime assertion
+ * failure.
+ * @param[in] conditionSubString The text that we expect to be present in an
+ * assertion which triggered the exception.
+ * @param[in] location The TEST_LOCATION macro should be used here.
+ *
+ * @remark **Side-effects:** The result of the tet test is set to TET_PASS if
+ * the substring is at the start of the exception's condition and
+ * TET_FAIL if it isn't. Note, if the result of a test is set multiple
+ * times, a TET_FAIL will override any number of TET_PASSes.
+ */
+void DALI_TEST_ASSERT( DaliException& e, std::string conditionSubString, const char* location );
+
+/** Self-documenting wrapper for DALI_TEST_ASSERT.
+ * @copydoc DALI_TEST_ASSERT()
+ */
+void DALI_TEST_ASSERT_CONDITION_STARTS_WITH_SUBSTRING( DaliException& exceptionFromAssertion, std::string conditionSubString, const char* location );
+
+
+// Functor to test whether an Applied signal is emitted
+struct ConstraintAppliedCheck
+{
+ ConstraintAppliedCheck( bool& signalReceived );
+ void operator()( ActiveConstraint& constraint );
+ void Reset();
+ void CheckSignalReceived();
+ void CheckSignalNotReceived();
+ bool& mSignalReceived; // owned by individual tests
+};
+
+/**
+ * A Helper to test default functions
+ */
+template <typename T>
+struct DefaultFunctionCoverage
+{
+ DefaultFunctionCoverage()
+ {
+ T a;
+ T *b = new T(a);
+ DALI_TEST_CHECK(b);
+ a = *b;
+ delete b;
+ }
+};
+
+
+// Helper to Create bitmap image
+BitmapImage CreateBitmapImage();
+
+#endif // __DALI_TEST_SUITE_UTILS_H__
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "test-application.h"
+
+namespace Dali
+{
+
+
+TestApplication::TestApplication( size_t surfaceWidth,
+ size_t surfaceHeight,
+ float horizontalDpi,
+ float verticalDpi)
+: mCore( NULL ),
+ mSurfaceWidth( surfaceWidth ),
+ mSurfaceHeight( surfaceHeight ),
+ mFrame( 0u ),
+ mDpi( horizontalDpi, verticalDpi )
+{
+ Initialize();
+}
+
+TestApplication::TestApplication( bool initialize,
+ size_t surfaceWidth,
+ size_t surfaceHeight,
+ float horizontalDpi,
+ float verticalDpi )
+: mCore( NULL ),
+ mSurfaceWidth( surfaceWidth ),
+ mSurfaceHeight( surfaceHeight ),
+ mFrame( 0u ),
+ mDpi( horizontalDpi, verticalDpi )
+{
+ if ( initialize )
+ {
+ Initialize();
+ }
+}
+
+void TestApplication::Initialize()
+{
+ mCore = Dali::Integration::Core::New(
+ mRenderController,
+ mPlatformAbstraction,
+ mGlAbstraction,
+ mGlSyncAbstraction,
+ mGestureManager );
+
+ mCore->ContextCreated();
+ mCore->SurfaceResized( mSurfaceWidth, mSurfaceHeight );
+ mCore->SetDpi( mDpi.x, mDpi.y );
+
+ Dali::Integration::Log::LogFunction logFunction(&TestApplication::LogMessage);
+ Dali::Integration::Log::InstallLogFunction(logFunction);
+}
+
+TestApplication::~TestApplication()
+{
+ Dali::Integration::Log::UninstallLogFunction();
+ delete mCore;
+}
+
+void TestApplication::LogMessage(Dali::Integration::Log::DebugPriority level, std::string& message)
+{
+ switch(level)
+ {
+ case Dali::Integration::Log::DebugInfo:
+ fprintf(stderr, "INFO: %s", message.c_str());
+ break;
+ case Dali::Integration::Log::DebugWarning:
+ fprintf(stderr, "WARN: %s", message.c_str());
+ break;
+ case Dali::Integration::Log::DebugError:
+ fprintf(stderr, "ERROR: %s", message.c_str());
+ break;
+ default:
+ fprintf(stderr, "DEFAULT: %s", message.c_str());
+ break;
+ }
+}
+
+Dali::Integration::Core& TestApplication::GetCore()
+{
+ return *mCore;
+}
+
+TestPlatformAbstraction& TestApplication::GetPlatform()
+{
+ return mPlatformAbstraction;
+}
+
+TestRenderController& TestApplication::GetRenderController()
+{
+ return mRenderController;
+}
+
+TestGlAbstraction& TestApplication::GetGlAbstraction()
+{
+ return mGlAbstraction;
+}
+
+TestGlSyncAbstraction& TestApplication::GetGlSyncAbstraction()
+{
+ return mGlSyncAbstraction;
+}
+
+TestGestureManager& TestApplication::GetGestureManager()
+{
+ return mGestureManager;
+}
+
+void TestApplication::ProcessEvent(const Integration::Event& event)
+{
+ mCore->QueueEvent(event);
+ mCore->ProcessEvents();
+}
+
+void TestApplication::SendNotification()
+{
+ mCore->ProcessEvents();
+}
+
+void TestApplication::SetSurfaceWidth( unsigned int width, unsigned height )
+{
+ mSurfaceWidth = width;
+ mSurfaceHeight = height;
+
+ mCore->SurfaceResized( mSurfaceWidth, mSurfaceHeight );
+}
+
+bool TestApplication::Render( unsigned int intervalMilliseconds )
+{
+ // Update Time values
+ mPlatformAbstraction.IncrementGetTimeResult( intervalMilliseconds );
+ unsigned int seconds(0u), microseconds(0u);
+ mPlatformAbstraction.GetTimeMicroseconds( seconds, microseconds );
+
+ mCore->VSync( mFrame, seconds, microseconds );
+ mCore->Update( mStatus );
+ mCore->Render( mRenderStatus );
+
+ mFrame++;
+
+ return mStatus.KeepUpdating() || mRenderStatus.NeedsUpdate();
+}
+
+unsigned int TestApplication::GetUpdateStatus()
+{
+ return mStatus.KeepUpdating();
+}
+
+bool TestApplication::UpdateOnly( unsigned int intervalMilliseconds )
+{
+ // Update Time values
+ mPlatformAbstraction.IncrementGetTimeResult( intervalMilliseconds );
+ unsigned int seconds(0u), microseconds(0u);
+ mPlatformAbstraction.GetTimeMicroseconds( seconds, microseconds );
+
+ mCore->VSync( mFrame, seconds, microseconds );
+ mCore->Update( mStatus );
+
+ return mStatus.KeepUpdating();
+}
+
+bool TestApplication::RenderOnly( )
+{
+ // Update Time values
+ mCore->Render( mRenderStatus );
+
+ mFrame++;
+
+ return mRenderStatus.NeedsUpdate();
+}
+
+void TestApplication::ResetContext()
+{
+ mCore->ContextToBeDestroyed();
+ mCore->ContextCreated();
+}
+
+
+} // Namespace dali
--- /dev/null
+#ifndef __DALI_TEST_APPLICATION_H__
+#define __DALI_TEST_APPLICATION_H__
+
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+// INTERNAL INCLUDES
+#include <test-platform-abstraction.h>
+#include "test-gesture-manager.h"
+#include "test-gl-sync-abstraction.h"
+#include "test-gl-abstraction.h"
+#include "test-render-controller.h"
+#include <dali/public-api/common/dali-common.h>
+
+namespace Dali
+{
+
+class DALI_IMPORT_API TestApplication : public ConnectionTracker
+{
+public:
+
+ // Default values derived from H2 device.
+ static const unsigned int DEFAULT_SURFACE_WIDTH = 480;
+ static const unsigned int DEFAULT_SURFACE_HEIGHT = 800;
+
+#ifdef _CPP11
+ static constexpr float DEFAULT_HORIZONTAL_DPI = 220.0f;
+ static constexpr float DEFAULT_VERTICAL_DPI = 217.0f;
+#else
+ static const float DEFAULT_HORIZONTAL_DPI = 220.0f;
+ static const float DEFAULT_VERTICAL_DPI = 217.0f;
+#endif
+
+ static const unsigned int DEFAULT_RENDER_INTERVAL = 1;
+
+ TestApplication( size_t surfaceWidth = DEFAULT_SURFACE_WIDTH,
+ size_t surfaceHeight = DEFAULT_SURFACE_HEIGHT,
+ float horizontalDpi = DEFAULT_HORIZONTAL_DPI,
+ float verticalDpi = DEFAULT_VERTICAL_DPI );
+
+ TestApplication( bool initialize,
+ size_t surfaceWidth = DEFAULT_SURFACE_WIDTH,
+ size_t surfaceHeight = DEFAULT_SURFACE_HEIGHT,
+ float horizontalDpi = DEFAULT_HORIZONTAL_DPI,
+ float verticalDpi = DEFAULT_VERTICAL_DPI );
+
+ void Initialize();
+ virtual ~TestApplication();
+ static void LogMessage(Dali::Integration::Log::DebugPriority level, std::string& message);
+ Dali::Integration::Core& GetCore();
+ TestPlatformAbstraction& GetPlatform();
+ TestRenderController& GetRenderController();
+ TestGlAbstraction& GetGlAbstraction();
+ TestGlSyncAbstraction& GetGlSyncAbstraction();
+ TestGestureManager& GetGestureManager();
+ void ProcessEvent(const Integration::Event& event);
+ void SendNotification();
+ void SetSurfaceWidth( unsigned int width, unsigned height );
+ bool Render( unsigned int intervalMilliseconds = DEFAULT_RENDER_INTERVAL );
+ unsigned int GetUpdateStatus();
+ bool UpdateOnly( unsigned int intervalMilliseconds = DEFAULT_RENDER_INTERVAL );
+ bool RenderOnly( );
+ void ResetContext();
+
+protected:
+ TestPlatformAbstraction mPlatformAbstraction;
+ TestRenderController mRenderController;
+ TestGlAbstraction mGlAbstraction;
+ TestGlSyncAbstraction mGlSyncAbstraction;
+ TestGestureManager mGestureManager;
+
+ Integration::UpdateStatus mStatus;
+ Integration::RenderStatus mRenderStatus;
+
+ Integration::Core* mCore;
+
+ unsigned int mSurfaceWidth;
+ unsigned int mSurfaceHeight;
+ unsigned int mFrame;
+
+ Vector2 mDpi;
+};
+
+} // Dali
+
+#endif
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "test-gesture-manager.h"
+
+namespace Dali
+{
+
+TestGestureManager::TestGestureManager()
+{
+ Initialize();
+}
+
+/**
+ * Destructor
+ */
+TestGestureManager::~TestGestureManager()
+{
+}
+
+/**
+ * @copydoc Dali::Integration::GestureManager::Register(Gesture::Type)
+ */
+void TestGestureManager::Register(const Integration::GestureRequest& request)
+{
+ mFunctionsCalled.Register = true;
+}
+
+/**
+ * @copydoc Dali::Integration::GestureManager::Unregister(Gesture::Type)
+ */
+void TestGestureManager::Unregister(const Integration::GestureRequest& request)
+{
+ mFunctionsCalled.Unregister = true;
+}
+
+/**
+ * @copydoc Dali::Integration::GestureManager::Update(Gesture::Type)
+ */
+void TestGestureManager::Update(const Integration::GestureRequest& request)
+{
+ mFunctionsCalled.Update = true;
+}
+
+
+/** Call this every test */
+void TestGestureManager::Initialize()
+{
+ mFunctionsCalled.Reset();
+}
+
+bool TestGestureManager::WasCalled(TestFuncEnum func)
+{
+ switch(func)
+ {
+ case RegisterType: return mFunctionsCalled.Register;
+ case UnregisterType: return mFunctionsCalled.Unregister;
+ case UpdateType: return mFunctionsCalled.Update;
+ }
+ return false;
+}
+
+void TestGestureManager::ResetCallStatistics(TestFuncEnum func)
+{
+ switch(func)
+ {
+ case RegisterType: mFunctionsCalled.Register = false; break;
+ case UnregisterType: mFunctionsCalled.Unregister = false; break;
+ case UpdateType: mFunctionsCalled.Update = false; break;
+ }
+}
+
+TestGestureManager::TestFunctions::TestFunctions()
+: Register(false),
+ Unregister(false),
+ Update(false)
+{
+}
+
+void TestGestureManager::TestFunctions::Reset()
+{
+ Register = false;
+ Unregister = false;
+ Update = false;
+}
+
+
+
+} // namespace Dali
--- /dev/null
+#ifndef __DALI_TEST_GESTURE_MANAGER_H__
+#define __DALI_TEST_GESTURE_MANAGER_H__
+
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+// INTERNAL INCLUDES
+#include <dali/integration-api/gesture-manager.h>
+#include <dali/public-api/common/dali-common.h>
+
+namespace Dali
+{
+
+/**
+ * Concrete implementation of the gesture manager class.
+ */
+class DALI_IMPORT_API TestGestureManager : public Dali::Integration::GestureManager
+{
+
+public:
+
+ /**
+ * Constructor
+ */
+ TestGestureManager();
+
+ /**
+ * Destructor
+ */
+ virtual ~TestGestureManager();
+
+ /**
+ * @copydoc Dali::Integration::GestureManager::Register(Gesture::Type)
+ */
+ virtual void Register(const Integration::GestureRequest& request);
+
+ /**
+ * @copydoc Dali::Integration::GestureManager::Unregister(Gesture::Type)
+ */
+ virtual void Unregister(const Integration::GestureRequest& request);
+
+ /**
+ * @copydoc Dali::Integration::GestureManager::Update(Gesture::Type)
+ */
+ virtual void Update(const Integration::GestureRequest& request);
+
+public: // TEST FUNCTIONS
+
+ // Enumeration of Gesture Manager methods
+ enum TestFuncEnum
+ {
+ RegisterType,
+ UnregisterType,
+ UpdateType,
+ };
+
+ /** Call this every test */
+ void Initialize();
+ bool WasCalled(TestFuncEnum func);
+ void ResetCallStatistics(TestFuncEnum func);
+
+private:
+
+ struct TestFunctions
+ {
+ TestFunctions();
+ void Reset();
+
+ bool Register;
+ bool Unregister;
+ bool Update;
+ };
+
+ TestFunctions mFunctionsCalled;
+};
+
+} // Dali
+
+#endif // __DALI_TEST_GESTURE_MANAGER_H__
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "test-gl-abstraction.h"
+
+namespace Dali
+{
+
+TestGlAbstraction::TestGlAbstraction()
+{
+ Initialize();
+}
+
+TestGlAbstraction::~TestGlAbstraction() {}
+
+void TestGlAbstraction::Initialize()
+{
+ mCurrentProgram = 0;
+ mCompileStatus = GL_TRUE;
+ mLinkStatus = GL_TRUE;
+
+ mGetAttribLocationResult = 0;
+ mGetErrorResult = 0;
+ mGetStringResult = NULL;
+ mIsBufferResult = 0;
+ mIsEnabledResult = 0;
+ mIsFramebufferResult = 0;
+ mIsProgramResult = 0;
+ mIsRenderbufferResult = 0;
+ mIsShaderResult = 0;
+ mIsTextureResult = 0;
+ mVertexAttribArrayChanged = false;
+
+ mCheckFramebufferStatusResult = 0;
+ mNumBinaryFormats = 1;
+ mBinaryFormats = 1;
+ mProgramBinaryLength = 0;
+
+ mLastAutoTextureIdUsed = 0;
+
+ mLastShaderIdUsed = 0;
+ mLastProgramIdUsed = 0;
+ mLastUniformIdUsed = 0;
+ mLastShaderCompiled = 0;
+
+ mLastBlendEquationRgb = 0;
+ mLastBlendEquationAlpha = 0;
+ mLastBlendFuncSrcRgb = 0;
+ mLastBlendFuncDstRgb = 0;
+ mLastBlendFuncSrcAlpha = 0;
+ mLastBlendFuncDstAlpha = 0;
+
+ mUniforms.clear();
+ mProgramUniforms1i.clear();
+ mProgramUniforms1f.clear();
+ mProgramUniforms2f.clear();
+ mProgramUniforms3f.clear();
+ mProgramUniforms4f.clear();
+}
+
+} // Namespace dali
+
+bool BlendEnabled(const Dali::TraceCallStack& callStack)
+{
+ std::stringstream out;
+ out << GL_BLEND;
+ bool blendEnabled = callStack.FindMethodAndParams("Enable", out.str());
+ return blendEnabled;
+}
+
+bool BlendDisabled(const Dali::TraceCallStack& callStack)
+{
+ std::stringstream out;
+ out << GL_BLEND;
+ bool blendEnabled = callStack.FindMethodAndParams("Disable", out.str());
+ return blendEnabled;
+}
--- /dev/null
+#ifndef __TEST_GL_ABSTRACTION_H__
+#define __TEST_GL_ABSTRACTION_H__
+
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+// EXTERNAL INCLUDES
+#include <sstream>
+#include <string>
+#include <map>
+
+// INTERNAL INCLUDES
+#include <dali/dali.h>
+
+#include <dali/integration-api/core.h>
+#include <dali/integration-api/gl-abstraction.h>
+#include "test-trace-call-stack.h"
+
+namespace Dali
+{
+
+static const unsigned int MAX_ATTRIBUTE_CACHE_SIZE = 64;
+static const char *mStdAttribs[MAX_ATTRIBUTE_CACHE_SIZE] =
+{
+ "aPosition", // ATTRIB_POSITION
+ "aNormal", // ATTRIB_NORMAL
+ "aTexCoord", // ATTRIB_TEXCOORD
+ "aColor", // ATTRIB_COLOR
+ "aBoneWeights", // ATTRIB_BONE_WEIGHTS
+ "aBoneIndices" // ATTRIB_BONE_INDICES
+};
+
+class DALI_IMPORT_API TestGlAbstraction: public Dali::Integration::GlAbstraction
+{
+public:
+ TestGlAbstraction();
+ ~TestGlAbstraction();
+ void Initialize();
+
+ /* OpenGL ES 2.0 */
+
+ inline void ActiveTexture( GLenum textureUnit )
+ {
+ mActiveTextureUnit = textureUnit - GL_TEXTURE0;
+ }
+
+ inline GLenum GetActiveTextureUnit() const
+ {
+ return mActiveTextureUnit + GL_TEXTURE0;
+ }
+
+ inline void AttachShader( GLuint program, GLuint shader )
+ {
+ std::stringstream out;
+ out << program << ", " << shader;
+ mShaderTrace.PushCall("AttachShader", out.str());
+ }
+
+ inline void BindAttribLocation( GLuint program, GLuint index, const char* name )
+ {
+ }
+
+ inline void BindBuffer( GLenum target, GLuint buffer )
+ {
+ }
+
+ inline void BindFramebuffer( GLenum target, GLuint framebuffer )
+ {
+ }
+
+ inline void BindRenderbuffer( GLenum target, GLuint renderbuffer )
+ {
+ }
+
+ /**
+ * This method can be used by test cases, to query the texture IDs that have been bound by BindTexture.
+ * @return A vector containing the IDs that were bound.
+ */
+ inline const std::vector<GLuint>& GetBoundTextures() const
+ {
+ return mBoundTextures;
+ }
+
+ /**
+ * Query the texture IDs that have been bound with BindTexture, with a specific active texture unit.
+ * @param[in] activeTextureUnit The specific active texture unit.
+ * @return A vector containing the IDs that were bound.
+ */
+ inline const std::vector<GLuint>& GetBoundTextures( GLuint activeTextureUnit ) const
+ {
+ return mActiveTextures[ activeTextureUnit - GL_TEXTURE0 ].mBoundTextures;
+ }
+
+ /**
+ * This method can be used by test cases, to clear the record of texture IDs that have been bound by BindTexture.
+ */
+ inline void ClearBoundTextures()
+ {
+ mBoundTextures.clear();
+
+ for( unsigned int i=0; i<MIN_TEXTURE_UNIT_LIMIT; ++i )
+ {
+ mActiveTextures[ i ].mBoundTextures.clear();
+ }
+ }
+
+ inline void BindTexture( GLenum target, GLuint texture )
+ {
+ // Record the bound textures for future checks
+ if( texture )
+ {
+ mBoundTextures.push_back( texture );
+
+ if( mActiveTextureUnit < MIN_TEXTURE_UNIT_LIMIT )
+ {
+ mActiveTextures[ mActiveTextureUnit ].mBoundTextures.push_back( texture );
+ }
+ }
+ }
+
+ inline void BlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
+ {
+ mLastBlendColor.r = red;
+ mLastBlendColor.g = green;
+ mLastBlendColor.b = blue;
+ mLastBlendColor.a = alpha;
+ }
+
+ inline const Vector4& GetLastBlendColor() const
+ {
+ return mLastBlendColor;
+ }
+
+ inline void BlendEquation( GLenum mode )
+ {
+ mLastBlendEquationRgb = mode;
+ mLastBlendEquationAlpha = mode;
+ }
+
+ inline void BlendEquationSeparate( GLenum modeRgb, GLenum modeAlpha )
+ {
+ mLastBlendEquationRgb = modeRgb;
+ mLastBlendEquationAlpha = modeAlpha;
+ }
+
+ inline GLenum GetLastBlendEquationRgb() const
+ {
+ return mLastBlendEquationRgb;
+ }
+
+ inline GLenum GetLastBlendEquationAlpha() const
+ {
+ return mLastBlendEquationAlpha;
+ }
+
+ inline void BlendFunc(GLenum sfactor, GLenum dfactor)
+ {
+ mLastBlendFuncSrcRgb = sfactor;
+ mLastBlendFuncDstRgb = dfactor;
+ mLastBlendFuncSrcAlpha = sfactor;
+ mLastBlendFuncDstAlpha = dfactor;
+ }
+
+ inline void BlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
+ {
+ mLastBlendFuncSrcRgb = srcRGB;
+ mLastBlendFuncDstRgb = dstRGB;
+ mLastBlendFuncSrcAlpha = srcAlpha;
+ mLastBlendFuncDstAlpha = dstAlpha;
+ }
+
+ inline GLenum GetLastBlendFuncSrcRgb() const
+ {
+ return mLastBlendFuncSrcRgb;
+ }
+
+ inline GLenum GetLastBlendFuncDstRgb() const
+ {
+ return mLastBlendFuncDstRgb;
+ }
+
+ inline GLenum GetLastBlendFuncSrcAlpha() const
+ {
+ return mLastBlendFuncSrcAlpha;
+ }
+
+ inline GLenum GetLastBlendFuncDstAlpha() const
+ {
+ return mLastBlendFuncDstAlpha;
+ }
+
+ inline void BufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage)
+ {
+ }
+
+ inline void BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data)
+ {
+ }
+
+ inline GLenum CheckFramebufferStatus(GLenum target)
+ {
+ return mCheckFramebufferStatusResult;
+ }
+
+ inline void Clear(GLbitfield mask)
+ {
+ }
+
+ inline void ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
+ {
+ }
+
+ inline void ClearDepthf(GLclampf depth)
+ {
+ }
+
+ inline void ClearStencil(GLint s)
+ {
+ }
+
+ inline void ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
+ {
+ }
+
+ inline void CompileShader(GLuint shader)
+ {
+ std::stringstream out;
+ out << shader;
+ mShaderTrace.PushCall("CompileShader", out.str());
+ }
+
+ inline void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data)
+ {
+ }
+
+ inline void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)
+ {
+ }
+
+ inline void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
+ {
+ }
+
+ inline void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+ {
+ }
+
+ inline GLuint CreateProgram(void)
+ {
+ mShaderTrace.PushCall("CreateProgram", "");
+
+ ++mLastProgramIdUsed;
+ mUniforms[mLastProgramIdUsed] = UniformIDMap();
+ return mLastProgramIdUsed;
+ }
+
+ inline GLuint CreateShader(GLenum type)
+ {
+ std::stringstream out;
+ out << type;
+ mShaderTrace.PushCall("CreateShader", out.str());
+
+ return ++mLastShaderIdUsed;
+ }
+
+ inline void CullFace(GLenum mode)
+ {
+ std::stringstream out;
+ out << mode;
+ mCullFaceTrace.PushCall("CullFace", out.str());
+ }
+
+ inline void DeleteBuffers(GLsizei n, const GLuint* buffers)
+ {
+ }
+
+ inline void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers)
+ {
+ }
+
+ inline void DeleteProgram(GLuint program)
+ {
+ std::stringstream out;
+ out << program;
+ mShaderTrace.PushCall("DeleteProgram", out.str());
+ }
+
+ inline void DeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers)
+ {
+ }
+
+ inline void DeleteShader(GLuint shader)
+ {
+ std::stringstream out;
+ out << shader;
+ mShaderTrace.PushCall("DeleteShader", out.str());
+ }
+
+ inline void DeleteTextures(GLsizei n, const GLuint* textures)
+ {
+ std::stringstream out;
+ out << n << ", " << textures << " = [" ;
+
+ for(GLsizei i=0; i<n; i++)
+ {
+ out << textures[i] << ", " ;
+ mDeletedTextureIds.push_back(textures[i]);
+ }
+ out << "]";
+ mTextureTrace.PushCall("DeleteTextures", out.str());
+ }
+
+ inline bool CheckNoTexturesDeleted()
+ {
+ return mDeletedTextureIds.size() == 0;
+ }
+
+ inline bool CheckTextureDeleted( GLuint textureId )
+ {
+ bool found = false;
+
+ for(std::vector<GLuint>::iterator iter=mDeletedTextureIds.begin(); iter != mDeletedTextureIds.end(); ++iter)
+ {
+ if(*iter == textureId)
+ {
+ found = true;
+ break;
+ }
+ }
+ return found;
+ }
+
+ inline void ClearDeletedTextures()
+ {
+ mDeletedTextureIds.clear();
+ }
+
+ inline void DepthFunc(GLenum func)
+ {
+ }
+
+ inline void DepthMask(GLboolean flag)
+ {
+ }
+
+ inline void DepthRangef(GLclampf zNear, GLclampf zFar)
+ {
+ }
+
+ inline void DetachShader(GLuint program, GLuint shader)
+ {
+ std::stringstream out;
+ out << program << ", " << shader;
+ mShaderTrace.PushCall("DetachShader", out.str());
+ }
+
+ inline void Disable(GLenum cap)
+ {
+ std::stringstream out;
+ out << cap;
+ mCullFaceTrace.PushCall("Disable", out.str());
+ }
+
+ inline void DisableVertexAttribArray(GLuint index)
+ {
+ SetVertexAttribArray( index, false );
+ }
+
+ inline void DrawArrays(GLenum mode, GLint first, GLsizei count)
+ {
+ std::stringstream out;
+ out << mode << ", " << first << ", " << count;
+ mDrawTrace.PushCall("DrawArrays", out.str());
+ }
+
+ inline void DrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices)
+ {
+ std::stringstream out;
+ out << mode << ", " << count << ", " << type << ", indices";
+ mDrawTrace.PushCall("DrawElements", out.str());
+ }
+
+ inline void Enable(GLenum cap)
+ {
+ std::stringstream out;
+ out << cap;
+ mCullFaceTrace.PushCall("Enable", out.str());
+ }
+
+ inline void EnableVertexAttribArray(GLuint index)
+ {
+ SetVertexAttribArray( index, true);
+ }
+
+ inline void Finish(void)
+ {
+ }
+
+ inline void Flush(void)
+ {
+ }
+
+ inline void FramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
+ {
+ }
+
+ inline void FramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
+ {
+ }
+
+ inline void FrontFace(GLenum mode)
+ {
+ }
+
+ inline void GenBuffers(GLsizei n, GLuint* buffers)
+ {
+ // avoids an assert in GpuBuffers
+ *buffers = 1u;
+ }
+
+ inline void GenerateMipmap(GLenum target)
+ {
+ }
+
+ inline void GenFramebuffers(GLsizei n, GLuint* framebuffers)
+ {
+ }
+
+ inline void GenRenderbuffers(GLsizei n, GLuint* renderbuffers)
+ {
+ }
+
+ /**
+ * This method can be used by test cases, to manipulate the texture IDs generated by GenTextures.
+ * @param[in] ids A vector containing the next IDs to be generated
+ */
+ inline void SetNextTextureIds( const std::vector<GLuint>& ids )
+ {
+ mNextTextureIds = ids;
+ }
+
+ inline const std::vector<GLuint>& GetNextTextureIds()
+ {
+ return mNextTextureIds;
+ }
+
+ inline void GenTextures(GLsizei n, GLuint* textures)
+ {
+ for( int i=0; i<n; ++i )
+ {
+ if( !mNextTextureIds.empty() )
+ {
+ *(textures+i) = mNextTextureIds[0];
+ mNextTextureIds.erase( mNextTextureIds.begin() );
+ }
+ else
+ {
+ *(textures+i) = ++mLastAutoTextureIdUsed;
+ }
+ }
+ }
+
+ inline void GetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
+ {
+ }
+
+ inline void GetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name)
+ {
+ }
+
+ inline void GetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)
+ {
+ }
+
+ inline int GetAttribLocation(GLuint program, const char* name)
+ {
+ std::string attribName(name);
+
+ for( unsigned int i = 0; i < ATTRIB_TYPE_LAST; ++i )
+ {
+ if( mStdAttribs[i] == attribName )
+ {
+ return i;
+ }
+ }
+
+ // 0 is a valid location
+ return 0;
+ }
+
+ inline void GetBooleanv(GLenum pname, GLboolean* params)
+ {
+ }
+
+ inline void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params)
+ {
+ }
+
+ inline GLenum GetError(void)
+ {
+ return mGetErrorResult;
+ }
+
+ inline void GetFloatv(GLenum pname, GLfloat* params)
+ {
+ }
+
+ inline void GetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params)
+ {
+ }
+
+ inline void GetIntegerv(GLenum pname, GLint* params)
+ {
+ switch( pname )
+ {
+ case GL_MAX_TEXTURE_SIZE:
+ *params = 2048;
+ break;
+ case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
+ *params = 8;
+ break;
+ case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
+ *params = mNumBinaryFormats;
+ break;
+ case GL_PROGRAM_BINARY_FORMATS_OES:
+ *params = mBinaryFormats;
+ break;
+ }
+ }
+
+ inline void GetProgramiv(GLuint program, GLenum pname, GLint* params)
+ {
+ switch( pname ) {
+ case GL_LINK_STATUS:
+ *params = mLinkStatus;
+ break;
+ case GL_PROGRAM_BINARY_LENGTH_OES:
+ *params = mProgramBinaryLength;
+ break;
+ }
+ }
+
+ inline void GetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, char* infolog)
+ {
+ }
+
+
+ inline void GetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params)
+ {
+ }
+
+ inline void GetShaderiv(GLuint shader, GLenum pname, GLint* params)
+ {
+ switch( pname ) {
+ case GL_COMPILE_STATUS:
+ *params = mCompileStatus;
+ break;
+ }
+ }
+
+ inline void GetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog)
+ {
+ }
+
+ inline void GetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)
+ {
+ }
+
+ inline const GLubyte* GetString(GLenum name)
+ {
+ return mGetStringResult;
+ }
+
+ inline void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params)
+ {
+ }
+
+ inline void GetTexParameteriv(GLenum target, GLenum pname, GLint* params)
+ {
+ }
+
+ inline void GetUniformfv(GLuint program, GLint location, GLfloat* params)
+ {
+ }
+
+ inline void GetUniformiv(GLuint program, GLint location, GLint* params)
+ {
+ }
+
+ inline GLint GetUniformLocation(GLuint program, const char* name)
+ {
+ ProgramUniformMap::iterator it = mUniforms.find(program);
+ if( it == mUniforms.end() )
+ {
+ // Not a valid program ID
+ mGetErrorResult = GL_INVALID_OPERATION;
+ return -1;
+ }
+
+ UniformIDMap& uniformIDs = it->second;
+ UniformIDMap::iterator it2 = uniformIDs.find( name );
+ if( it2 == uniformIDs.end() )
+ {
+ // Uniform not found, so add it...
+ uniformIDs[name] = ++mLastUniformIdUsed;
+ return mLastUniformIdUsed;
+ }
+
+ return it2->second;
+ }
+
+ inline void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
+ {
+ }
+
+ inline void GetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
+ {
+ }
+
+ inline void GetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer)
+ {
+ }
+
+ inline void Hint(GLenum target, GLenum mode)
+ {
+ }
+
+ inline GLboolean IsBuffer(GLuint buffer)
+ {
+ return mIsBufferResult;
+ }
+
+ inline GLboolean IsEnabled(GLenum cap)
+ {
+ return mIsEnabledResult;
+ }
+
+ inline GLboolean IsFramebuffer(GLuint framebuffer)
+ {
+ return mIsFramebufferResult;
+ }
+
+ inline GLboolean IsProgram(GLuint program)
+ {
+ return mIsProgramResult;
+ }
+
+ inline GLboolean IsRenderbuffer(GLuint renderbuffer)
+ {
+ return mIsRenderbufferResult;
+ }
+
+ inline GLboolean IsShader(GLuint shader)
+ {
+ return mIsShaderResult;
+ }
+
+ inline GLboolean IsTexture(GLuint texture)
+ {
+ return mIsTextureResult;
+ }
+
+ inline void LineWidth(GLfloat width)
+ {
+ }
+
+ inline void LinkProgram(GLuint program)
+ {
+ std::stringstream out;
+ out << program;
+ mShaderTrace.PushCall("LinkProgram", out.str());
+ }
+
+ inline void PixelStorei(GLenum pname, GLint param)
+ {
+ }
+
+ inline void PolygonOffset(GLfloat factor, GLfloat units)
+ {
+ }
+
+ inline void ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)
+ {
+ }
+
+ inline void ReleaseShaderCompiler(void)
+ {
+ }
+
+ inline void RenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
+ {
+ }
+
+ inline void SampleCoverage(GLclampf value, GLboolean invert)
+ {
+ }
+
+ inline void Scissor(GLint x, GLint y, GLsizei width, GLsizei height)
+ {
+ }
+
+ inline void ShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length)
+ {
+ }
+
+ inline void ShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length)
+ {
+ std::string stringBuilder;
+ for(int i = 0; i < count; ++i)
+ {
+ stringBuilder += string[i];
+ }
+ mShaderSources[shader] = stringBuilder;
+ mLastShaderCompiled = shader;
+ }
+
+ inline void GetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, char* source)
+ {
+ const std::string shaderSource = mShaderSources[shader];
+ if( static_cast<int>(shaderSource.length()) < bufsize )
+ {
+ strcpy(source, shaderSource.c_str());
+ *length = shaderSource.length();
+ }
+ else
+ {
+ *length = bufsize -1;
+ strncpy(source, shaderSource.c_str(), *length);
+ source[*length] = 0x0;
+ }
+ }
+
+ inline void StencilFunc(GLenum func, GLint ref, GLuint mask)
+ {
+ }
+
+ inline void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
+ {
+ }
+
+ inline void StencilMask(GLuint mask)
+ {
+ }
+
+ inline void StencilMaskSeparate(GLenum face, GLuint mask)
+ {
+ }
+
+ inline void StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
+ {
+ }
+
+ inline void StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
+ {
+ }
+
+ inline void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels)
+ {
+ std::stringstream out;
+ out << width << ", " << height;
+ mTextureTrace.PushCall("TexImage2D", out.str());
+ }
+
+ inline void TexParameterf(GLenum target, GLenum pname, GLfloat param)
+ {
+ }
+
+ inline void TexParameterfv(GLenum target, GLenum pname, const GLfloat* params)
+ {
+ }
+
+ inline void TexParameteri(GLenum target, GLenum pname, GLint param)
+ {
+ }
+
+ inline void TexParameteriv(GLenum target, GLenum pname, const GLint* params)
+ {
+ }
+
+ inline void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels)
+ {
+ std::stringstream out;
+ out << xoffset << ", " << yoffset << ", " << width << ", " << height;
+ mTextureTrace.PushCall("TexSubImage2D", out.str());
+ }
+
+ inline void Uniform1f(GLint location, GLfloat x)
+ {
+ if( ! mProgramUniforms1f.SetUniformValue( mCurrentProgram, location, x ) )
+ {
+ mGetErrorResult = GL_INVALID_OPERATION;
+ }
+ }
+
+ inline void Uniform1fv(GLint location, GLsizei count, const GLfloat* v)
+ {
+ for( int i = 0; i < count; ++i )
+ {
+ if( ! mProgramUniforms1f.SetUniformValue( mCurrentProgram, location, v[i] ) )
+ {
+ mGetErrorResult = GL_INVALID_OPERATION;
+ break;
+ }
+ }
+ }
+
+ inline void Uniform1i(GLint location, GLint x)
+ {
+ if( ! mProgramUniforms1i.SetUniformValue( mCurrentProgram, location, x ) )
+ {
+ mGetErrorResult = GL_INVALID_OPERATION;
+ }
+ }
+
+ inline void Uniform1iv(GLint location, GLsizei count, const GLint* v)
+ {
+ for( int i = 0; i < count; ++i )
+ {
+ if( ! mProgramUniforms1i.SetUniformValue( mCurrentProgram,
+ location,
+ v[i] ) )
+ {
+ mGetErrorResult = GL_INVALID_OPERATION;
+ break;
+ }
+ }
+ }
+
+ inline void Uniform2f(GLint location, GLfloat x, GLfloat y)
+ {
+ if( ! mProgramUniforms2f.SetUniformValue( mCurrentProgram,
+ location,
+ Vector2( x, y ) ) )
+ {
+ mGetErrorResult = GL_INVALID_OPERATION;
+ }
+ }
+
+ inline void Uniform2fv(GLint location, GLsizei count, const GLfloat* v)
+ {
+ for( int i = 0; i < count; ++i )
+ {
+ if( ! mProgramUniforms2f.SetUniformValue( mCurrentProgram,
+ location,
+ Vector2( v[2*i], v[2*i+1] ) ) )
+ {
+ mGetErrorResult = GL_INVALID_OPERATION;
+ break;
+ }
+ }
+ }
+
+ inline void Uniform2i(GLint location, GLint x, GLint y)
+ {
+ }
+
+ inline void Uniform2iv(GLint location, GLsizei count, const GLint* v)
+ {
+ }
+
+ inline void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
+ {
+ if( ! mProgramUniforms3f.SetUniformValue( mCurrentProgram,
+ location,
+ Vector3( x, y, z ) ) )
+ {
+ mGetErrorResult = GL_INVALID_OPERATION;
+ }
+ }
+
+ inline void Uniform3fv(GLint location, GLsizei count, const GLfloat* v)
+ {
+ for( int i = 0; i < count; ++i )
+ {
+ if( ! mProgramUniforms3f.SetUniformValue(
+ mCurrentProgram,
+ location,
+ Vector3( v[3*i], v[3*i+1], v[3*i+2] ) ) )
+ {
+ mGetErrorResult = GL_INVALID_OPERATION;
+ break;
+ }
+ }
+ }
+
+ inline void Uniform3i(GLint location, GLint x, GLint y, GLint z)
+ {
+ }
+
+ inline void Uniform3iv(GLint location, GLsizei count, const GLint* v)
+ {
+ }
+
+ inline void Uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+ {
+ if( ! mProgramUniforms4f.SetUniformValue( mCurrentProgram,
+ location,
+ Vector4( x, y, z, w ) ) )
+ {
+ mGetErrorResult = GL_INVALID_OPERATION;
+ }
+ }
+
+ inline void Uniform4fv(GLint location, GLsizei count, const GLfloat* v)
+ {
+ for( int i = 0; i < count; ++i )
+ {
+ if( ! mProgramUniforms4f.SetUniformValue(
+ mCurrentProgram,
+ location,
+ Vector4( v[4*i], v[4*i+1], v[4*i+2], v[4*i+3] ) ) )
+ {
+ mGetErrorResult = GL_INVALID_OPERATION;
+ break;
+ }
+ }
+ }
+
+ inline void Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
+ {
+ }
+
+ inline void Uniform4iv(GLint location, GLsizei count, const GLint* v)
+ {
+ }
+
+ inline void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+ {
+ }
+
+ inline void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+ {
+ for( int i = 0; i < count; ++i )
+ {
+ if( ! mProgramUniformsMat3.SetUniformValue(
+ mCurrentProgram,
+ location,
+ Matrix3( value[0], value[1], value[2], value[3], value[4], value[5], value[6], value[7], value[8] ) ) )
+ {
+ mGetErrorResult = GL_INVALID_OPERATION;
+ break;
+ }
+ }
+ }
+
+ inline void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+ {
+ for( int i = 0; i < count; ++i )
+ {
+ if( ! mProgramUniformsMat4.SetUniformValue(
+ mCurrentProgram,
+ location,
+ Matrix( value ) ) )
+ {
+ mGetErrorResult = GL_INVALID_OPERATION;
+ break;
+ }
+ }
+ }
+
+ inline void UseProgram(GLuint program)
+ {
+ mCurrentProgram = program;
+ }
+
+ inline void ValidateProgram(GLuint program)
+ {
+ }
+
+ inline void VertexAttrib1f(GLuint indx, GLfloat x)
+ {
+ }
+
+ inline void VertexAttrib1fv(GLuint indx, const GLfloat* values)
+ {
+ }
+
+ inline void VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y)
+ {
+ }
+
+ inline void VertexAttrib2fv(GLuint indx, const GLfloat* values)
+ {
+ }
+
+ inline void VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z)
+ {
+ }
+
+ inline void VertexAttrib3fv(GLuint indx, const GLfloat* values)
+ {
+ }
+
+ inline void VertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
+ {
+ }
+
+ inline void VertexAttrib4fv(GLuint indx, const GLfloat* values)
+ {
+ }
+
+ inline void VertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr)
+ {
+ }
+
+ inline void Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
+ {
+ }
+
+ /* OpenGL ES 3.0 */
+
+ inline void ReadBuffer(GLenum mode)
+ {
+ }
+
+ inline void DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices)
+ {
+ }
+
+ inline void TexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels)
+ {
+ }
+
+ inline void TexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels)
+ {
+ }
+
+ inline void CopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)
+ {
+ }
+
+ inline void CompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data)
+ {
+ }
+
+ inline void CompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data)
+ {
+ }
+
+ inline void GenQueries(GLsizei n, GLuint* ids)
+ {
+ }
+
+ inline void DeleteQueries(GLsizei n, const GLuint* ids)
+ {
+ }
+
+ inline GLboolean IsQuery(GLuint id)
+ {
+ return false;
+ }
+
+ inline void BeginQuery(GLenum target, GLuint id)
+ {
+ }
+
+ inline void EndQuery(GLenum target)
+ {
+ }
+
+ inline void GetQueryiv(GLenum target, GLenum pname, GLint* params)
+ {
+ }
+
+ inline void GetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params)
+ {
+ }
+
+ inline GLboolean UnmapBuffer(GLenum target)
+ {
+ return false;
+ }
+
+ inline void GetBufferPointerv(GLenum target, GLenum pname, GLvoid** params)
+ {
+ }
+
+ inline void DrawBuffers(GLsizei n, const GLenum* bufs)
+ {
+ }
+
+ inline void UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+ {
+ }
+
+ inline void UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+ {
+ }
+
+ inline void UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+ {
+ }
+
+ inline void UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+ {
+ }
+
+ inline void UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+ {
+ }
+
+ inline void UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
+ {
+ }
+
+ inline void BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)
+ {
+ }
+
+ inline void RenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
+ {
+ }
+
+ inline void FramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)
+ {
+ }
+
+ inline GLvoid* MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
+ {
+ return NULL;
+ }
+
+ inline void FlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length)
+ {
+ }
+
+ inline void BindVertexArray(GLuint array)
+ {
+ }
+
+ inline void DeleteVertexArrays(GLsizei n, const GLuint* arrays)
+ {
+ }
+
+ inline void GenVertexArrays(GLsizei n, GLuint* arrays)
+ {
+ }
+
+ inline GLboolean IsVertexArray(GLuint array)
+ {
+ return false;
+ }
+
+ inline void GetIntegeri_v(GLenum target, GLuint index, GLint* data)
+ {
+ }
+
+ inline void BeginTransformFeedback(GLenum primitiveMode)
+ {
+ }
+
+ inline void EndTransformFeedback(void)
+ {
+ }
+
+ inline void BindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size)
+ {
+ }
+
+ inline void BindBufferBase(GLenum target, GLuint index, GLuint buffer)
+ {
+ }
+
+ inline void TransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode)
+ {
+ }
+
+ inline void GetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name)
+ {
+ }
+
+ inline void VertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)
+ {
+ }
+
+ inline void GetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
+ {
+ }
+
+ inline void GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
+ {
+ }
+
+ inline void VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
+ {
+ }
+
+ inline void VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
+ {
+ }
+
+ inline void VertexAttribI4iv(GLuint index, const GLint* v)
+ {
+ }
+
+ inline void VertexAttribI4uiv(GLuint index, const GLuint* v)
+ {
+ }
+
+ inline void GetUniformuiv(GLuint program, GLint location, GLuint* params)
+ {
+ }
+
+ inline GLint GetFragDataLocation(GLuint program, const GLchar *name)
+ {
+ return -1;
+ }
+
+ inline void Uniform1ui(GLint location, GLuint v0)
+ {
+ }
+
+ inline void Uniform2ui(GLint location, GLuint v0, GLuint v1)
+ {
+ }
+
+ inline void Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+ {
+ }
+
+ inline void Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+ {
+ }
+
+ inline void Uniform1uiv(GLint location, GLsizei count, const GLuint* value)
+ {
+ }
+
+ inline void Uniform2uiv(GLint location, GLsizei count, const GLuint* value)
+ {
+ }
+
+ inline void Uniform3uiv(GLint location, GLsizei count, const GLuint* value)
+ {
+ }
+
+ inline void Uniform4uiv(GLint location, GLsizei count, const GLuint* value)
+ {
+ }
+
+ inline void ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value)
+ {
+ }
+
+ inline void ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value)
+ {
+ }
+
+ inline void ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value)
+ {
+ }
+
+ inline void ClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil)
+ {
+ }
+
+ inline const GLubyte* GetStringi(GLenum name, GLuint index)
+ {
+ return NULL;
+ }
+
+ inline void CopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)
+ {
+ }
+
+ inline void GetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices)
+ {
+ }
+
+ inline void GetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params)
+ {
+ }
+
+ inline GLuint GetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName)
+ {
+ return GL_INVALID_INDEX;
+ }
+
+ inline void GetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params)
+ {
+ }
+
+ inline void GetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName)
+ {
+ }
+
+ inline void UniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
+ {
+ }
+
+ inline void DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount)
+ {
+ }
+
+ inline void DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount)
+ {
+ }
+
+ inline GLsync FenceSync(GLenum condition, GLbitfield flags)
+ {
+ return NULL;
+ }
+
+ inline GLboolean IsSync(GLsync sync)
+ {
+ return false;
+ }
+
+ inline void DeleteSync(GLsync sync)
+ {
+ }
+
+ inline GLenum ClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+ {
+ return 0;
+ }
+
+ inline void WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
+ {
+ }
+
+ inline void GetInteger64v(GLenum pname, GLint64* params)
+ {
+ }
+
+ inline void GetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values)
+ {
+ }
+
+ inline void GetInteger64i_v(GLenum target, GLuint index, GLint64* data)
+ {
+ }
+
+ inline void GetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params)
+ {
+ }
+
+ inline void GenSamplers(GLsizei count, GLuint* samplers)
+ {
+ }
+
+ inline void DeleteSamplers(GLsizei count, const GLuint* samplers)
+ {
+ }
+
+ inline GLboolean IsSampler(GLuint sampler)
+ {
+ return false;
+ }
+
+ inline void BindSampler(GLuint unit, GLuint sampler)
+ {
+ }
+
+ inline void SamplerParameteri(GLuint sampler, GLenum pname, GLint param)
+ {
+ }
+
+ inline void SamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param)
+ {
+ }
+
+ inline void SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
+ {
+ }
+
+ inline void SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param)
+ {
+ }
+
+ inline void GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params)
+ {
+ }
+
+ inline void GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params)
+ {
+ }
+
+ inline void VertexAttribDivisor(GLuint index, GLuint divisor)
+ {
+ }
+
+ inline void BindTransformFeedback(GLenum target, GLuint id)
+ {
+ }
+
+ inline void DeleteTransformFeedbacks(GLsizei n, const GLuint* ids)
+ {
+ }
+
+ inline void GenTransformFeedbacks(GLsizei n, GLuint* ids)
+ {
+ }
+
+ inline GLboolean IsTransformFeedback(GLuint id)
+ {
+ return false;
+ }
+
+ inline void PauseTransformFeedback(void)
+ {
+ }
+
+ inline void ResumeTransformFeedback(void)
+ {
+ }
+
+ inline void GetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary)
+ {
+ }
+
+ inline void ProgramBinary(GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length)
+ {
+ }
+
+ inline void ProgramParameteri(GLuint program, GLenum pname, GLint value)
+ {
+ }
+
+ inline void InvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments)
+ {
+ }
+
+ inline void InvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height)
+ {
+ }
+
+ inline void TexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
+ {
+ }
+
+ inline void TexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
+ {
+ }
+
+ inline void GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params)
+ {
+ }
+
+public: // TEST FUNCTIONS
+ inline void SetCompileStatus( GLuint value ) { mCompileStatus = value; }
+ inline void SetLinkStatus( GLuint value ) { mLinkStatus = value; }
+ inline void SetGetAttribLocationResult( int result) { mGetAttribLocationResult = result; }
+ inline void SetGetErrorResult( GLenum result) { mGetErrorResult = result; }
+ inline void SetGetStringResult( GLubyte* result) { mGetStringResult = result; }
+ inline void SetIsBufferResult( GLboolean result) { mIsBufferResult = result; }
+ inline void SetIsEnabledResult( GLboolean result) { mIsEnabledResult = result; }
+ inline void SetIsFramebufferResult( GLboolean result) { mIsFramebufferResult = result; }
+ inline void SetIsProgramResult( GLboolean result) { mIsProgramResult = result; }
+ inline void SetIsRenderbufferResult( GLboolean result) { mIsRenderbufferResult = result; }
+ inline void SetIsShaderResult( GLboolean result) { mIsShaderResult = result; }
+ inline void SetIsTextureResult( GLboolean result) { mIsTextureResult = result; }
+ inline void SetCheckFramebufferStatusResult( GLenum result) { mCheckFramebufferStatusResult = result; }
+ inline void SetNumBinaryFormats( GLint numFormats ) { mNumBinaryFormats = numFormats; }
+ inline void SetBinaryFormats( GLint binaryFormats ) { mBinaryFormats = binaryFormats; }
+ inline void SetProgramBinaryLength( GLint length ) { mProgramBinaryLength = length; }
+
+ inline bool GetVertexAttribArrayState(GLuint index)
+ {
+ if( index >= MAX_ATTRIBUTE_CACHE_SIZE )
+ {
+ // out of range
+ return false;
+ }
+ return mVertexAttribArrayState[ index ];
+ }
+ inline void ClearVertexAttribArrayChanged() { mVertexAttribArrayChanged = false; }
+ inline bool GetVertexAttribArrayChanged() { return mVertexAttribArrayChanged; }
+
+ //Methods for CullFace verification
+ inline void EnableCullFaceCallTrace(bool enable) { mCullFaceTrace.Enable(enable); }
+ inline void ResetCullFaceCallStack() { mCullFaceTrace.Reset(); }
+ inline TraceCallStack& GetCullFaceTrace() { return mCullFaceTrace; }
+
+ //Methods for Shader verification
+ inline void EnableShaderCallTrace(bool enable) { mShaderTrace.Enable(enable); }
+ inline void ResetShaderCallStack() { mShaderTrace.Reset(); }
+ inline TraceCallStack& GetShaderTrace() { return mShaderTrace; }
+
+ //Methods for Texture verification
+ inline void EnableTextureCallTrace(bool enable) { mTextureTrace.Enable(enable); }
+ inline void ResetTextureCallStack() { mTextureTrace.Reset(); }
+ inline TraceCallStack& GetTextureTrace() { return mTextureTrace; }
+
+ //Methods for Draw verification
+ inline void EnableDrawCallTrace(bool enable) { mDrawTrace.Enable(enable); }
+ inline void ResetDrawCallStack() { mDrawTrace.Reset(); }
+ inline TraceCallStack& GetDrawTrace() { return mDrawTrace; }
+
+ template <typename T>
+ inline bool CheckUniformValue( const char* name, const T& value ) const
+ {
+ for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
+ program_it != mUniforms.end();
+ ++program_it )
+ {
+ const UniformIDMap &uniformIDs = program_it->second;
+
+ UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
+ if( uniform_it != uniformIDs.end() )
+ {
+ // found one matching uniform name, lets check the value...
+ GLuint programId = program_it->first;
+ GLint uniformId = uniform_it->second;
+
+ const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( value );
+ if( mProgramUniforms.CheckUniformValue( programId, uniformId, value ) )
+ {
+ // the value matches
+ return true;
+ }
+ }
+ }
+
+ fprintf(stderr, "Not found, printing possible values:" );
+ for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
+ program_it != mUniforms.end();
+ ++program_it )
+ {
+ const UniformIDMap &uniformIDs = program_it->second;
+
+ UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
+ if( uniform_it != uniformIDs.end() )
+ {
+ // found one matching uniform name, lets check the value...
+ GLuint programId = program_it->first;
+ GLint uniformId = uniform_it->second;
+
+ const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( value );
+ T origValue;
+ if ( mProgramUniforms.GetUniformValue(programId, uniformId, origValue) )
+ {
+ std::stringstream out;
+ out << uniform_it->first << ": " << origValue;
+ fprintf(stderr, "%s", out.str().c_str() );
+ }
+ }
+ }
+ return false;
+ }
+
+ template <typename T>
+ inline bool GetUniformValue( GLuint programId, GLuint uniformId, T& outValue) const
+ {
+ const ProgramUniformValue<T> &mProgramUniforms = GetProgramUniformsForType( outValue );
+ return mProgramUniforms.GetUniformValue( programId, uniformId, outValue );
+ }
+
+ inline bool GetUniformIds( const char* name, GLuint& programId, GLuint& uniformId ) const
+ {
+ for( ProgramUniformMap::const_iterator program_it = mUniforms.begin();
+ program_it != mUniforms.end();
+ ++program_it )
+ {
+ const UniformIDMap &uniformIDs = program_it->second;
+
+ UniformIDMap::const_iterator uniform_it = uniformIDs.find( name );
+ if( uniform_it != uniformIDs.end() )
+ {
+ programId = program_it->first;
+ uniformId = uniform_it->second;
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+
+ inline GLuint GetLastShaderCompiled() const
+ {
+ return mLastShaderCompiled;
+ }
+
+ inline GLuint GetLastProgramCreated() const
+ {
+ return mLastProgramIdUsed;
+ }
+
+ enum AttribType
+ {
+ ATTRIB_UNKNOWN = -1,
+ ATTRIB_POSITION,
+ ATTRIB_NORMAL,
+ ATTRIB_TEXCOORD,
+ ATTRIB_COLOR,
+ ATTRIB_BONE_WEIGHTS,
+ ATTRIB_BONE_INDICES,
+ ATTRIB_TYPE_LAST
+ };
+
+
+private:
+ GLuint mCurrentProgram;
+ GLuint mCompileStatus;
+ GLuint mLinkStatus;
+ GLint mGetAttribLocationResult;
+ GLenum mGetErrorResult;
+ GLubyte* mGetStringResult;
+ GLboolean mIsBufferResult;
+ GLboolean mIsEnabledResult;
+ GLboolean mIsFramebufferResult;
+ GLboolean mIsProgramResult;
+ GLboolean mIsRenderbufferResult;
+ GLboolean mIsShaderResult;
+ GLboolean mIsTextureResult;
+ GLenum mActiveTextureUnit;
+ GLenum mCheckFramebufferStatusResult;
+ GLint mNumBinaryFormats;
+ GLint mBinaryFormats;
+ GLint mProgramBinaryLength;
+ bool mVertexAttribArrayState[MAX_ATTRIBUTE_CACHE_SIZE];
+ bool mVertexAttribArrayChanged; // whether the vertex attrib array has been changed
+ typedef std::map< GLuint, std::string> ShaderSourceMap;
+ ShaderSourceMap mShaderSources;
+ GLuint mLastShaderCompiled;
+
+ Vector4 mLastBlendColor;
+ GLenum mLastBlendEquationRgb;
+ GLenum mLastBlendEquationAlpha;
+ GLenum mLastBlendFuncSrcRgb;
+ GLenum mLastBlendFuncDstRgb;
+ GLenum mLastBlendFuncSrcAlpha;
+ GLenum mLastBlendFuncDstAlpha;
+
+ // Data for manipulating the IDs returned by GenTextures
+ GLuint mLastAutoTextureIdUsed;
+ std::vector<GLuint> mNextTextureIds;
+ std::vector<GLuint> mDeletedTextureIds;
+ std::vector<GLuint> mBoundTextures;
+
+ struct ActiveTextureType
+ {
+ std::vector<GLuint> mBoundTextures;
+ };
+
+ ActiveTextureType mActiveTextures[ MIN_TEXTURE_UNIT_LIMIT ];
+
+ TraceCallStack mCullFaceTrace;
+ TraceCallStack mShaderTrace;
+ TraceCallStack mTextureTrace;
+ TraceCallStack mDrawTrace;
+
+ // Shaders & Uniforms
+ GLuint mLastShaderIdUsed;
+ GLuint mLastProgramIdUsed;
+ GLuint mLastUniformIdUsed;
+ typedef std::map< std::string, GLint > UniformIDMap;
+ typedef std::map< GLuint, UniformIDMap > ProgramUniformMap;
+ ProgramUniformMap mUniforms;
+
+ template <typename T>
+ struct ProgramUniformValue : public std::map< GLuint, std::map< GLint, T > >
+ {
+ public:
+ typedef std::map< GLint, T > UniformValueMap;
+ typedef std::map< GLuint, UniformValueMap > Map;
+
+ bool SetUniformValue( GLuint program, GLuint uniform, const T& value )
+ {
+ if( program == 0 )
+ {
+ return false;
+ }
+
+ typename Map::iterator it = Map::find( program );
+ if( it == Map::end() )
+ {
+ // if its the first uniform for this program add it
+ std::pair< typename Map::iterator, bool > result =
+ Map::insert( typename Map::value_type( program, UniformValueMap() ) );
+ it = result.first;
+ }
+
+ UniformValueMap& uniforms = it->second;
+ uniforms[uniform] = value;
+
+ return true;
+ }
+
+ bool CheckUniformValue( GLuint program, GLuint uniform, const T& value ) const
+ {
+ T uniformValue;
+ if ( GetUniformValue( program, uniform, uniformValue ) )
+ {
+ return value == uniformValue;
+ }
+
+ return false;
+ }
+
+ bool GetUniformValue( GLuint program, GLuint uniform, T& value ) const
+ {
+ if( program == 0 )
+ {
+ return false;
+ }
+
+ typename Map::const_iterator it = Map::find( program );
+ if( it == Map::end() )
+ {
+ // Uniform values always initialised as 0
+ value = GetZero();
+ return true;
+ }
+
+ const UniformValueMap& uniforms = it->second;
+ typename UniformValueMap::const_iterator it2 = uniforms.find( uniform );
+ if( it2 == uniforms.end() )
+ {
+ // Uniform values always initialised as 0
+ value = GetZero();
+ return true;
+ }
+ value = it2->second;
+
+ return true;
+ }
+
+ T GetZero() const;
+ };
+ ProgramUniformValue<int> mProgramUniforms1i;
+ ProgramUniformValue<float> mProgramUniforms1f;
+ ProgramUniformValue<Vector2> mProgramUniforms2f;
+ ProgramUniformValue<Vector3> mProgramUniforms3f;
+ ProgramUniformValue<Vector4> mProgramUniforms4f;
+ ProgramUniformValue<Matrix> mProgramUniformsMat4;
+ ProgramUniformValue<Matrix3> mProgramUniformsMat3;
+
+ inline const ProgramUniformValue<int>& GetProgramUniformsForType( const int ) const
+ {
+ return mProgramUniforms1i;
+ }
+ inline const ProgramUniformValue<float>& GetProgramUniformsForType( const float ) const
+ {
+ return mProgramUniforms1f;
+ }
+ inline const ProgramUniformValue<Vector2>& GetProgramUniformsForType( const Vector2& ) const
+ {
+ return mProgramUniforms2f;
+ }
+ inline const ProgramUniformValue<Vector3>& GetProgramUniformsForType( const Vector3& ) const
+ {
+ return mProgramUniforms3f;
+ }
+ inline const ProgramUniformValue<Vector4>& GetProgramUniformsForType( const Vector4& ) const
+ {
+ return mProgramUniforms4f;
+ }
+ inline const ProgramUniformValue<Matrix>& GetProgramUniformsForType( const Matrix& ) const
+ {
+ return mProgramUniformsMat4;
+ }
+ inline const ProgramUniformValue<Matrix3>& GetProgramUniformsForType( const Matrix3& ) const
+ {
+ return mProgramUniformsMat3;
+ }
+ inline void SetVertexAttribArray(GLuint index, bool state)
+ {
+ if( index >= MAX_ATTRIBUTE_CACHE_SIZE )
+ {
+ // out of range
+ return;
+ }
+ mVertexAttribArrayState[ index ] = state;
+ mVertexAttribArrayChanged = true;
+ }
+};
+
+template <>
+inline int TestGlAbstraction::ProgramUniformValue<int>::GetZero() const
+{
+ return 0;
+}
+
+template <>
+inline float TestGlAbstraction::ProgramUniformValue<float>::GetZero() const
+{
+ return 0.0f;
+}
+
+template <>
+inline Vector2 TestGlAbstraction::ProgramUniformValue<Vector2>::GetZero() const
+{
+ return Vector2::ZERO;
+}
+
+template <>
+inline Vector3 TestGlAbstraction::ProgramUniformValue<Vector3>::GetZero() const
+{
+ return Vector3::ZERO;
+}
+
+template <>
+inline Vector4 TestGlAbstraction::ProgramUniformValue<Vector4>::GetZero() const
+{
+ return Vector4::ZERO;
+}
+
+template <>
+inline Matrix TestGlAbstraction::ProgramUniformValue<Matrix>::GetZero() const
+{
+ return Matrix();
+}
+
+template <>
+inline Matrix3 TestGlAbstraction::ProgramUniformValue<Matrix3>::GetZero() const
+{
+ return Matrix3( Matrix() );
+}
+
+} // namespace Dali
+
+bool BlendEnabled(const Dali::TraceCallStack& callStack);
+bool BlendDisabled(const Dali::TraceCallStack& callStack);
+
+
+
+
+#endif // __TEST_GL_ES_H__
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "test-gl-sync-abstraction.h"
+
+namespace Dali
+{
+
+TestSyncObject::TestSyncObject(TraceCallStack& trace)
+: synced(false),
+ mTrace(trace)
+{
+}
+
+TestSyncObject::~TestSyncObject()
+{
+}
+
+bool TestSyncObject::IsSynced()
+{
+ mTrace.PushCall("SyncObject::IsSynced", ""); // Trace the method
+ return synced;
+}
+
+
+
+TestGlSyncAbstraction::TestGlSyncAbstraction()
+{
+ Initialize();
+}
+
+/**
+ * Destructor
+ */
+TestGlSyncAbstraction::~TestGlSyncAbstraction()
+{
+ for( SyncIter iter=mSyncObjects.begin(), end=mSyncObjects.end(); iter != end; ++iter )
+ {
+ delete *iter;
+ }
+}
+
+/**
+ * Initialize the sync objects - clear down the map
+ */
+void TestGlSyncAbstraction::Initialize()
+{
+ mSyncObjects.clear();
+}
+
+/**
+ * Create a sync object
+ * @return the sync object
+ */
+Integration::GlSyncAbstraction::SyncObject* TestGlSyncAbstraction::CreateSyncObject( )
+{
+ mTrace.PushCall("CreateSyncObject", ""); // Trace the method
+
+ TestSyncObject* syncObject = new TestSyncObject(mTrace);
+ mSyncObjects.push_back( syncObject );
+ return syncObject;
+}
+
+/**
+ * Destroy a sync object
+ * @param[in] syncObject The object to destroy
+ */
+void TestGlSyncAbstraction::DestroySyncObject( Integration::GlSyncAbstraction::SyncObject* syncObject )
+{
+ std::stringstream out;
+ out << syncObject;
+ mTrace.PushCall("DestroySyncObject", out.str()); // Trace the method
+
+ for( SyncIter iter=mSyncObjects.begin(), end=mSyncObjects.end(); iter != end; ++iter )
+ {
+ if( *iter == syncObject )
+ {
+ delete *iter;
+ mSyncObjects.erase(iter);
+ break;
+ }
+ }
+}
+
+
+Integration::GlSyncAbstraction::SyncObject* TestGlSyncAbstraction::GetLastSyncObject( )
+{
+ if( !mSyncObjects.empty() )
+ {
+ return mSyncObjects.back();
+ }
+ return NULL;
+}
+
+/**
+ * Test method to trigger the object sync behaviour.
+ * @param[in]
+ * @param[in] sync The sync value to set
+ */
+void TestGlSyncAbstraction::SetObjectSynced( Integration::GlSyncAbstraction::SyncObject* syncObject, bool sync )
+{
+ TestSyncObject* testSyncObject = static_cast<TestSyncObject*>(syncObject);
+ testSyncObject->synced = sync;
+}
+
+/**
+ * Turn trace on
+ */
+void TestGlSyncAbstraction::EnableTrace(bool enable) { mTrace.Enable(enable); }
+
+/**
+ * Reset the trace callstack
+ */
+void TestGlSyncAbstraction::ResetTrace() { mTrace.Reset(); }
+
+/**
+ * Get the trace object (allows test case to find methods on it)
+ */
+TraceCallStack& TestGlSyncAbstraction::GetTrace() { return mTrace; }
+
+
+} // Dali
--- /dev/null
+#ifndef __TEST_GL_SYNC_ABSTRACTION_H__
+#define __TEST_GL_SYNC_ABSTRACTION_H__
+
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+// EXTERNAL INCLUDES
+#include <sstream>
+#include <string>
+#include <map>
+
+// INTERNAL INCLUDES
+#include <dali/dali.h>
+#include <dali/integration-api/core.h>
+#include <dali/integration-api/gl-sync-abstraction.h>
+#include "test-trace-call-stack.h"
+
+namespace Dali
+{
+
+class DALI_IMPORT_API TestSyncObject : public Integration::GlSyncAbstraction::SyncObject
+{
+public:
+ TestSyncObject(TraceCallStack& trace);
+ ~TestSyncObject();
+ bool IsSynced();
+ bool synced;
+ TraceCallStack& mTrace;
+};
+
+/**
+ * Class to emulate the GL sync functions with tracing
+ */
+class DALI_IMPORT_API TestGlSyncAbstraction: public Integration::GlSyncAbstraction
+{
+public:
+ /**
+ * Constructor
+ */
+ TestGlSyncAbstraction();
+
+ /**
+ * Destructor
+ */
+ ~TestGlSyncAbstraction();
+
+ /**
+ * Initialize the sync objects - clear down the map
+ */
+ void Initialize();
+
+ /**
+ * Create a sync object
+ * @return the sync object
+ */
+ virtual Integration::GlSyncAbstraction::SyncObject* CreateSyncObject( );
+
+ /**
+ * Destroy a sync object
+ * @param[in] syncObject The object to destroy
+ */
+ virtual void DestroySyncObject( Integration::GlSyncAbstraction::SyncObject* syncObject );
+
+
+public: // TEST FUNCTIONS
+ Integration::GlSyncAbstraction::SyncObject* GetLastSyncObject( );
+
+ /**
+ * Test method to trigger the object sync behaviour.
+ * @param[in]
+ * @param[in] sync The sync value to set
+ */
+ void SetObjectSynced( Integration::GlSyncAbstraction::SyncObject* syncObject, bool sync );
+
+ /**
+ * Turn trace on
+ */
+ void EnableTrace(bool enable);
+
+ /**
+ * Reset the trace callstack
+ */
+ void ResetTrace();
+
+ /**
+ * Get the trace object (allows test case to find methods on it)
+ */
+ TraceCallStack& GetTrace();
+
+private:
+ typedef std::vector<TestSyncObject*> SyncContainer;
+ typedef SyncContainer::iterator SyncIter;
+ SyncContainer mSyncObjects; ///< The sync objects
+ TraceCallStack mTrace; ///< the trace call stack for testing
+};
+
+} // Dali
+
+#endif // __TEST_GL_SYNC_ABSTRACTION_H__
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+
+#include "test-application.h"
+#include "test-native-image.h"
+
+
+namespace Dali
+{
+
+TestNativeImagePointer TestNativeImage::New(int width, int height)
+{
+ return new TestNativeImage(width, height);
+}
+
+TestNativeImage::TestNativeImage(int width, int height)
+: mWidth(width), mHeight(height)
+{
+}
+
+TestNativeImage::~TestNativeImage()
+{
+}
+
+} // namespace dali
--- /dev/null
+#ifndef __TEST_NATIVE_IMAGE_H__
+#define __TEST_NATIVE_IMAGE_H__
+
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+// INTERNAL INCLUDES
+#include <dali/public-api/images/native-image.h>
+
+namespace Dali
+{
+class TestNativeImage;
+typedef IntrusivePtr<TestNativeImage> TestNativeImagePointer;
+
+class DALI_IMPORT_API TestNativeImage : public Dali::NativeImage
+{
+public:
+ static TestNativeImagePointer New(int width, int height);
+
+ inline virtual bool GlExtensionCreate() {return true;};
+ inline virtual void GlExtensionDestroy() {};
+ inline virtual GLenum TargetTexture() {return 1;};
+ inline virtual void PrepareTexture() {};
+ inline virtual unsigned int GetWidth() const {return mWidth;};
+ inline virtual unsigned int GetHeight() const {return mHeight;};
+ inline virtual Pixel::Format GetPixelFormat() const {return Pixel::RGBA8888;};
+
+private:
+ TestNativeImage(int width, int height);
+ virtual ~TestNativeImage();
+
+ int mWidth;
+ int mHeight;
+};
+
+} // Dali
+
+#endif
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "test-platform-abstraction.h"
+#include "dali-test-suite-utils.h"
+#include <dali/integration-api/bitmap.h>
+
+namespace Dali
+{
+
+/**
+ * Constructor
+ */
+TestPlatformAbstraction::TestPlatformAbstraction()
+: mRequest(0)
+{
+ Initialize();
+}
+
+/**
+ * Destructor
+ */
+TestPlatformAbstraction::~TestPlatformAbstraction()
+{
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetTimeMicroseconds()
+ */
+void TestPlatformAbstraction::GetTimeMicroseconds(unsigned int &seconds, unsigned int µSeconds)
+{
+ seconds = mSeconds;
+ microSeconds = mMicroSeconds;
+ mTrace.PushCall("GetTimeMicroseconds", "");
+}
+
+/**
+ * @copydoc PlatformAbstraction::Suspend()
+ */
+void TestPlatformAbstraction::Suspend()
+{
+ mTrace.PushCall("Suspend", "");
+}
+
+/**
+ * @copydoc PlatformAbstraction::Resume()
+ */
+void TestPlatformAbstraction::Resume()
+{
+ mTrace.PushCall("Resume", "");
+}
+
+void TestPlatformAbstraction::GetClosestImageSize( const std::string& filename,
+ const ImageAttributes& attributes,
+ Vector2& closestSize)
+{
+ closestSize = mClosestSize;
+ mTrace.PushCall("GetClosestImageSize", "");
+}
+
+void TestPlatformAbstraction::GetClosestImageSize( Integration::ResourcePointer resourceBuffer,
+ const ImageAttributes& attributes,
+ Vector2& closestSize)
+{
+ closestSize = mClosestSize;
+ mTrace.PushCall("GetClosestImageSize", "");
+}
+
+
+/**
+ * @copydoc PlatformAbstraction::LoadResource()
+ */
+void TestPlatformAbstraction::LoadResource(const Integration::ResourceRequest& request)
+{
+ mTrace.PushCall("LoadResource", "");
+ if(mRequest != NULL)
+ {
+ delete mRequest;
+ tet_infoline ("Warning: multiple resource requests not handled by Test Suite. You may see unexpected errors");
+ }
+ mRequest = new Integration::ResourceRequest(request);
+}
+
+Integration::ResourcePointer TestPlatformAbstraction::LoadResourceSynchronously( const Integration::ResourceType& resourceType, const std::string& resourcePath )
+{
+ mTrace.PushCall("LoadResourceSynchronously", "");
+ return mResources.loadedResource;
+}
+
+/**
+ * @copydoc PlatformAbstraction::SaveResource()
+ */
+void TestPlatformAbstraction::SaveResource(const Integration::ResourceRequest& request)
+{
+ mTrace.PushCall("SaveResource", "");
+ if(mRequest != NULL)
+ {
+ delete mRequest;
+ tet_infoline ("Warning: multiple resource requests not handled by Test Suite. You may see unexpected errors");
+ }
+ mRequest = new Integration::ResourceRequest(request);
+}
+
+/**
+ * @copydoc PlatformAbstraction::CancelLoad()
+ */
+void TestPlatformAbstraction::CancelLoad(Integration::ResourceId id, Integration::ResourceTypeId typeId)
+{
+ mTrace.PushCall("CancelLoad", "");
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetResources()
+ */
+void TestPlatformAbstraction::GetResources(Integration::ResourceCache& cache)
+{
+ mTrace.PushCall("GetResources", "");
+
+ if(mResources.loaded)
+ {
+ cache.LoadResponse( mResources.loadedId, mResources.loadedType, mResources.loadedResource, Integration::RESOURCE_COMPLETELY_LOADED );
+ }
+ if(mResources.loadFailed)
+ {
+ cache.LoadFailed( mResources.loadFailedId, mResources.loadFailure );
+ }
+ if(mResources.saved)
+ {
+ cache.SaveComplete( mResources.savedId, mResources.savedType );
+ }
+ if(mResources.saveFailed)
+ {
+ cache.SaveFailed( mResources.saveFailedId, mResources.saveFailure );
+ }
+}
+
+/**
+ * @copydoc PlatformAbstraction::IsLoading()
+ */
+bool TestPlatformAbstraction::IsLoading()
+{
+ mTrace.PushCall("IsLoading", "");
+ return mIsLoadingResult;
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetDefaultFontFamily()
+ */
+std::string TestPlatformAbstraction::GetDefaultFontFamily() const
+{
+ mTrace.PushCall("GetDefaultFontFamily", "");
+ return mGetDefaultFontFamilyResult;
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetDefaultFontSize()
+ */
+const float TestPlatformAbstraction::GetDefaultFontSize() const
+{
+ mTrace.PushCall("GetDefaultFontSize", "");
+ return mGetDefaultFontSizeResult;
+}
+
+const PixelSize TestPlatformAbstraction::GetFontLineHeightFromCapsHeight(const std::string& fontFamily, const std::string& fontStyle, const CapsHeight& capsHeight) const
+{
+ mTrace.PushCall("GetFontLineHeightFromCapsHeight", "");
+ // LineHeight will be bigger than CapsHeight, so return capsHeight + 1
+ return PixelSize(capsHeight + 1);
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetGlyphData()
+ */
+
+Integration::GlyphSet* TestPlatformAbstraction::GetGlyphData ( const Integration::TextResourceType& textRequest,
+ const std::string& fontFamily,
+ bool getBitmap) const
+{
+ if( getBitmap )
+ {
+ mTrace.PushCall("GetGlyphData", "getBitmap:true");
+ }
+ else
+ {
+ mTrace.PushCall("GetGlyphData", "getBitmap:false");
+ }
+
+ // It creates fake metrics for the received characters.
+
+ Integration::GlyphSet* set = new Dali::Integration::GlyphSet();
+ Integration::BitmapPtr bitmapData;
+
+ std::set<uint32_t> characters;
+
+ for( Integration::TextResourceType::CharacterList::const_iterator it = textRequest.mCharacterList.begin(), endIt = textRequest.mCharacterList.end(); it != endIt; ++it )
+ {
+ if( characters.find( it->character ) == characters.end() )
+ {
+ characters.insert( it->character );
+ Integration::GlyphMetrics character = {it->character, Integration::GlyphMetrics::LOW_QUALITY, 10.0f, 10.0f, 9.0f, 1.0f, 10.0f, it->xPosition, it->yPosition };
+
+ if( getBitmap )
+ {
+ bitmapData = Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true);
+ bitmapData->GetPackedPixelsProfile()->ReserveBuffer(Pixel::A8, 64, 64);
+ PixelBuffer* pixelBuffer = bitmapData->GetBuffer();
+ memset( pixelBuffer, it->character, 64*64 );
+ }
+
+ set->AddCharacter(bitmapData, character);
+ }
+ }
+
+ set->mLineHeight = 10.0f;
+ set->mAscender = 9.0f;
+ set->mUnitsPerEM = 2048.0f/64.0f;
+ set->SetAtlasResourceId( textRequest.mTextureAtlasId );
+ set->mFontHash = textRequest.mFontHash;
+
+ return set;
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetCachedGlyphData()
+ */
+
+Integration::GlyphSet* TestPlatformAbstraction::GetCachedGlyphData( const Integration::TextResourceType& textRequest,
+ const std::string& fontFamily ) const
+{
+ mTrace.PushCall("GetCachedGlyphData", "");
+
+ // It creates fake metrics and bitmap for received numeric characters '0' through '9'.
+ Integration::GlyphSet* set = new Dali::Integration::GlyphSet();
+ Integration::BitmapPtr bitmapData;
+
+ std::set<uint32_t> characters;
+
+ for( Integration::TextResourceType::CharacterList::const_iterator it = textRequest.mCharacterList.begin(), endIt = textRequest.mCharacterList.end(); it != endIt; ++it )
+ {
+ if( it->character >= '0' && it->character <= '9' && characters.find( it->character ) == characters.end() )
+ {
+ characters.insert( it->character );
+ Integration::GlyphMetrics character = {it->character, Integration::GlyphMetrics::HIGH_QUALITY, 10.0f, 10.0f, 9.0f, 1.0f, 10.0f, it->xPosition, it->yPosition };
+
+ bitmapData = Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true);
+ bitmapData->GetPackedPixelsProfile()->ReserveBuffer(Pixel::A8, 64, 64);
+ PixelBuffer* pixelBuffer = bitmapData->GetBuffer();
+ memset( pixelBuffer, it->character, 64*64 );
+ set->AddCharacter(bitmapData, character);
+ }
+ }
+
+ set->mLineHeight = 10.0f;
+ set->mAscender = 9.0f;
+ set->mUnitsPerEM = 2048.0f/64.0f;
+ set->SetAtlasResourceId( textRequest.mTextureAtlasId );
+ set->mFontHash = textRequest.mFontHash;
+
+ return set;
+}
+
+
+/**
+ * @copydoc PlatformAbstraction::GetGlobalMetrics()
+ */
+void TestPlatformAbstraction::GetGlobalMetrics( const std::string& fontFamily,
+ const std::string& fontStyle,
+ Integration::GlobalMetrics& globalMetrics ) const
+{
+ globalMetrics.lineHeight = 10.0f;
+ globalMetrics.ascender = 9.0f;
+ globalMetrics.unitsPerEM = 2048.0f/64.0f;
+ globalMetrics.underlineThickness = 2.f;
+ globalMetrics.underlinePosition = 1.f;
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetFontPath()
+ */
+std::string TestPlatformAbstraction::GetFontPath(const std::string& family, bool bold, bool italic) const
+{
+ mTrace.PushCall("GetFontPath", "");
+ return mGetFontPathResult;
+
+ // Do nothing with arguments
+}
+
+/**
+ * @copydoc PlatformAbstraction::SetDpi()
+ */
+void TestPlatformAbstraction::SetDpi (unsigned int dpiHorizontal, unsigned int dpiVertical)
+{
+ mTrace.PushCall("SetDpi", "");
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetFontFamilyForChars()
+ */
+std::string TestPlatformAbstraction::GetFontFamilyForChars(const TextArray& charsRequested) const
+{
+ mTrace.PushCall("GetFontFamilyForChars", "");
+ return mGetDefaultFontFamilyResult;
+}
+
+/**
+ * @copydoc PlatformAbstraction::AllGlyphsSupported()
+ */
+bool TestPlatformAbstraction::AllGlyphsSupported(const std::string& name, const std::string& fontStyle, const TextArray& text) const
+{
+ mTrace.PushCall("AllGlyphsSupported", "");
+ return true;
+}
+
+/**
+ * @copydoc PlatformAbstraction::ValidateFontFamilyName()
+ */
+bool TestPlatformAbstraction::ValidateFontFamilyName(const std::string& fontFamily, const std::string& fontStyle, bool& isDefaultSystemFont, std::string& closestMatch, std::string& closestStyleMatch) const
+{
+ mTrace.PushCall("ValidateFontFamilyName", "");
+ return true;
+}
+
+/**
+ * @copydoc PlatformAbstraction::GetFontList()
+ */
+std::vector<std::string> TestPlatformAbstraction::GetFontList( PlatformAbstraction::FontListMode mode ) const
+{
+ mFontListMode = mode;
+ mTrace.PushCall("ValidateGetFontList", "");
+ std::vector<std::string> fontList;
+ return fontList;
+}
+
+/**
+ * @copydoc PlatformAbstraction::LoadFile()
+ */
+bool TestPlatformAbstraction::LoadFile( const std::string& filename, std::vector< unsigned char >& buffer ) const
+{
+ mTrace.PushCall("LoadFile", "");
+ if( mLoadFileResult.loadResult )
+ {
+ buffer = mLoadFileResult.buffer;
+ }
+
+ return mLoadFileResult.loadResult;
+}
+
+/**
+ * @copydoc PlatformAbstraction::SaveFile()
+ */
+bool TestPlatformAbstraction::SaveFile(const std::string& filename, std::vector< unsigned char >& buffer) const
+{
+ mTrace.PushCall("SaveFile", "");
+ return false;
+}
+
+void TestPlatformAbstraction::JoinLoaderThreads()
+{
+ mTrace.PushCall("JoinLoaderThreads", "");
+}
+
+void TestPlatformAbstraction::UpdateDefaultsFromDevice()
+{
+ mTrace.PushCall("UpdateDefaultsFromDevice", "");
+ mGetDefaultFontFamilyResult+=1.0f;
+}
+
+Integration::DynamicsFactory* TestPlatformAbstraction::GetDynamicsFactory()
+{
+ mTrace.PushCall("GetDynamicsFactory", "");
+ return NULL;
+}
+
+bool TestPlatformAbstraction::ReadGlobalMetricsFromCache( const std::string& fontFamily,
+ const std::string& fontStyle,
+ Integration::GlobalMetrics& globalMetrics )
+{
+ mTrace.PushCall("ReadGlobalMetricsFromCacheFile", "");
+ globalMetrics = mReadGlobalMetrics; // Want to copy contents...
+ return mReadGlobalMetricsResult; // Default false (will be set to true on subsequent write)
+}
+
+void TestPlatformAbstraction::WriteGlobalMetricsToCache( const std::string& fontFamily,
+ const std::string& fontStyle,
+ const Integration::GlobalMetrics& globalMetrics )
+{
+ // Copy so next read uses written values. TODO: Could add method
+ // to turn this behaviour off for more extensive testing.
+ mReadGlobalMetrics = globalMetrics;
+ mReadGlobalMetricsResult = true;
+
+ mTrace.PushCall("WriteGlobalMetricsToCacheFile", "");
+}
+
+bool TestPlatformAbstraction::ReadMetricsFromCache( const std::string& fontFamily,
+ const std::string& fontStyle,
+ std::vector<Integration::GlyphMetrics>& glyphMetricsContainer )
+{
+ mTrace.PushCall("ReadMetricsFromCacheFile", "");
+ glyphMetricsContainer = mReadMetrics;
+ return mReadMetricsResult; // Default false (will be set to true on subsequent write)
+}
+
+void TestPlatformAbstraction::WriteMetricsToCache( const std::string& fontFamily,
+ const std::string& fontStyle,
+ const Integration::GlyphSet& glyphSet )
+{
+ // Copy so next read uses written values. TODO: Could add method
+ // to turn this behaviour off for more extensive testing.
+ const Integration::GlyphSet::CharacterList& charList = glyphSet.GetCharacterList();
+ mReadMetrics.clear();
+ for(std::size_t i=0, end=charList.size(); i<end; ++i)
+ {
+ mReadMetrics.push_back(charList[i].second);
+ }
+ mReadMetricsResult = true;
+
+ mTrace.PushCall("WriteMetricsToCacheFile", "");
+}
+
+
+void TestPlatformAbstraction::GetFileNamesFromDirectory( const std::string& directoryName,
+ std::vector<std::string>& fileNames )
+{
+ fileNames.push_back( std::string( "u1f004.png" ) );
+ fileNames.push_back( std::string( "u1f0cf.png" ) );
+ fileNames.push_back( std::string( "u1f170.png" ) );
+ fileNames.push_back( std::string( "u1f601.png" ) );
+}
+
+
+Integration::BitmapPtr TestPlatformAbstraction::GetGlyphImage( const std::string& fontFamily, const std::string& fontStyle, float fontSize, uint32_t character ) const
+{
+ Integration::BitmapPtr image = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ image->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 1, 1 );
+
+ mTrace.PushCall("GetGlyphImage", "");
+
+ return image;
+}
+
+
+/** Call this every test */
+void TestPlatformAbstraction::Initialize()
+{
+ mTrace.Reset();
+ mTrace.Enable(true);
+ memset(&mResources, 0, sizeof(Resources));
+ memset(&mReadGlobalMetrics, 0, sizeof(Integration::GlobalMetrics));
+ mSeconds=0;
+ mMicroSeconds=0;
+ mIsLoadingResult=false;
+ mGetDefaultFontFamilyResult = "HelveticaNeue";
+ mGetDefaultFontSizeResult=12.0f;
+ mGetFontPathResult="helvetica-12";
+ mReadMetricsResult=false;
+ mReadGlobalMetricsResult=false;
+
+ if(mRequest)
+ {
+ delete mRequest;
+ mRequest = 0;
+ }
+}
+
+
+bool TestPlatformAbstraction::WasCalled(TestFuncEnum func)
+{
+ switch(func)
+ {
+ case GetTimeMicrosecondsFunc: return mTrace.FindMethod("GetTimeMicroseconds");
+ case SuspendFunc: return mTrace.FindMethod("Suspend");
+ case ResumeFunc: return mTrace.FindMethod("Resume");
+ case LoadResourceFunc: return mTrace.FindMethod("LoadResource");
+ case SaveResourceFunc: return mTrace.FindMethod("SaveResource");
+ case LoadFileFunc: return mTrace.FindMethod("LoadFile");
+ case SaveFileFunc: return mTrace.FindMethod("SaveFile");
+ case CancelLoadFunc: return mTrace.FindMethod("CancelLoad");
+ case GetResourcesFunc: return mTrace.FindMethod("GetResources");
+ case IsLoadingFunc: return mTrace.FindMethod("IsLoading");
+ case GetDefaultFontFamilyFunc: return mTrace.FindMethod("GetDefaultFontFamily");
+ case GetDefaultFontSizeFunc: return mTrace.FindMethod("GetDefaultFontSize");
+ case GetFontLineHeightFromCapsHeightFunc: return mTrace.FindMethod("GetFontLineHeightFromCapsHeight");
+ case GetGlyphDataFunc: return mTrace.FindMethod("GetGlyphData");
+ case GetCachedGlyphDataFunc: return mTrace.FindMethod("GetCachedGlyphData");
+ case GetFontPathFunc: return mTrace.FindMethod("GetFontPath");
+ case SetDpiFunc: return mTrace.FindMethod("SetDpi");
+ case JoinLoaderThreadsFunc: return mTrace.FindMethod("JoinLoaderThreads");
+ case GetFontFamilyForCharsFunc: return mTrace.FindMethod("GetFontFamilyForChars");
+ case AllGlyphsSupportedFunc: return mTrace.FindMethod("AllGlyphsSupported");
+ case ValidateFontFamilyNameFunc: return mTrace.FindMethod("ValidateFontFamilyName");
+ case UpdateDefaultsFromDeviceFunc: return mTrace.FindMethod("UpdateDefaultsFromDevice");
+ case GetDynamicsFactoryFunc: return mTrace.FindMethod("GetDynamicsFactory");
+ case ValidateGetFontListFunc: return mTrace.FindMethod("ValidateGetFontList");
+ case ReadGlobalMetricsFromCacheFileFunc: return mTrace.FindMethod("ReadGlobalMetricsFromCacheFile");
+ case WriteGlobalMetricsToCacheFileFunc: return mTrace.FindMethod("WriteGlobalMetricsToCacheFile");
+ case ReadMetricsFromCacheFileFunc: return mTrace.FindMethod("ReadMetricsFromCacheFile");
+ case WriteMetricsToCacheFileFunc: return mTrace.FindMethod("WriteMetricsToCacheFile");
+ }
+ return false;
+}
+
+void TestPlatformAbstraction::SetGetTimeMicrosecondsResult(size_t sec, size_t usec)
+{
+ mSeconds = sec;
+ mMicroSeconds = usec;
+}
+
+void TestPlatformAbstraction::IncrementGetTimeResult(size_t milliseconds)
+{
+ mMicroSeconds += milliseconds * 1000u;
+ unsigned int additionalSeconds = mMicroSeconds / 1000000u;
+
+ mSeconds += additionalSeconds;
+ mMicroSeconds -= additionalSeconds * 1000000u;
+}
+
+void TestPlatformAbstraction::SetIsLoadingResult(bool result)
+{
+ mIsLoadingResult = result;
+}
+
+void TestPlatformAbstraction::SetGetDefaultFontFamilyResult(std::string result)
+{
+ mGetDefaultFontFamilyResult = result;
+}
+
+void TestPlatformAbstraction::SetGetDefaultFontSizeResult(float result)
+{
+ mGetDefaultFontSizeResult = result;
+}
+
+void TestPlatformAbstraction::SetGetFontPathResult(std::string& result)
+{
+ mGetFontPathResult = result;
+}
+
+void TestPlatformAbstraction::ClearReadyResources()
+{
+ memset(&mResources, 0, sizeof(Resources));
+}
+
+void TestPlatformAbstraction::SetResourceLoaded(Integration::ResourceId loadedId,
+ Integration::ResourceTypeId loadedType,
+ Integration::ResourcePointer loadedResource)
+{
+ mResources.loaded = true;
+ mResources.loadedId = loadedId;
+ mResources.loadedType = loadedType;
+ mResources.loadedResource = loadedResource;
+}
+
+void TestPlatformAbstraction::SetResourceLoadFailed(Integration::ResourceId id,
+ Integration::ResourceFailure failure)
+{
+ mResources.loadFailed = true;
+ mResources.loadFailedId = id;
+ mResources.loadFailure = failure;
+}
+
+void TestPlatformAbstraction::SetResourceSaved(Integration::ResourceId savedId,
+ Integration::ResourceTypeId savedType)
+{
+ mResources.saved = true;
+ mResources.savedId = savedId;
+ mResources.savedType = savedType;
+}
+
+void TestPlatformAbstraction::SetResourceSaveFailed(Integration::ResourceId id,
+ Integration::ResourceFailure failure)
+{
+ mResources.saveFailed = true;
+ mResources.saveFailedId = id;
+ mResources.saveFailure = failure;
+}
+
+Integration::ResourceRequest* TestPlatformAbstraction::GetRequest()
+{
+ return mRequest;
+}
+
+void TestPlatformAbstraction::DiscardRequest()
+{
+ delete mRequest;
+ mRequest = NULL;
+}
+
+void TestPlatformAbstraction::SetClosestImageSize(const Vector2& size)
+{
+ mClosestSize = size;
+}
+
+void TestPlatformAbstraction::SetLoadFileResult( bool result, std::vector< unsigned char >& buffer )
+{
+ mLoadFileResult.loadResult = result;
+ if( result )
+ {
+ mLoadFileResult.buffer = buffer;
+ }
+}
+
+void TestPlatformAbstraction::SetSaveFileResult( bool result )
+{
+ mSaveFileResult = result;
+}
+
+Integration::PlatformAbstraction::FontListMode TestPlatformAbstraction::GetLastFontListMode( )
+{
+ return mFontListMode;
+}
+
+void TestPlatformAbstraction::SetReadGlobalMetricsResult( bool success, Integration::GlobalMetrics& globalMetrics )
+{
+ mReadGlobalMetricsResult = success;
+ mReadGlobalMetrics = globalMetrics;
+}
+
+void TestPlatformAbstraction::SetReadMetricsResult( bool success, std::vector<Integration::GlyphMetrics>& glyphMetricsContainer )
+{
+ mReadMetricsResult = success;
+ mReadMetrics = glyphMetricsContainer; // copy
+}
+
+} // namespace Dali
--- /dev/null
+#ifndef __DALI_TEST_PLATFORM_ABSTRACTION_H__
+#define __DALI_TEST_PLATFORM_ABSTRACTION_H__
+
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+// EXTERNAL INCLUDES
+#include <set>
+#include <stdint.h>
+#include <cstring>
+
+// INTERNAL INCLUDES
+#include <dali/integration-api/platform-abstraction.h>
+
+#include <dali/integration-api/glyph-set.h>
+#include "test-trace-call-stack.h"
+
+
+namespace Dali
+{
+
+/**
+ * Concrete implementation of the platform abstraction class.
+ */
+class DALI_IMPORT_API TestPlatformAbstraction : public Dali::Integration::PlatformAbstraction
+{
+
+public:
+
+ struct Resources
+ {
+ bool loaded;
+ Integration::ResourceId loadedId;
+ Integration::ResourceTypeId loadedType;
+ Integration::ResourcePointer loadedResource;
+
+ bool loadFailed;
+ Integration::ResourceId loadFailedId;
+ Integration::ResourceFailure loadFailure;
+
+ bool saved;
+ Integration::ResourceId savedId;
+ Integration::ResourceTypeId savedType;
+
+ bool saveFailed;
+ Integration::ResourceId saveFailedId;
+ Integration::ResourceFailure saveFailure;
+ };
+
+ struct LoadFileResult
+ {
+ inline LoadFileResult()
+ : loadResult(false)
+ {
+
+ }
+
+ bool loadResult;
+ std::vector< unsigned char> buffer;
+ };
+
+ /**
+ * Constructor
+ */
+ TestPlatformAbstraction();
+
+ /**
+ * Destructor
+ */
+ virtual ~TestPlatformAbstraction();
+
+ /**
+ * @copydoc PlatformAbstraction::GetTimeMicroseconds()
+ */
+ virtual void GetTimeMicroseconds(unsigned int &seconds, unsigned int µSeconds);
+
+ /**
+ * @copydoc PlatformAbstraction::Suspend()
+ */
+ virtual void Suspend();
+
+ /**
+ * @copydoc PlatformAbstraction::Resume()
+ */
+ virtual void Resume();
+
+ virtual void GetClosestImageSize( const std::string& filename,
+ const ImageAttributes& attributes,
+ Vector2& closestSize);
+
+ virtual void GetClosestImageSize( Integration::ResourcePointer resourceBuffer,
+ const ImageAttributes& attributes,
+ Vector2& closestSize);
+
+ /**
+ * @copydoc PlatformAbstraction::LoadResource()
+ */
+ virtual void LoadResource(const Integration::ResourceRequest& request);
+
+ /**
+ * @copydoc PlatformAbstraction::LoadResourceSynchronously()
+ */
+ virtual Integration::ResourcePointer LoadResourceSynchronously( const Integration::ResourceType& resourceType, const std::string& resourcePath );
+
+ /**
+ * @copydoc PlatformAbstraction::SaveResource()
+ */
+ virtual void SaveResource(const Integration::ResourceRequest& request);
+
+ /**
+ * @copydoc PlatformAbstraction::CancelLoad()
+ */
+ virtual void CancelLoad(Integration::ResourceId id, Integration::ResourceTypeId typeId);
+
+ /**
+ * @copydoc PlatformAbstraction::GetResources()
+ */
+ virtual void GetResources(Integration::ResourceCache& cache);
+
+ /**
+ * @copydoc PlatformAbstraction::IsLoading()
+ */
+ virtual bool IsLoading();
+
+ /**
+ * @copydoc PlatformAbstraction::GetDefaultFontFamily()
+ */
+ virtual std::string GetDefaultFontFamily() const;
+
+ /**
+ * @copydoc PlatformAbstraction::GetDefaultFontSize()
+ */
+ virtual const float GetDefaultFontSize() const;
+
+ virtual const Dali::PixelSize GetFontLineHeightFromCapsHeight(const std::string& fontFamily, const std::string& fontStyle, const CapsHeight& capsHeight) const;
+
+ /**
+ * @copydoc PlatformAbstraction::GetGlyphData()
+ */
+ virtual Integration::GlyphSet* GetGlyphData ( const Integration::TextResourceType& textRequest,
+ const std::string& fontFamily,
+ bool getBitmap) const;
+
+ /**
+ * @copydoc PlatformAbstraction::GetCachedGlyphData()
+ */
+ virtual Integration::GlyphSet* GetCachedGlyphData( const Integration::TextResourceType& textRequest,
+ const std::string& fontFamily ) const;
+
+
+ /**
+ * @copydoc PlatformAbstraction::GetGlobalMetrics()
+ */
+ virtual void GetGlobalMetrics( const std::string& fontFamily,
+ const std::string& fontStyle,
+ Integration::GlobalMetrics& globalMetrics ) const;
+
+ /**
+ * @copydoc PlatformAbstraction::GetFontPath()
+ */
+ virtual std::string GetFontPath(const std::string& family, bool bold, bool italic) const;
+
+ /**
+ * @copydoc PlatformAbstraction::SetDpi()
+ */
+ virtual void SetDpi (unsigned int dpiHorizontal, unsigned int dpiVertical);
+
+ /**
+ * @copydoc PlatformAbstraction::GetFontFamilyForChars()
+ */
+ virtual std::string GetFontFamilyForChars(const TextArray& charsRequested) const;
+
+ /**
+ * @copydoc PlatformAbstraction::AllGlyphsSupported()
+ */
+ virtual bool AllGlyphsSupported(const std::string& name, const std::string& fontStyle, const TextArray& text) const;
+
+ /**
+ * @copydoc PlatformAbstraction::ValidateFontFamilyName()
+ */
+ virtual bool ValidateFontFamilyName(const std::string& fontFamily, const std::string& fontStyle, bool& isDefaultSystemFont, std::string& closestMatch, std::string& closestStyleMatch) const;
+
+ /**
+ * @copydoc PlatformAbstraction::GetFontList()
+ */
+ virtual std::vector<std::string> GetFontList( PlatformAbstraction::FontListMode mode ) const;
+
+ /**
+ * @copydoc PlatformAbstraction::LoadFile()
+ */
+ virtual bool LoadFile( const std::string& filename, std::vector< unsigned char >& buffer ) const;
+
+ /**
+ * @copydoc PlatformAbstraction::SaveFile()
+ */
+ virtual bool SaveFile(const std::string& filename, std::vector< unsigned char >& buffer) const;
+
+ virtual void JoinLoaderThreads();
+
+ virtual void UpdateDefaultsFromDevice();
+
+ virtual Integration::DynamicsFactory* GetDynamicsFactory();
+
+ virtual bool ReadGlobalMetricsFromCache( const std::string& fontFamily,
+ const std::string& fontStyle,
+ Integration::GlobalMetrics& globalMetrics );
+
+ virtual void WriteGlobalMetricsToCache( const std::string& fontFamily,
+ const std::string& fontStyle,
+ const Integration::GlobalMetrics& globalMetrics );
+
+ virtual bool ReadMetricsFromCache( const std::string& fontFamily,
+ const std::string& fontStyle,
+ std::vector<Integration::GlyphMetrics>& glyphMetricsContainer );
+ virtual void WriteMetricsToCache( const std::string& fontFamily,
+ const std::string& fontStyle,
+ const Integration::GlyphSet& glyphSet );
+
+
+ virtual void GetFileNamesFromDirectory( const std::string& directoryName,
+ std::vector<std::string>& fileNames );
+
+ virtual Integration::BitmapPtr GetGlyphImage( const std::string& fontFamily, const std::string& fontStyle, float fontSize, uint32_t character ) const;
+
+public: // TEST FUNCTIONS
+
+ // Enumeration of Platform Abstraction methods
+ typedef enum
+ {
+ GetTimeMicrosecondsFunc,
+ SuspendFunc,
+ ResumeFunc,
+ LoadResourceFunc,
+ SaveResourceFunc,
+ SaveFileFunc,
+ LoadFileFunc,
+ CancelLoadFunc,
+ GetResourcesFunc,
+ IsLoadingFunc,
+ GetDefaultFontFamilyFunc,
+ GetDefaultFontSizeFunc,
+ GetFontLineHeightFromCapsHeightFunc,
+ GetGlyphDataFunc,
+ GetCachedGlyphDataFunc,
+ SetDpiFunc,
+ GetFontPathFunc,
+ JoinLoaderThreadsFunc,
+ GetFontFamilyForCharsFunc,
+ AllGlyphsSupportedFunc,
+ ValidateFontFamilyNameFunc,
+ UpdateDefaultsFromDeviceFunc,
+ GetDynamicsFactoryFunc,
+ ValidateGetFontListFunc,
+ ReadGlobalMetricsFromCacheFileFunc,
+ WriteGlobalMetricsToCacheFileFunc,
+ ReadMetricsFromCacheFileFunc,
+ WriteMetricsToCacheFileFunc,
+ } TestFuncEnum;
+
+ /** Call this every test */
+ void Initialize();
+
+ inline void EnableTrace(bool enable) { mTrace.Enable(enable); }
+ inline void ResetTrace() { mTrace.Reset(); }
+ inline TraceCallStack& GetTrace() { return mTrace; }
+
+ bool WasCalled(TestFuncEnum func);
+
+ void SetGetTimeMicrosecondsResult(size_t sec, size_t usec);
+
+ void IncrementGetTimeResult(size_t milliseconds);
+
+ void SetIsLoadingResult(bool result);
+
+ void SetGetDefaultFontFamilyResult(std::string result);
+
+ void SetGetDefaultFontSizeResult(float result);
+
+ void SetGetFontPathResult(std::string& result);
+
+ void ClearReadyResources();
+
+ void SetResourceLoaded(Integration::ResourceId loadedId,
+ Integration::ResourceTypeId loadedType,
+ Integration::ResourcePointer loadedResource);
+
+ void SetResourceLoadFailed(Integration::ResourceId id,
+ Integration::ResourceFailure failure);
+
+ void SetResourceSaved(Integration::ResourceId savedId,
+ Integration::ResourceTypeId savedType);
+
+ void SetResourceSaveFailed(Integration::ResourceId id,
+ Integration::ResourceFailure failure);
+
+ Integration::ResourceRequest* GetRequest();
+
+ void DiscardRequest();
+
+ void SetClosestImageSize(const Vector2& size);
+
+ void SetLoadFileResult( bool result, std::vector< unsigned char >& buffer );
+
+ void SetSaveFileResult( bool result );
+
+ PlatformAbstraction::FontListMode GetLastFontListMode( );
+
+ void SetReadGlobalMetricsResult( bool success, Integration::GlobalMetrics& globalMetrics );
+
+ void SetReadMetricsResult( bool success, std::vector<Integration::GlyphMetrics>& glyphMetricsContainer );
+
+
+private:
+ mutable TraceCallStack mTrace;
+ size_t mSeconds;
+ size_t mMicroSeconds;
+ bool mIsLoadingResult;
+ std::string mGetDefaultFontFamilyResult;
+ float mGetDefaultFontSizeResult;
+ std::string mGetFontPathResult;
+ Resources mResources;
+ Integration::ResourceRequest* mRequest;
+ Vector2 mSize;
+ Vector2 mClosestSize;
+ bool mReadGlobalMetricsResult;
+ bool mReadMetricsResult;
+ Integration::GlobalMetrics mReadGlobalMetrics;
+ std::vector<Integration::GlyphMetrics> mReadMetrics;
+
+ LoadFileResult mLoadFileResult;
+ bool mSaveFileResult;
+ mutable FontListMode mFontListMode;
+};
+
+} // Dali
+
+#endif /* __DALI_TET_PLATFORM_ABSTRACTION_H__ */
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "test-render-controller.h"
+
+namespace Dali
+{
+
+TestRenderController::TestRenderController()
+{
+ Initialize();
+}
+
+TestRenderController::~TestRenderController()
+{
+}
+
+void TestRenderController::RequestUpdate()
+{
+ mRequestUpdateCalled = true;
+}
+
+void TestRenderController::RequestProcessEventsOnIdle()
+{
+ mRequestProcessEventsOnIdleCalled = true;
+}
+
+bool TestRenderController::WasCalled(TestRenderControllerFuncEnum func)
+{
+ switch(func)
+ {
+ case RequestUpdateFunc: return mRequestUpdateCalled;
+ case RequestProcessEventsOnIdleFunc: return mRequestProcessEventsOnIdleCalled;
+ }
+
+ return false;
+}
+
+void TestRenderController::Initialize()
+{
+ mRequestUpdateCalled = false;
+ mRequestProcessEventsOnIdleCalled = false;
+}
+
+
+} // namespace dali
--- /dev/null
+#ifndef __TEST_RENDER_CONTROLLER_H__
+#define __TEST_RENDER_CONTROLLER_H__
+
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+// INTERNAL INCLUDES
+#include <dali/public-api/common/dali-common.h>
+#include <dali/integration-api/render-controller.h>
+
+namespace Dali
+{
+
+class DALI_IMPORT_API TestRenderController : public Dali::Integration::RenderController
+{
+public:
+ TestRenderController();
+ ~TestRenderController();
+
+ virtual void RequestUpdate();
+ virtual void RequestProcessEventsOnIdle();
+
+ typedef enum
+ {
+ RequestUpdateFunc,
+ RequestProcessEventsOnIdleFunc,
+ } TestRenderControllerFuncEnum;
+
+ bool WasCalled(TestRenderControllerFuncEnum func);
+ void Initialize();
+
+
+private:
+ bool mRequestUpdateCalled;
+ bool mRequestProcessEventsOnIdleCalled;
+};
+
+} // Dali
+
+#endif
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "test-trace-call-stack.h"
+
+namespace Dali
+{
+/**
+ * Constructor
+ */
+TraceCallStack::TraceCallStack() : mTraceActive(false) { }
+
+/**
+ * Destructor
+ */
+TraceCallStack::~TraceCallStack() { }
+
+/**
+ * Turn on / off tracing
+ */
+void TraceCallStack::Enable(bool enable) { mTraceActive = enable; }
+
+/**
+ * Push a call onto the stack if the trace is active
+ * @param[in] method The name of the method
+ * @param[in] params A comma separated list of parameter values
+ */
+void TraceCallStack::PushCall(std::string method, std::string params)
+{
+ if(mTraceActive)
+ {
+ std::vector< std::string > functionCall;
+ functionCall.push_back(method);
+ functionCall.push_back(params);
+ mCallStack.push_back( functionCall );
+ }
+}
+
+/**
+ * Search for a method in the stack
+ * @param[in] method The name of the method
+ * @return true if the method was in the stack
+ */
+bool TraceCallStack::FindMethod(std::string method) const
+{
+ bool found = false;
+ for( size_t i=0; i < mCallStack.size(); i++ )
+ {
+ if( 0 == mCallStack[i][0].compare(method) )
+ {
+ found = true;
+ break;
+ }
+ }
+ return found;
+}
+
+/**
+ * Search for a method in the stack with the given parameter list
+ * @param[in] method The name of the method
+ * @param[in] params A comma separated list of parameter values
+ * @return true if the method was in the stack
+ */
+bool TraceCallStack::FindMethodAndParams(std::string method, std::string params) const
+{
+ bool found = false;
+ for( size_t i=0; i < mCallStack.size(); i++ )
+ {
+ if( 0 == mCallStack[i][0].compare(method) && 0 == mCallStack[i][1].compare(params) )
+ {
+ found = true;
+ break;
+ }
+ }
+ return found;
+}
+
+/**
+ * Test if the given method and parameters are at a given index in the stack
+ * @param[in] index Index in the call stack
+ * @param[in] method Name of method to test
+ * @param[in] params A comma separated list of parameter values to test
+ */
+bool TraceCallStack::TestMethodAndParams(int index, std::string method, std::string params) const
+{
+ return ( 0 == mCallStack[index][0].compare(method) && 0 == mCallStack[index][1].compare(params) );
+}
+
+/**
+ * Reset the call stack
+ */
+void TraceCallStack::Reset()
+{
+ mCallStack.clear();
+}
+
+
+} // namespace Dali
--- /dev/null
+#ifndef __TEST_TRACE_CALL_STACK_H__
+#define __TEST_TRACE_CALL_STACK_H__
+
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <string>
+#include <vector>
+
+namespace Dali
+{
+
+/**
+ * Helper class to track method calls in the abstraction and search for them in test cases
+ */
+class TraceCallStack
+{
+public:
+ /**
+ * Constructor
+ */
+ TraceCallStack();
+
+ /**
+ * Destructor
+ */
+ ~TraceCallStack();
+
+ /**
+ * Turn on / off tracing
+ */
+ void Enable(bool enable);
+
+ /**
+ * Push a call onto the stack if the trace is active
+ * @param[in] method The name of the method
+ * @param[in] params A comma separated list of parameter values
+ */
+ void PushCall(std::string method, std::string params);
+
+
+ /**
+ * Search for a method in the stack
+ * @param[in] method The name of the method
+ * @return true if the method was in the stack
+ */
+ bool FindMethod(std::string method) const;
+
+ /**
+ * Search for a method in the stack with the given parameter list
+ * @param[in] method The name of the method
+ * @param[in] params A comma separated list of parameter values
+ * @return true if the method was in the stack
+ */
+ bool FindMethodAndParams(std::string method, std::string params) const;
+
+ /**
+ * Test if the given method and parameters are at a given index in the stack
+ * @param[in] index Index in the call stack
+ * @param[in] method Name of method to test
+ * @param[in] params A comma separated list of parameter values to test
+ */
+ bool TestMethodAndParams(int index, std::string method, std::string params) const;
+
+ /**
+ * Reset the call stack
+ */
+ void Reset();
+
+ /**
+ * Get the call stack
+ * @return The call stack object (Vector of vector[2] of method/paramlist strings)
+ */
+ inline const std::vector< std::vector< std::string > >& GetCallStack() { return mCallStack; }
+
+private:
+ bool mTraceActive; ///< True if the trace is active
+ std::vector< std::vector< std::string > > mCallStack; ///< The call stack
+};
+
+} // namespace dali
+
+#endif //__TEST_TRACE_CALL_STACK_H__
--- /dev/null
+#include <stdio.h>
+#include <string.h>
+#include "tct-dali-core.h"
+
+int main(int argc, const char *argv[])
+{
+ int result = -1;
+ int i;
+
+ if (argc != 2) {
+ printf("Usage: %s <testcase name>\n", argv[0]);
+ return 2;
+ }
+
+ for (i = 0; tc_array[i].name; i++) {
+ if (!strcmp(argv[1], tc_array[i].name)) {
+ if (tc_array[i].startup)
+ tc_array[i].startup();
+
+ result = tc_array[i].function();
+
+ if (tc_array[i].cleanup)
+ tc_array[i].cleanup();
+
+ return result;
+ }
+ }
+
+ printf("Unknown testcase name: \"%s\"\n", argv[1]);
+ return 2;
+}
--- /dev/null
+#ifndef __TCT_DALI_CORE_H__
+#define __TCT_DALI_CORE_H__
+
+#include "testcase.h"
+
+extern void utc_dali_active_constraint_startup(void);
+extern void utc_dali_active_constraint_cleanup(void);
+extern void utc_dali_actor_startup(void);
+extern void utc_dali_actor_cleanup(void);
+extern void utc_dali_alpha_functions_startup(void);
+extern void utc_dali_alpha_functions_cleanup(void);
+extern void utc_dali_angle_axis_startup(void);
+extern void utc_dali_angle_axis_cleanup(void);
+extern void utc_dali_animatable_mesh_startup(void);
+extern void utc_dali_animatable_mesh_cleanup(void);
+extern void utc_dali_animation_startup(void);
+extern void utc_dali_animation_cleanup(void);
+extern void utc_dali_any_startup(void);
+extern void utc_dali_any_cleanup(void);
+extern void utc_base_handle_startup(void);
+extern void utc_base_handle_cleanup(void);
+extern void utc_dali_bitmap_image_startup(void);
+extern void utc_dali_bitmap_image_cleanup(void);
+extern void camera_actor_test_startup(void);
+extern void camera_actor_test_cleanup(void);
+extern void utc_dali_character_startup(void);
+extern void utc_dali_character_cleanup(void);
+extern void utc_dali_constraint_startup(void);
+extern void utc_dali_constraint_cleanup(void);
+extern void custom_actor_test_startup(void);
+extern void custom_actor_test_cleanup(void);
+extern void utc_dali_degree_startup(void);
+extern void utc_dali_degree_cleanup(void);
+extern void utc_dali_event_processing_startup(void);
+extern void utc_dali_event_processing_cleanup(void);
+extern void utc_dali_font_startup(void);
+extern void utc_dali_font_cleanup(void);
+extern void utc_dali_font_parameters_startup(void);
+extern void utc_dali_font_parameters_cleanup(void);
+extern void utc_dali_framebuffer_startup(void);
+extern void utc_dali_framebuffer_cleanup(void);
+extern void utc_dali_gesture_startup(void);
+extern void utc_dali_gesture_cleanup(void);
+extern void utc_dali_gesture_detector_startup(void);
+extern void utc_dali_gesture_detector_cleanup(void);
+extern void handle_test_startup(void);
+extern void handle_test_cleanup(void);
+extern void utc_dali_image_startup(void);
+extern void utc_dali_image_cleanup(void);
+extern void image_actor_test_startup(void);
+extern void image_actor_test_cleanup(void);
+extern void utc_dali_image_attributes_startup(void);
+extern void utc_dali_image_attributes_cleanup(void);
+extern void utc_dali_key_event_startup(void);
+extern void utc_dali_key_event_cleanup(void);
+extern void layer_test_startup(void);
+extern void layer_test_cleanup(void);
+extern void utc_dali_long_press_gesture_startup(void);
+extern void utc_dali_long_press_gesture_cleanup(void);
+extern void utc_dali_long_press_gesture_detector_startup(void);
+extern void utc_dali_long_press_gesture_detector_cleanup(void);
+extern void utc_dali_material_startup(void);
+extern void utc_dali_material_cleanup(void);
+extern void utc_dali_math_utils_startup(void);
+extern void utc_dali_math_utils_cleanup(void);
+extern void utc_dali_matrix_startup(void);
+extern void utc_dali_matrix_cleanup(void);
+extern void utc_dali_matrix3_startup(void);
+extern void utc_dali_matrix3_cleanup(void);
+extern void mesh_actor_test_startup(void);
+extern void mesh_actor_test_cleanup(void);
+extern void utc_dali_pan_gesture_startup(void);
+extern void utc_dali_pan_gesture_cleanup(void);
+extern void utc_dali_pan_gesture_detector_startup(void);
+extern void utc_dali_pan_gesture_detector_cleanup(void);
+extern void utc_dali_pinch_gesture_startup(void);
+extern void utc_dali_pinch_gesture_cleanup(void);
+extern void utc_dali_pinch_gesture_detector_startup(void);
+extern void utc_dali_pinch_gesture_detector_cleanup(void);
+extern void utc_dali_pixel_startup(void);
+extern void utc_dali_pixel_cleanup(void);
+extern void utc_dali_property_notification_startup(void);
+extern void utc_dali_property_notification_cleanup(void);
+extern void utc_dali_quaternion_startup(void);
+extern void utc_dali_quaternion_cleanup(void);
+extern void utc_dali_radian_startup(void);
+extern void utc_dali_radian_cleanup(void);
+extern void utc_dali_rect_startup(void);
+extern void utc_dali_rect_cleanup(void);
+extern void utc_dali_render_task_startup(void);
+extern void utc_dali_render_task_cleanup(void);
+extern void utc_dali_render_task_list_startup(void);
+extern void utc_dali_render_task_list_cleanup(void);
+extern void renderable_actor_startup(void);
+extern void renderable_actor_cleanup(void);
+extern void utc_dali_shader_effect_startup(void);
+extern void utc_dali_shader_effect_cleanup(void);
+extern void utc_dali_signal_templates_functors_startup(void);
+extern void utc_dali_signal_templates_functors_cleanup(void);
+extern void utc_dali_signal_templates_startup(void);
+extern void utc_dali_signal_templates_cleanup(void);
+extern void stage_test_startup(void);
+extern void stage_test_cleanup(void);
+extern void utc_dali_tap_gesture_startup(void);
+extern void utc_dali_tap_gesture_cleanup(void);
+extern void utc_dali_tap_gesture_detector_startup(void);
+extern void utc_dali_tap_gesture_detector_cleanup(void);
+extern void utc_dali_text_startup(void);
+extern void utc_dali_text_cleanup(void);
+extern void text_actor_test_startup(void);
+extern void text_actor_test_cleanup(void);
+extern void utc_dali_text_style_startup(void);
+extern void utc_dali_text_style_cleanup(void);
+extern void utc_dali_touch_event_combiner_startup(void);
+extern void utc_dali_touch_event_combiner_cleanup(void);
+extern void utc_dali_touch_processing_startup(void);
+extern void utc_dali_touch_processing_cleanup(void);
+extern void utc_dali_vector2_startup(void);
+extern void utc_dali_vector2_cleanup(void);
+extern void utc_dali_vector3_startup(void);
+extern void utc_dali_vector3_cleanup(void);
+extern void utc_dali_vector4_startup(void);
+extern void utc_dali_vector4_cleanup(void);
+
+extern int UtcDaliConstraintGetTargetObject(void);
+extern int UtcDaliConstraintGetTargetProperty(void);
+extern int UtcDaliConstraintSetWeight(void);
+extern int UtcDaliConstraintGetCurrentWeight(void);
+extern int UtcDaliConstraintSignalApplied(void);
+extern int UtcDaliConstraintRemove(void);
+extern int UtcDaliConstraintCallback(void);
+extern int UtcDaliConstraintProperties(void);
+extern int UtcDaliActorNew(void);
+extern int UtcDaliActorDownCast(void);
+extern int UtcDaliActorDownCast2(void);
+extern int UtcDaliActorGetName(void);
+extern int UtcDaliActorSetName(void);
+extern int UtcDaliActorGetId(void);
+extern int UtcDaliActorIsRoot(void);
+extern int UtcDaliActorOnStage(void);
+extern int UtcDaliActorIsLayer(void);
+extern int UtcDaliActorGetLayer(void);
+extern int UtcDaliActorAdd(void);
+extern int UtcDaliActorRemove01(void);
+extern int UtcDaliActorRemove02(void);
+extern int UtcDaliActorGetChildCount(void);
+extern int UtcDaliActorGetChildren01(void);
+extern int UtcDaliActorGetChildren02(void);
+extern int UtcDaliActorGetParent01(void);
+extern int UtcDaliActorGetParent02(void);
+extern int UtcDaliActorSetParentOrigin(void);
+extern int UtcDaliActorGetCurrentParentOrigin(void);
+extern int UtcDaliActorSetAnchorPoint(void);
+extern int UtcDaliActorGetCurrentAnchorPoint(void);
+extern int UtcDaliActorSetSize01(void);
+extern int UtcDaliActorSetSize02(void);
+extern int UtcDaliActorSetSize03(void);
+extern int UtcDaliActorSetSize04(void);
+extern int UtcDaliActorGetCurrentSize(void);
+extern int UtcDaliActorSetPosition01(void);
+extern int UtcDaliActorSetPosition02(void);
+extern int UtcDaliActorSetPosition03(void);
+extern int UtcDaliActorSetX(void);
+extern int UtcDaliActorSetY(void);
+extern int UtcDaliActorSetZ(void);
+extern int UtcDaliActorMoveBy(void);
+extern int UtcDaliActorGetCurrentPosition(void);
+extern int UtcDaliActorGetCurrentWorldPosition(void);
+extern int UtcDaliActorInheritPosition(void);
+extern int UtcDaliActorSetRotation01(void);
+extern int UtcDaliActorSetRotation02(void);
+extern int UtcDaliActorRotateBy01(void);
+extern int UtcDaliActorRotateBy02(void);
+extern int UtcDaliActorGetCurrentRotation(void);
+extern int UtcDaliActorGetCurrentWorldRotation(void);
+extern int UtcDaliActorSetScale01(void);
+extern int UtcDaliActorSetScale02(void);
+extern int UtcDaliActorSetScale03(void);
+extern int UtcDaliActorScaleBy(void);
+extern int UtcDaliActorGetCurrentScale(void);
+extern int UtcDaliActorGetCurrentWorldScale(void);
+extern int UtcDaliActorInheritScale(void);
+extern int UtcDaliActorSetVisible(void);
+extern int UtcDaliActorIsVisible(void);
+extern int UtcDaliActorSetOpacity(void);
+extern int UtcDaliActorGetCurrentOpacity(void);
+extern int UtcDaliActorSetSensitive(void);
+extern int UtcDaliActorIsSensitive(void);
+extern int UtcDaliActorSetInheritShaderEffect(void);
+extern int UtcDaliActorGetInheritShaderEffect(void);
+extern int UtcDaliActorSetShaderEffect(void);
+extern int UtcDaliActorGetShaderEffect(void);
+extern int UtcDaliActorRemoveShaderEffect01(void);
+extern int UtcDaliActorRemoveShaderEffect02(void);
+extern int UtcDaliActorSetColor(void);
+extern int UtcDaliActorGetCurrentColor(void);
+extern int UtcDaliActorGetCurrentWorldColor(void);
+extern int UtcDaliActorSetColorMode(void);
+extern int UtcDaliActorScreenToLocal(void);
+extern int UtcDaliActorSetLeaveRequired(void);
+extern int UtcDaliActorGetLeaveRequired(void);
+extern int UtcDaliActorSetKeyboardFocusable(void);
+extern int UtcDaliActorIsKeyboardFocusable(void);
+extern int UtcDaliActorApplyConstraint(void);
+extern int UtcDaliActorApplyConstraintAppliedCallback(void);
+extern int UtcDaliActorRemoveConstraints(void);
+extern int UtcDaliActorRemoveConstraint(void);
+extern int UtcDaliActorTouchedSignal(void);
+extern int UtcDaliActorSetSizeSignal(void);
+extern int UtcDaliActorOnOffStageSignal(void);
+extern int UtcDaliActorFindChildByName(void);
+extern int UtcDaliActorFindChildByAlias(void);
+extern int UtcDaliActorFindChildById(void);
+extern int UtcDaliActorHitTest(void);
+extern int UtcDaliActorSetDrawMode(void);
+extern int UtcDaliActorSetDrawModeOverlayRender(void);
+extern int UtcDaliActorSetDrawModeOverlayHitTest(void);
+extern int UtcDaliActorGetCurrentWorldMatrix(void);
+extern int UtcDaliActorConstrainedToWorldMatrix(void);
+extern int UtcDaliActorUnparent(void);
+extern int UtcDaliActorGetChildAt(void);
+extern int UtcDaliActorSetGetOverlay(void);
+extern int UtcDaliActorDynamics(void);
+extern int UtcDaliActorCreateDestroy(void);
+extern int UtcDaliAlphaFunctionsDefault(void);
+extern int UtcDaliAlphaFunctionsLinear(void);
+extern int UtcDaliAlphaFunctionsReverse(void);
+extern int UtcDaliAlphaFunctionsEaseIn(void);
+extern int UtcDaliAlphaFunctionsEaseOut(void);
+extern int UtcDaliAlphaFunctionsEaseInOut(void);
+extern int UtcDaliAlphaFunctionsEaseInSine(void);
+extern int UtcDaliAlphaFunctionsEaseOutSine(void);
+extern int UtcDaliAlphaFunctionsEaseInOutSine(void);
+extern int UtcDaliAlphaFunctionsBounce(void);
+extern int UtcDaliAlphaFunctionsBounceBack(void);
+extern int UtcDaliAlphaFunctionsEaseOutBack(void);
+extern int UtcDaliAlphaFunctionsSin(void);
+extern int UtcDaliAlphaFunctionsSin2x(void);
+extern int UtcDaliAlphaFunctionsSquare(void);
+extern int UtcDaliAlphaFunctionsEaseInSine33(void);
+extern int UtcDaliAlphaFunctionsEaseOutSine33(void);
+extern int UtcDaliAlphaFunctionsEaseInOutSineXX(void);
+extern int UtcDaliAlphaFunctionsDoubleEaseInOutSine60(void);
+extern int UtcDaliAlphaFunctionsEaseOutQuint50(void);
+extern int UtcDaliAlphaFunctionsEaseOutQuint80(void);
+extern int UtcDaliAlphaFunctionsEaseInBack(void);
+extern int UtcDaliAlphaFunctionsEaseInOutBack(void);
+extern int UtcDaliAngleAxisNew01(void);
+extern int UtcDaliAngleAxisNew02(void);
+extern int UtcDaliAngleAxisNew03(void);
+extern int UtcDaliAngleAxisAssign(void);
+extern int UtcDaliAngleAxisCopy(void);
+extern int UtcDaliAnimatableMeshConstructor01(void);
+extern int UtcDaliAnimatableMeshConstructor02(void);
+extern int UtcDaliAnimatableMeshConstructor03(void);
+extern int UtcDaliAnimatableMeshNew01(void);
+extern int UtcDaliAnimatableMeshNew02(void);
+extern int UtcDaliAnimatableMeshNew03(void);
+extern int UtcDaliAnimatableMeshNew04(void);
+extern int UtcDaliAnimatableMeshNew05(void);
+extern int UtcDaliAnimatableMeshNew06(void);
+extern int UtcDaliAnimatableMeshDownCast01(void);
+extern int UtcDaliAnimatableMeshGetPropertyIndex01(void);
+extern int UtcDaliAnimatableMeshGetPropertyIndex02(void);
+extern int UtcDaliAnimatableMeshGetPropertyIndex03(void);
+extern int UtcDaliAnimatableMeshGetPropertyIndex04(void);
+extern int UtcDaliAnimatableMeshOperatorArray01(void);
+extern int UtcDaliAnimatableMeshOperatorArray02(void);
+extern int UtcDaliAnimatableMeshAnimateVertex01(void);
+extern int UtcDaliAnimatableVertexSettersAndGetters(void);
+extern int UtcDaliAnimatableMeshProperties(void);
+extern int UtcDaliAnimatableMeshExceedVertices(void);
+extern int UtcDaliAnimationNew01(void);
+extern int UtcDaliAnimationNew02(void);
+extern int UtcDaliAnimationDownCast(void);
+extern int UtcDaliAnimationSetDuration(void);
+extern int UtcDaliAnimationGetDuration(void);
+extern int UtcDaliAnimationSetLooping(void);
+extern int UtcDaliAnimationIsLooping(void);
+extern int UtcDaliAnimationSetEndAction(void);
+extern int UtcDaliAnimationGetEndAction(void);
+extern int UtcDaliAnimationGetDestroyAction(void);
+extern int UtcDaliAnimationSetDefaultAlphaFunction(void);
+extern int UtcDaliAnimationGetDefaultAlphaFunction(void);
+extern int UtcDaliAnimationPlay(void);
+extern int UtcDaliAnimationPlayOffStage(void);
+extern int UtcDaliAnimationPlayDiscardHandle(void);
+extern int UtcDaliAnimationPlayStopDiscardHandle(void);
+extern int UtcDaliAnimationPause(void);
+extern int UtcDaliAnimationStop(void);
+extern int UtcDaliAnimationStopSetPosition(void);
+extern int UtcDaliAnimationClear(void);
+extern int UtcDaliAnimationSignalFinish(void);
+extern int UtcDaliAnimationAnimateByBoolean(void);
+extern int UtcDaliAnimationAnimateByBooleanAlphaFunction(void);
+extern int UtcDaliAnimationAnimateByBooleanTimePeriod(void);
+extern int UtcDaliAnimationAnimateByBooleanAlphaFunctionTimePeriod(void);
+extern int UtcDaliAnimationAnimateByFloat(void);
+extern int UtcDaliAnimationAnimateByFloatAlphaFunction(void);
+extern int UtcDaliAnimationAnimateByFloatTimePeriod(void);
+extern int UtcDaliAnimationAnimateByFloatAlphaFunctionTimePeriod(void);
+extern int UtcDaliAnimationAnimateByVector2(void);
+extern int UtcDaliAnimationAnimateByVector2AlphaFunction(void);
+extern int UtcDaliAnimationAnimateByVector2TimePeriod(void);
+extern int UtcDaliAnimationAnimateByVector2AlphaFunctionTimePeriod(void);
+extern int UtcDaliAnimationAnimateByVector3(void);
+extern int UtcDaliAnimationAnimateByVector3AlphaFunction(void);
+extern int UtcDaliAnimationAnimateByVector3TimePeriod(void);
+extern int UtcDaliAnimationAnimateByVector3AlphaFunctionTimePeriod(void);
+extern int UtcDaliAnimationAnimateByVector4(void);
+extern int UtcDaliAnimationAnimateByVector4AlphaFunction(void);
+extern int UtcDaliAnimationAnimateByVector4TimePeriod(void);
+extern int UtcDaliAnimationAnimateByVector4AlphaFunctionTimePeriod(void);
+extern int UtcDaliAnimationAnimateByActorPosition(void);
+extern int UtcDaliAnimationAnimateByActorPositionAlphaFunction(void);
+extern int UtcDaliAnimationAnimateByActorPositionTimePeriod(void);
+extern int UtcDaliAnimationAnimateByActorPositionAlphaFunctionTimePeriod(void);
+extern int UtcDaliAnimationAnimateToBoolean(void);
+extern int UtcDaliAnimationAnimateToBooleanAlphaFunction(void);
+extern int UtcDaliAnimationAnimateToBooleanTimePeriod(void);
+extern int UtcDaliAnimationAnimateToBooleanAlphaFunctionTimePeriod(void);
+extern int UtcDaliAnimationAnimateToFloat(void);
+extern int UtcDaliAnimationAnimateToFloatAlphaFunction(void);
+extern int UtcDaliAnimationAnimateToFloatTimePeriod(void);
+extern int UtcDaliAnimationAnimateToFloatAlphaFunctionTimePeriod(void);
+extern int UtcDaliAnimationAnimateToVector2(void);
+extern int UtcDaliAnimationAnimateToVector2AlphaFunction(void);
+extern int UtcDaliAnimationAnimateToVector2TimePeriod(void);
+extern int UtcDaliAnimationAnimateToVector2AlphaFunctionTimePeriod(void);
+extern int UtcDaliAnimationAnimateToVector3(void);
+extern int UtcDaliAnimationAnimateToVector3AlphaFunction(void);
+extern int UtcDaliAnimationAnimateToVector3TimePeriod(void);
+extern int UtcDaliAnimationAnimateToVector3AlphaFunctionTimePeriod(void);
+extern int UtcDaliAnimationAnimateToVector3Component(void);
+extern int UtcDaliAnimationAnimateToVector4(void);
+extern int UtcDaliAnimationAnimateToVector4AlphaFunction(void);
+extern int UtcDaliAnimationAnimateToVector4TimePeriod(void);
+extern int UtcDaliAnimationAnimateToVector4AlphaFunctionTimePeriod(void);
+extern int UtcDaliAnimationAnimateToActorParentOrigin(void);
+extern int UtcDaliAnimationAnimateToActorParentOriginX(void);
+extern int UtcDaliAnimationAnimateToActorParentOriginY(void);
+extern int UtcDaliAnimationAnimateToActorParentOriginZ(void);
+extern int UtcDaliAnimationAnimateToActorAnchorPoint(void);
+extern int UtcDaliAnimationAnimateToActorAnchorPointX(void);
+extern int UtcDaliAnimationAnimateToActorAnchorPointY(void);
+extern int UtcDaliAnimationAnimateToActorAnchorPointZ(void);
+extern int UtcDaliAnimationAnimateToActorSize(void);
+extern int UtcDaliAnimationAnimateToActorSizeWidth(void);
+extern int UtcDaliAnimationAnimateToActorSizeHeight(void);
+extern int UtcDaliAnimationAnimateToActorSizeDepth(void);
+extern int UtcDaliAnimationAnimateToActorPosition(void);
+extern int UtcDaliAnimationAnimateToActorPositionX(void);
+extern int UtcDaliAnimationAnimateToActorPositionY(void);
+extern int UtcDaliAnimationAnimateToActorPositionZ(void);
+extern int UtcDaliAnimationAnimateToActorPositionAlphaFunction(void);
+extern int UtcDaliAnimationAnimateToActorPositionTimePeriod(void);
+extern int UtcDaliAnimationAnimateToActorPositionAlphaFunctionTimePeriod(void);
+extern int UtcDaliAnimationAnimateToActorRotationAngleAxis(void);
+extern int UtcDaliAnimationAnimateToActorRotationQuaternion(void);
+extern int UtcDaliAnimationAnimateToActorRotationAlphaFunction(void);
+extern int UtcDaliAnimationAnimateToActorRotationTimePeriod(void);
+extern int UtcDaliAnimationAnimateToActorRotationAlphaFunctionTimePeriod(void);
+extern int UtcDaliAnimationAnimateToActorScale(void);
+extern int UtcDaliAnimationAnimateToActorScaleX(void);
+extern int UtcDaliAnimationAnimateToActorScaleY(void);
+extern int UtcDaliAnimationAnimateToActorScaleZ(void);
+extern int UtcDaliAnimationAnimateToActorColor(void);
+extern int UtcDaliAnimationAnimateToActorColorRed(void);
+extern int UtcDaliAnimationAnimateToActorColorGreen(void);
+extern int UtcDaliAnimationAnimateToActorColorBlue(void);
+extern int UtcDaliAnimationAnimateToActorColorAlpha(void);
+extern int UtcDaliAnimationKeyFrames01(void);
+extern int UtcDaliAnimationKeyFrames02(void);
+extern int UtcDaliAnimationKeyFrames03(void);
+extern int UtcDaliAnimationKeyFrames04(void);
+extern int UtcDaliAnimationKeyFrames05(void);
+extern int UtcDaliAnimationKeyFrames06(void);
+extern int UtcDaliAnimationAnimateBetweenActorColorAlpha(void);
+extern int UtcDaliAnimationAnimateBetweenActorColor(void);
+extern int UtcDaliAnimationAnimateBetweenActorVisible01(void);
+extern int UtcDaliAnimationAnimateBetweenActorRotation02(void);
+extern int UtcDaliAnimationMoveByFloat3(void);
+extern int UtcDaliAnimationMoveByVector3Alpha(void);
+extern int UtcDaliAnimationMoveByVector3AlphaFloat2(void);
+extern int UtcDaliAnimationMoveToFloat3(void);
+extern int UtcDaliAnimationMoveToVector3Alpha(void);
+extern int UtcDaliAnimationMoveToVector3AlphaFloat2(void);
+extern int UtcDaliAnimationMove(void);
+extern int UtcDaliAnimationRotateByDegreeVector3(void);
+extern int UtcDaliAnimationRotateByRadianVector3(void);
+extern int UtcDaliAnimationRotateByDegreeVector3Alpha(void);
+extern int UtcDaliAnimationRotateByRadianVector3Alpha(void);
+extern int UtcDaliAnimationRotateByDegreeVector3AlphaFloat2(void);
+extern int UtcDaliAnimationRotateByRadianVector3AlphaFloat2(void);
+extern int UtcDaliAnimationRotateToDegreeVector3(void);
+extern int UtcDaliAnimationRotateToRadianVector3(void);
+extern int UtcDaliAnimationRotateToQuaternion(void);
+extern int UtcDaliAnimationRotateToDegreeVector3Alpha(void);
+extern int UtcDaliAnimationRotateToRadianVector3Alpha(void);
+extern int UtcDaliAnimationRotateToQuaternionAlpha(void);
+extern int UtcDaliAnimationRotateToDegreeVector3AlphaFloat2(void);
+extern int UtcDaliAnimationRotateToRadianVector3AlphaFloat2(void);
+extern int UtcDaliAnimationRotateToQuaternionAlphaFloat2(void);
+extern int UtcDaliAnimationRotate(void);
+extern int UtcDaliAnimationScaleBy(void);
+extern int UtcDaliAnimationScaleTo(void);
+extern int UtcDaliAnimationShow(void);
+extern int UtcDaliAnimationHide(void);
+extern int UtcDaliAnimationShowHideAtEnd(void);
+extern int UtcDaliAnimationOpacityBy(void);
+extern int UtcDaliAnimationOpacityTo(void);
+extern int UtcDaliAnimationColorBy(void);
+extern int UtcDaliAnimationColorTo(void);
+extern int UtcDaliAnimationResize(void);
+extern int UtcDaliAnimationAnimateBool(void);
+extern int UtcDaliAnimationAnimateFloat(void);
+extern int UtcDaliAnimationAnimateVector2(void);
+extern int UtcDaliAnimationAnimateVector3(void);
+extern int UtcDaliAnimationAnimateVector4(void);
+extern int UtcDaliAnimationAnimateQuaternion(void);
+extern int UtcDaliKeyFramesCreateDestroy(void);
+extern int UtcDaliKeyFramesDownCast(void);
+extern int UtcDaliAnimationResizeByXY(void);
+extern int UtcDaliAnimationAnimateBetweenActorColorTimePeriod(void);
+extern int UtcDaliAnimationAnimateBetweenActorColorFunction(void);
+extern int UtcDaliAnimationAnimateBetweenActorColorFunctionTimePeriod(void);
+extern int UtcDaliAnimationAnimateVector3Func(void);
+extern int UtcDaliAnimationCreateDestroy(void);
+extern int UtcDaliAnyConstructors(void);
+extern int UtcDaliAnyAssignmentOperators(void);
+extern int UtcDaliAnyNegativeAssignmentOperators(void);
+extern int UtcDaliAnyGetType(void);
+extern int UtcDaliAnyGet(void);
+extern int UtcDaliAnyNegativeGet(void);
+extern int UtcDaliBaseHandleConstructorVoid(void);
+extern int UtcDaliBaseHandleCopyConstructor(void);
+extern int UtcDaliBaseHandleAssignmentOperator(void);
+extern int UtcDaliBaseHandleGetBaseObject(void);
+extern int UtcDaliBaseHandleReset(void);
+extern int UtcDaliBaseHandleEqualityOperator01(void);
+extern int UtcDaliBaseHandleEqualityOperator02(void);
+extern int UtcDaliBaseHandleInequalityOperator01(void);
+extern int UtcDaliBaseHandleInequalityOperator02(void);
+extern int UtcDaliBaseHandleStlVector(void);
+extern int UtcDaliBaseHandleDoAction(void);
+extern int UtcDaliBaseHandleConnectSignal(void);
+extern int UtcDaliBaseHandleGetTypeName(void);
+extern int UtcDaliBaseHandleGetObjectPtr(void);
+extern int UtcDaliBaseHandleBooleanCast(void);
+extern int UtcDaliBitmapImageNew01(void);
+extern int UtcDaliBitmapImageNew02(void);
+extern int UtcDaliBitmapImageNewWithPolicy01(void);
+extern int UtcDaliBitmapImageNewWithPolicy02(void);
+extern int UtcDaliBitmapImageDownCast(void);
+extern int UtcDaliBitmapImageDownCast2(void);
+extern int UtcDaliBitmapImageWHITE(void);
+extern int UtcDaliBitmapImageGetBuffer(void);
+extern int UtcDaliBitmapImageGetBufferSize(void);
+extern int UtcDaliBitmapImageGetBufferStride(void);
+extern int UtcDaliBitmapImageIsDataExternal(void);
+extern int UtcDaliBitmapImageUpdate01(void);
+extern int UtcDaliBitmapImageUpdate02(void);
+extern int UtcDaliBitmapImageUploadedSignal01(void);
+extern int UtcDaliBitmapImageUploadedSignal02(void);
+extern int UtcDaliCameraActorConstructorVoid(void);
+extern int UtcDaliCameraActorNew(void);
+extern int UtcDaliCameraActorDownCast(void);
+extern int UtcDaliCameraActorDownCast2(void);
+extern int UtcDaliCameraActorSetCameraOffStage(void);
+extern int UtcDaliCameraActorSetCameraOnStage(void);
+extern int UtcDaliCameraActorGetCamera(void);
+extern int UtcDaliCameraActorDefaultProperties(void);
+extern int UtcDaliCameraActorSetTarget(void);
+extern int UtcDaliCameraActorSetType01(void);
+extern int UtcDaliCameraActorSetType02(void);
+extern int UtcDaliCameraActorSetFieldOfView(void);
+extern int UtcDaliCameraActorSetAspectRatio(void);
+extern int UtcDaliCameraActorSetNearClippingPlane(void);
+extern int UtcDaliCameraActorSetFarClippingPlane(void);
+extern int UtcDaliCameraActorSetTargetPosition(void);
+extern int UtcDaliCameraActorSetInvertYAxis(void);
+extern int UtcDaliCameraActorModelView(void);
+extern int UtcDaliCameraActorSetPerspectiveProjection(void);
+extern int UtcDaliCameraActorSetOrthographicProjection01(void);
+extern int UtcDaliCameraActorSetOrthographicProjection02(void);
+extern int UtcDaliCameraActorSetOrthographicProjection03(void);
+extern int UtcDaliCameraActorReadProjectionMatrix(void);
+extern int UtcDaliCameraActorAnimatedProperties(void);
+extern int UtcDaliCameraActorPropertyIndices(void);
+extern int UtcDaliCameraActorCheckLookAtAndFreeLookViews01(void);
+extern int UtcDaliCameraActorCheckLookAtAndFreeLookViews02(void);
+extern int UtcDaliCameraActorCheckLookAtAndFreeLookViews03(void);
+extern int UtcDaliCharacterCopyConstructor(void);
+extern int UtcDaliCharacterComparissonOperators(void);
+extern int UtcDaliCharacterAssignmentOperator(void);
+extern int UtcDaliCharacterIsLeftToRight(void);
+extern int UtcDaliGetCharacterDirection(void);
+extern int UtcDaliCharacterIsWhiteSpace(void);
+extern int UtcDaliCharacterIsNewLine(void);
+extern int UtcDaliConstraintNewBoolean(void);
+extern int UtcDaliConstraintNewFloat(void);
+extern int UtcDaliConstraintNewVector2(void);
+extern int UtcDaliConstraintNewVector3(void);
+extern int UtcDaliConstraintNewVector4(void);
+extern int UtcDaliConstraintNewMatrix(void);
+extern int UtcDaliConstraintNewMatrix3(void);
+extern int UtcDaliConstraintNewQuaternion(void);
+extern int UtcDaliConstraintNewOffStageBoolean(void);
+extern int UtcDaliConstraintNewOffStageFloat(void);
+extern int UtcDaliConstraintNewOffStageVector2(void);
+extern int UtcDaliConstraintNewOffStageVector3(void);
+extern int UtcDaliConstraintNewOffStageVector4(void);
+extern int UtcDaliConstraintNewOffStageQuaternion(void);
+extern int UtcDaliConstraintNewLocalInput(void);
+extern int UtcDaliConstraintNewParentInput(void);
+extern int UtcDaliConstraintNewInput1(void);
+extern int UtcDaliConstraintNewInput2(void);
+extern int UtcDaliConstraintNewInput3(void);
+extern int UtcDaliConstraintNewInput4(void);
+extern int UtcDaliConstraintNewInput5(void);
+extern int UtcDaliConstraintNewInput6(void);
+extern int UtcDaliConstraintDownCast(void);
+extern int UtcDaliConstraintSetApplyTime(void);
+extern int UtcDaliConstraintGetApplyTime(void);
+extern int UtcDaliConstraintSetRemoveTime(void);
+extern int UtcDaliConstraintGetRemoveTime(void);
+extern int UtcDaliConstraintSetAlphaFunction(void);
+extern int UtcDaliConstraintGetAlphaFunction(void);
+extern int UtcDaliConstraintSetRemoveAction(void);
+extern int UtcDaliConstraintGetRemoveAction(void);
+extern int UtcDaliConstraintRemoveDuringApply(void);
+extern int UtcDaliConstraintImmediateRemoveDuringApply(void);
+extern int UtcDaliConstraintActorSize(void);
+extern int UtcDaliConstraintActorSizeWidth(void);
+extern int UtcDaliConstraintActorSizeHeight(void);
+extern int UtcDaliConstraintActorSizeDepth(void);
+extern int UtcDaliConstraintInputWorldPosition(void);
+extern int UtcDaliConstraintInputWorldRotation(void);
+extern int UtcDaliConstraintInputWorldScale(void);
+extern int UtcDaliConstraintInputWorldColor(void);
+extern int UtcDaliConstraintInvalidInputProperty(void);
+extern int UtcDaliBuiltinConstraintParentSize(void);
+extern int UtcDaliBuiltinConstraintParentSizeRelative(void);
+extern int UtcDaliBuiltinConstraintScaleToFitConstraint(void);
+extern int UtcDaliBuiltinConstraintScaleToFitKeepAspectRatio(void);
+extern int UtcDaliBuiltinConstraintScaleToFillKeepAspectRatio(void);
+extern int UtcDaliBuiltinConstraintScaleToFillXYKeepAspectRatio(void);
+extern int UtcDaliBuiltinConstraintShrinkInsideKeepAspectRatioConstraint(void);
+extern int UtcDaliBuiltinConstraintMultiplyConstraint(void);
+extern int UtcDaliBuiltinConstraintDivideConstraint(void);
+extern int UtcDaliBuiltinConstraintEqualToConstraint(void);
+extern int UtcDaliBuiltinConstraintRelativeToConstraint(void);
+extern int UtcDaliBuiltinConstraintInverseOfConstraint(void);
+extern int UtcDaliBuiltinConstraintFunctions(void);
+extern int UtcDaliCustomActorDestructor(void);
+extern int UtcDaliCustomActorImplDestructor(void);
+extern int UtcDaliCustomActorDownCast(void);
+extern int UtcDaliCustomActorDownCastNegative(void);
+extern int UtcDaliCustomActorOnStageConnectionDisconnection(void);
+extern int UtcDaliCustomActorOnStageConnectionOrder(void);
+extern int UtcDaliCustomActorOnStageDisconnectionOrder(void);
+extern int UtcDaliCustomActorAddDuringOnStageConnection(void);
+extern int UtcDaliCustomActorRemoveDuringOnStageConnection(void);
+extern int UtcDaliCustomActorAddDuringOnStageDisconnection(void);
+extern int UtcDaliCustomActorRemoveDuringOnStageDisconnection(void);
+extern int UtcDaliCustomActorRemoveParentDuringOnStageConnection(void);
+extern int UtcDaliCustomActorAddParentDuringOnStageDisconnection(void);
+extern int UtcDaliCustomActorOnChildAddRemove(void);
+extern int UtcDaliCustomActorReparentDuringOnChildAdd(void);
+extern int UtcDaliCustomActorRemoveDuringOnChildRemove(void);
+extern int UtcDaliCustomActorOnPropertySet(void);
+extern int UtcDaliCustomActorOnSizeSet(void);
+extern int UtcDaliCustomActorOnSizeAnimation(void);
+extern int UtcDaliCustomActorOnTouchEvent(void);
+extern int UtcDaliCustomActorOnMouseWheelEvent(void);
+extern int UtcDaliCustomActorFindChildByAlias(void);
+extern int UtcDaliCustomActorImplOnPropertySet(void);
+extern int UtcDaliCustomActorGetImplementation(void);
+extern int UtcDaliDegreeConstructors01(void);
+extern int UtcDaliDegreeComparison01(void);
+extern int UtcDaliDegreeCastOperators01(void);
+extern int UtcDaliDegreeCastOperatorEquals(void);
+extern int UtcDaliDegreeCastOperatorNotEquals(void);
+extern int UtcDaliDegreeCastOperatorLessThan(void);
+extern int UtcDaliInvalidEvent(void);
+extern int UtcDaliInvalidGesture(void);
+extern int UtcDaliFontNew01(void);
+extern int UtcDaliFontNew02(void);
+extern int UtcDaliFontNew03(void);
+extern int UtcDaliFontNew04(void);
+extern int UtcDaliFontNew05(void);
+extern int UtcDaliFontNew06(void);
+extern int UtcDaliFontDownCast(void);
+extern int UtcDaliFontGetPixelSize(void);
+extern int UtcDaliFontGetPointSize(void);
+extern int UtcDaliFontPointsToPixels(void);
+extern int UtcFontMeasureTextWidth(void);
+extern int UtcFontMeasureTextHeight(void);
+extern int UtcFontMeasureText(void);
+extern int UtcFontGetFamilyForText(void);
+extern int UtcFontGetFontLineHeightFromCapsHeight(void);
+extern int UtcFontAllGlyphsSupported(void);
+extern int UtcFontGetMetrics(void);
+extern int UtcFontIsDefault(void);
+extern int UtcFontGetInstalledFonts(void);
+extern int UtcFontMetricsDefaultConstructor(void);
+extern int UtcFontMetricsCopyConstructor(void);
+extern int UtcFontMetricsAssignmentOperator(void);
+extern int UtcDaliFontParamsDefaultConstructor(void);
+extern int UtcDaliFontParamsPointSizeConstructor(void);
+extern int UtcDaliFontParamsPixelSizeConstructor(void);
+extern int UtcDaliFontParamsCopyConstructor(void);
+extern int UtcDaliFontParamsAssignmentOperator(void);
+extern int UtcDaliFontParamsPointSizeEqualityOperator(void);
+extern int UtcDaliFrameBufferImageNew01(void);
+extern int UtcDaliFrameBufferImageDownCast(void);
+extern int UtcDaliGestureConstructor(void);
+extern int UtcDaliGestureAssignment(void);
+extern int UtcDaliGestureDetectorConstructorNegative(void);
+extern int UtcDaliGestureDetectorConstructorPositive(void);
+extern int UtcDaliGestureDetectorDownCast(void);
+extern int UtcDaliGestureDetectorAttachPositive(void);
+extern int UtcDaliGestureDetectorAttachNegative(void);
+extern int UtcDaliGestureDetectorDetachPositive(void);
+extern int UtcDaliGestureDetectorDetachNegative01(void);
+extern int UtcDaliGestureDetectorDetachNegative02(void);
+extern int UtcDaliGestureDetectorDetachNegative03(void);
+extern int UtcDaliGestureDetectorDetachAll(void);
+extern int UtcDaliGestureDetectorDetachAllNegative(void);
+extern int UtcDaliGestureDetectorGetAttachedActors(void);
+extern int UtcDaliHandleConstructorVoid(void);
+extern int UtcDaliHandleCopyConstructor(void);
+extern int UtcDaliHandleAssignmentOperator(void);
+extern int UtcDaliHandleSupports(void);
+extern int UtcDaliHandleGetPropertyCount(void);
+extern int UtcDaliHandleGetPropertyName(void);
+extern int UtcDaliHandleGetPropertyIndex(void);
+extern int UtcDaliHandleIsPropertyWritable(void);
+extern int UtcDaliHandleIsPropertyAnimatable(void);
+extern int UtcDaliHandleGetPropertyType(void);
+extern int UtcDaliHandleNonAnimtableProperties(void);
+extern int UtcDaliHandleNonAnimtableCompositeProperties(void);
+extern int UtcDaliHandleSetProperty01(void);
+extern int UtcDaliHandleSetProperty02(void);
+extern int UtcDaliHandleRegisterProperty(void);
+extern int UtcDaliHandleGetProperty(void);
+extern int UtcDaliHandleDownCast(void);
+extern int UtcDaliHandleCreateProperty(void);
+extern int UtcDaliHandleGetPropertyGet(void);
+extern int UtcDaliHandleGetPropertyIndices(void);
+extern int UtcDaliImageNew01(void);
+extern int UtcDaliImageNew02(void);
+extern int UtcDaliImageNew03(void);
+extern int UtcDaliImageNewWithPolicies01(void);
+extern int UtcDaliImageNewWithPolicies02(void);
+extern int UtcDaliImageNewWithPolicies03(void);
+extern int UtcDaliImageNewWithPolicies04(void);
+extern int UtcDaliImageNewDistanceField(void);
+extern int UtcDaliImageNewDistanceFieldWithPolicies01(void);
+extern int UtcDaliImageNewDistanceFieldWithPolicies02(void);
+extern int UtcDaliImageNewDistanceFieldWithPolicies03(void);
+extern int UtcDaliImageNewDistanceFieldWithPolicies04(void);
+extern int UtcDaliImageNewDistanceFieldWithAttributes(void);
+extern int UtcDaliImageNewDistanceFieldWithAttrandPol(void);
+extern int UtcDaliImageDownCast(void);
+extern int UtcDaliImageGetImageSize(void);
+extern int UtcDaliImageGetFilename(void);
+extern int UtcDaliImageGetLoadingState01(void);
+extern int UtcDaliImageGetLoadingState02(void);
+extern int UtcDaliImageGetReleasePolicy(void);
+extern int UtcDaliImageGetLoadPolicy(void);
+extern int UtcDaliImageSignalLoadingFinished(void);
+extern int UtcDaliImageSignalUploaded(void);
+extern int UtcDaliImageDiscard01(void);
+extern int UtcDaliImageDiscard02(void);
+extern int UtcDaliImageDiscard03(void);
+extern int UtcDaliImageActorConstructorVoid(void);
+extern int UtcDaliImageActorDestructor(void);
+extern int UtcDaliImageActorNew01(void);
+extern int UtcDaliImageActorNew02(void);
+extern int UtcDaliImageActorDownCast(void);
+extern int UtcDaliImageActorDownCast2(void);
+extern int UtcDaliImageActor9Patch(void);
+extern int UtcDaliImageActorPixelArea(void);
+extern int UtcDaliImageActorGetCurrentImageSize01(void);
+extern int UtcDaliImageActorGetCurrentImageSize02(void);
+extern int UtcDaliImageActorGetCurrentImageSize03(void);
+extern int UtcDaliImageActorGetCurrentImageSize04(void);
+extern int UtcDaliImageActorGetCurrentImageSize05(void);
+extern int UtcDaliImageActorNaturalPixelAreaSize01(void);
+extern int UtcDaliImageActorNaturalPixelAreaSize02(void);
+extern int UtcDaliImageActorDefaultProperties(void);
+extern int UtcDaliImageActorUseImageAlpha01(void);
+extern int UtcDaliImageActorUseImageAlpha02(void);
+extern int UtcDaliImageActorUseImageAlpha03(void);
+extern int UtcDaliImageActorUseImageAlpha04(void);
+extern int UtcDaliImageActorUseImageAlpha05(void);
+extern int UtcDaliImageActorClearPixelArea(void);
+extern int UtcDaliImageGetStyle(void);
+extern int UtcDaliImageSetNinePatchBorder(void);
+extern int UtcDaliImageSetFadeIn(void);
+extern int UtcDaliImageSetFadeInDuration(void);
+extern int UtcDaliImageActorNewNull(void);
+extern int UtcDaliImageActorNewNullWithArea(void);
+extern int UtcDaliImageActorSetImage(void);
+extern int UtcDaliImageActorPropertyIndices(void);
+extern int UtcDaliImageAttributesConstructor(void);
+extern int UtcDaliImageAttributesLessThan(void);
+extern int UtcDaliImageAttributesEquality(void);
+extern int UtcDaliImageAttributesInEquality(void);
+extern int UtcDaliKeyEventConstructor(void);
+extern int UtcDaliKeyEventIsShiftModifier(void);
+extern int UtcDaliKeyEventIsCtrlModifier(void);
+extern int UtcDaliKeyEventIsAltModifier(void);
+extern int UtcDaliKeyEventIsNotShiftModifier(void);
+extern int UtcDaliKeyEventIsNotCtrlModifier(void);
+extern int UtcDaliKeyEventIsNotAltModifier(void);
+extern int UtcDaliKeyEventANDModifer(void);
+extern int UtcDaliKeyEventORModifer(void);
+extern int UtcDaliKeyEventState(void);
+extern int UtcDaliIntegrationKeyEvent(void);
+extern int UtcDaliLayerNew(void);
+extern int UtcDaliLayerDownCast(void);
+extern int UtcDaliLayerDownCast2(void);
+extern int UtcDaliLayerGetDepth(void);
+extern int UtcDaliLayerRaise(void);
+extern int UtcDaliLayerLower(void);
+extern int UtcDaliLayerRaiseToTop(void);
+extern int UtcDaliLayerLowerToBottom(void);
+extern int UtcDaliLayerSetClipping(void);
+extern int UtcDaliLayerIsClipping(void);
+extern int UtcDaliLayerSetClippingBox(void);
+extern int UtcDaliLayerGetClippingBox(void);
+extern int UtcDaliLayerSetSortFunction(void);
+extern int UtcDaliLayerRaiseAbove(void);
+extern int UtcDaliLayerRaiseBelow(void);
+extern int UtcDaliLayerMoveAbove(void);
+extern int UtcDaliLayerMoveBelow(void);
+extern int UtcDaliLayerDefaultProperties(void);
+extern int UtcDaliLayerSetDepthTestDisabled(void);
+extern int UtcDaliLayerCreateDestroy(void);
+extern int UtcDaliLayerPropertyIndices(void);
+extern int UtcDaliLongPressGestureConstructor(void);
+extern int UtcDaliLongPressGestureAssignment(void);
+extern int UtcDaliLongPressGestureDetectorConstructor(void);
+extern int UtcDaliLongPressGestureDetectorNew(void);
+extern int UtcDaliLongPressGestureDetectorDownCast(void);
+extern int UtcDaliLongPressGestureSetTouchesRequired01(void);
+extern int UtcDaliLongPressGestureSetTouchesRequired02(void);
+extern int UtcDaliLongPressGestureGetMinimumTouchesRequired(void);
+extern int UtcDaliLongPressGestureGetMaximumTouchesRequired(void);
+extern int UtcDaliLongPressGestureSignalReceptionNegative(void);
+extern int UtcDaliLongPressGestureSignalReceptionPositive(void);
+extern int UtcDaliLongPressGestureSignalReceptionDetach(void);
+extern int UtcDaliLongPressGestureSignalReceptionActorDestroyedDuringLongPress(void);
+extern int UtcDaliLongPressGestureSignalReceptionRotatedActor(void);
+extern int UtcDaliLongPressGestureSignalReceptionChildHit(void);
+extern int UtcDaliLongPressGestureSignalReceptionAttachDetachMany(void);
+extern int UtcDaliLongPressGestureSignalReceptionActorBecomesUntouchable(void);
+extern int UtcDaliLongPressGestureSignalReceptionMultipleGestureDetectors(void);
+extern int UtcDaliLongPressGestureSignalReceptionMultipleDetectorsOnActor(void);
+extern int UtcDaliLongPressGestureSignalReceptionDifferentPossible(void);
+extern int UtcDaliLongPressGestureEmitIncorrecteStateClear(void);
+extern int UtcDaliLongPressGestureEmitIncorrectStateContinuing(void);
+extern int UtcDaliLongPressGestureRepeatedState(void);
+extern int UtcDaliLongPressGesturePossibleCancelled(void);
+extern int UtcDaliLongPressGestureDetachAfterStarted(void);
+extern int UtcDaliLongPressGestureActorUnstaged(void);
+extern int UtcDaliLongPressGestureActorStagedAndDestroyed(void);
+extern int UtcDaliLongPressGestureSystemOverlay(void);
+extern int UtcDaliMaterialNew01(void);
+extern int UtcDaliMaterialDownCast(void);
+extern int UtcDaliMaterialSettersAndGetters(void);
+extern int UtcDaliMaterialStage01(void);
+extern int UtcDaliMaterialStage01MemCheck(void);
+extern int UtcDaliMaterialStage02(void);
+extern int UtcDaliMathUtilsNextPowerOfTwo(void);
+extern int UtcDaliMathUtilsIsPowerOfTwo(void);
+extern int UtcDaliMathUtilsGetRangedEpsilon(void);
+extern int UtcDaliMathUtilsRound(void);
+extern int UtcDaliMathUtilsClamp(void);
+extern int UtcDaliMathUtilsWrapInDomain(void);
+extern int UtcDaliMathUtilsShortestDistanceInDomain(void);
+extern int UtcDaliMathUtilsEquals(void);
+extern int UtcDaliMatrixCtor(void);
+extern int UtcDaliMatrixOrthoNormalize0(void);
+extern int UtcDaliMatrixOrthoNormalize1(void);
+extern int UtcDaliMatrixInvert01(void);
+extern int UtcDaliMatrixInvert02(void);
+extern int UtcDaliMatrixInvertTransform01(void);
+extern int UtcDaliMatrixInvertTransform02(void);
+extern int UtcDaliMatrixGetXAxis(void);
+extern int UtcDaliMatrixGetYAxis(void);
+extern int UtcDaliMatrixGetZAxis(void);
+extern int UtcDaliMatrixGetTranslation(void);
+extern int UtcDaliMatrixGetTranslation3(void);
+extern int UtcDaliMatrixSetIdentity(void);
+extern int UtcDaliMatrixSetIdentityAndScale(void);
+extern int UtcDaliMatrixSetXAxis(void);
+extern int UtcDaliMatrixSetYAxis(void);
+extern int UtcDaliMatrixSetZAxis(void);
+extern int UtcDaliMatrixSetTranslation(void);
+extern int UtcDaliMatrixSetTranslation3(void);
+extern int UtcDaliMatrixTranspose(void);
+extern int UtcDaliMatrixOStreamOperator(void);
+extern int UtcDaliMatrixMultiply(void);
+extern int UtcDaliMatrixOperatorMultiply(void);
+extern int UtcDaliMatrixOperatorMultiply02(void);
+extern int UtcDaliMatrixOperatorEquals(void);
+extern int UtcDaliMatrixOperatorNotEquals(void);
+extern int UtcDaliMatrixGetTransformComponents01(void);
+extern int UtcDaliMatrixGetTransformComponents02(void);
+extern int UtcDaliMatrixSetTransformComponents01(void);
+extern int UtcDaliMatrixSetInverseTransformComponent01(void);
+extern int UtcDaliMatrixSetInverseTransformComponent02(void);
+extern int UtcDaliMatrix3FromMatrix(void);
+extern int UtcDaliMatrix3OperatorAssign01(void);
+extern int UtcDaliMatrix3OperatorAssign02(void);
+extern int UtcDaliMatrix3AsFloat(void);
+extern int UtcDaliMatrix3Invert(void);
+extern int UtcDaliMatrix3Transpose(void);
+extern int UtcDaliMatrix3SetIdentity(void);
+extern int UtcDaliMatrix3Scale(void);
+extern int UtcDaliMatrix3Magnitude(void);
+extern int UtcDaliMatrix3ScaleInverseTranspose(void);
+extern int UtcDaliMatrix3OStreamOperator(void);
+extern int UtcDaliMatrix3Multiply(void);
+extern int UtcDaliMatrix3EqualityOperator(void);
+extern int UtcDaliMatrix3InequalityOperator(void);
+extern int UtcDaliMeshActorConstructorVoid(void);
+extern int UtcDaliMeshActorNew01(void);
+extern int UtcDaliMeshActorIndices(void);
+extern int UtcDaliPanGestureConstructor(void);
+extern int UtcDaliPanGestureAssignment(void);
+extern int UtcDaliPanGestureGetSpeed(void);
+extern int UtcDaliPanGestureGetDistance(void);
+extern int UtcDaliPanGestureGetScreenSpeed(void);
+extern int UtcDaliPanGestureGetScreenDistance(void);
+extern int UtcDaliPanGestureDetectorConstructor(void);
+extern int UtcDaliPanGestureDetectorNew(void);
+extern int UtcDaliPanGestureDetectorDownCast(void);
+extern int UtcDaliPanGestureSetMinimumTouchesRequired(void);
+extern int UtcDaliPanGestureSetMaximumTouchesRequired(void);
+extern int UtcDaliPanGestureGetMinimumTouchesRequired(void);
+extern int UtcDaliPanGestureGetMaximumTouchesRequired(void);
+extern int UtcDaliPanGestureSignalReceptionNegative(void);
+extern int UtcDaliPanGestureSignalReceptionDownMotionLeave(void);
+extern int UtcDaliPanGestureSignalReceptionDownMotionUp(void);
+extern int UtcDaliPanGestureSignalReceptionCancelled(void);
+extern int UtcDaliPanGestureSignalReceptionDetach(void);
+extern int UtcDaliPanGestureSignalReceptionDetachWhilePanning(void);
+extern int UtcDaliPanGestureSignalReceptionActorDestroyedWhilePanning(void);
+extern int UtcDaliPanGestureSignalReceptionRotatedActor(void);
+extern int UtcDaliPanGestureSignalReceptionChildHit(void);
+extern int UtcDaliPanGestureSignalReceptionAttachDetachMany(void);
+extern int UtcDaliPanGestureSignalReceptionActorBecomesUntouchable(void);
+extern int UtcDaliPanGestureSignalReceptionMultipleGestureDetectors(void);
+extern int UtcDaliPanGestureSignalReceptionMultipleDetectorsOnActor(void);
+extern int UtcDaliPanGestureSignalReceptionMultipleStarted(void);
+extern int UtcDaliPanGestureSignalReceptionEnsureCorrectSignalling(void);
+extern int UtcDaliPanGestureSignalReceptionDifferentPossible(void);
+extern int UtcDaliPanGestureEmitIncorrectState(void);
+extern int UtcDaliPanGestureActorUnstaged(void);
+extern int UtcDaliPanGestureActorStagedAndDestroyed(void);
+extern int UtcDaliPanGestureSystemOverlay(void);
+extern int UtcDaliPanGestureAngleHandling(void);
+extern int UtcDaliPanGestureAngleOutOfRange(void);
+extern int UtcDaliPanGestureAngleProcessing(void);
+extern int UtcDaliPanGestureDirectionHandling(void);
+extern int UtcDaliPanGestureDirectionProcessing(void);
+extern int UtcDaliPanGestureSetProperties(void);
+extern int UtcDaliPanGestureSetPropertiesAlreadyPanning(void);
+extern int UtcDaliPanGesturePropertyIndices(void);
+extern int UtcDaliPinchGestureConstructor(void);
+extern int UtcDaliPinchGestureAssignment(void);
+extern int UtcDaliPinchGestureDetectorConstructor(void);
+extern int UtcDaliPinchGestureDetectorNew(void);
+extern int UtcDaliPinchGestureDetectorDownCast(void);
+extern int UtcDaliPinchGestureSignalReceptionNegative(void);
+extern int UtcDaliPinchGestureSignalReceptionDownMotionLeave(void);
+extern int UtcDaliPinchGestureSignalReceptionDownMotionUp(void);
+extern int UtcDaliPinchGestureSignalReceptionCancelled(void);
+extern int UtcDaliPinchGestureSignalReceptionDetach(void);
+extern int UtcDaliPinchGestureSignalReceptionDetachWhilePinching(void);
+extern int UtcDaliPinchGestureSignalReceptionActorDestroyedWhilePinching(void);
+extern int UtcDaliPinchGestureSignalReceptionRotatedActor(void);
+extern int UtcDaliPinchGestureSignalReceptionChildHit(void);
+extern int UtcDaliPinchGestureSignalReceptionAttachDetachMany(void);
+extern int UtcDaliPinchGestureSignalReceptionActorBecomesUntouchable(void);
+extern int UtcDaliPinchGestureSignalReceptionMultipleDetectorsOnActor(void);
+extern int UtcDaliPinchGestureSignalReceptionMultipleStarted(void);
+extern int UtcDaliPinchGestureSignalReceptionEnsureCorrectSignalling(void);
+extern int UtcDaliPinchGestureEmitIncorrectStateClear(void);
+extern int UtcDaliPinchGestureEmitIncorrectStatePossible(void);
+extern int UtcDaliPinchGestureActorUnstaged(void);
+extern int UtcDaliPinchGestureActorStagedAndDestroyed(void);
+extern int UtcDaliPinchGestureSystemOverlay(void);
+extern int UtcDaliPixelHasAlpha(void);
+extern int UtcDaliPixelGetBytesPerPixel(void);
+extern int UtcDaliPixelGetAlphaOffsetAndMask(void);
+extern int UtcDaliPropertyNotificationDownCast(void);
+extern int UtcDaliPropertyNotificationDownCastNegative(void);
+extern int UtcDaliAddPropertyNotification(void);
+extern int UtcDaliAddPropertyNotificationCallback(void);
+extern int UtcDaliAddPropertyNotificationTypeProperty(void);
+extern int UtcDaliPropertyNotificationGetCondition(void);
+extern int UtcDaliPropertyNotificationGetConditionConst(void);
+extern int UtcDaliPropertyNotificationGetTarget(void);
+extern int UtcDaliPropertyNotificationGetProperty(void);
+extern int UtcDaliPropertyNotificationGetNotifyMode(void);
+extern int UtcDaliPropertyNotificationGreaterThan(void);
+extern int UtcDaliPropertyNotificationLessThan(void);
+extern int UtcDaliPropertyNotificationInside(void);
+extern int UtcDaliPropertyNotificationOutside(void);
+extern int UtcDaliPropertyNotificationVectorComponentGreaterThan(void);
+extern int UtcDaliPropertyNotificationVectorComponentLessThan(void);
+extern int UtcDaliPropertyNotificationVectorComponentInside(void);
+extern int UtcDaliPropertyNotificationVectorComponentOutside(void);
+extern int UtcDaliPropertyConditionGetArguments(void);
+extern int UtcDaliPropertyConditionGetArgumentsConst(void);
+extern int UtcDaliPropertyNotificationStep(void);
+extern int UtcDaliPropertyNotificationVariableStep(void);
+extern int UtcDaliQuaternionCtor01(void);
+extern int UtcDaliQuaternionCtor02(void);
+extern int UtcDaliQuaternionCtor03(void);
+extern int UtcDaliQuaternionFromAxisAngle(void);
+extern int UtcDaliQuaternionToAxisAngle01(void);
+extern int UtcDaliQuaternionToAxisAngle02(void);
+extern int UtcDaliQuaternionToAxisAngle03(void);
+extern int UtcDaliQuaternionToAxisAngle04(void);
+extern int UtcDaliQuaternionEulerAngles(void);
+extern int UtcDaliQuaternionToMatrix01(void);
+extern int UtcDaliQuaternionToMatrix02(void);
+extern int UtcDaliQuaternionFromMatrix01(void);
+extern int UtcDaliQuaternionFromMatrix02(void);
+extern int UtcDaliQuaternionFromAxes01(void);
+extern int UtcDaliQuaternionFromAxes02(void);
+extern int UtcDaliQuaternionOperatorAddition(void);
+extern int UtcDaliQuaternionOperatorSubtraction(void);
+extern int UtcDaliQuaternionConjugate(void);
+extern int UtcDaliQuaternionOperatorMultiplication01(void);
+extern int UtcDaliQuaternionOperatorDivision(void);
+extern int UtcDaliQuaternionOperatorScale01(void);
+extern int UtcDaliQuaternionOperatorScale02(void);
+extern int UtcDaliQuaternionOperatorNegation(void);
+extern int UtcDaliQuaternionOperatorAddAssign(void);
+extern int UtcDaliQuaternionOperatorSubtractAssign(void);
+extern int UtcDaliQuaternionOperatorMultiplyAssign(void);
+extern int UtcDaliQuaternionOperatorScaleAssign01(void);
+extern int UtcDaliQuaternionOperatorScaleAssign02(void);
+extern int UtcDaliQuaternionOperatorEquality(void);
+extern int UtcDaliQuaternionOperatorInequality(void);
+extern int UtcDaliQuaternionLength(void);
+extern int UtcDaliQuaternionLengthSquared(void);
+extern int UtcDaliQuaternionNormalize(void);
+extern int UtcDaliQuaternionNormalized(void);
+extern int UtcDaliQuaternionInvert(void);
+extern int UtcDaliQuaternionDot(void);
+extern int UtcDaliQuaternionOperatorMultiplication02(void);
+extern int UtcDaliQuaternionRotate01(void);
+extern int UtcDaliQuaternionRotate02(void);
+extern int UtcDaliQuaternionExp01(void);
+extern int UtcDaliQuaternionExp02(void);
+extern int UtcDaliQuaternionExp03(void);
+extern int UtcDaliQuaternionLog01(void);
+extern int UtcDaliQuaternionLog02(void);
+extern int UtcDaliQuaternionLerp(void);
+extern int UtcDaliQuaternionSlerp01(void);
+extern int UtcDaliQuaternionSlerp02(void);
+extern int UtcDaliQuaternionSlerp03(void);
+extern int UtcDaliQuaternionSlerp04(void);
+extern int UtcDaliQuaternionSlerpNoInvert01(void);
+extern int UtcDaliQuaternionSlerpNoInvert02(void);
+extern int UtcDaliQuaternionSquad(void);
+extern int UtcDaliAngleBetween(void);
+extern int UtcDaliQuaternionOStreamOperator(void);
+extern int UtcDaliRadianConstructors01(void);
+extern int UtcDaliRadianComparison01(void);
+extern int UtcDaliRadianCastOperators01(void);
+extern int UtcDaliRadianCastOperatorEquals(void);
+extern int UtcDaliRadianCastOperatorNotEquals(void);
+extern int UtcDaliRadianCastOperatorLessThan(void);
+extern int UtcDaliRectCons01(void);
+extern int UtcDaliRectCons02(void);
+extern int UtcDaliRectCons03(void);
+extern int UtcDaliRectCons04(void);
+extern int UtcDaliRectSet(void);
+extern int UtcDaliRectIsEmpty(void);
+extern int UtcDaliRectRight(void);
+extern int UtcDaliRectBottom(void);
+extern int UtcDaliRectArea(void);
+extern int UtcDaliRectIntersects(void);
+extern int UtcDaliRectContains(void);
+extern int UtcDaliRectOperatorNotEquals(void);
+extern int UtcDaliRectOperatorEquals(void);
+extern int UtcDaliRenderTaskDownCast(void);
+extern int UtcDaliRenderTaskSetSourceActor(void);
+extern int UtcDaliRenderTaskSetSourceActorOffStage(void);
+extern int UtcDaliRenderTaskSetSourceActorEmpty(void);
+extern int UtcDaliRenderTaskGetSourceActor(void);
+extern int UtcDaliRenderTaskSetExclusive(void);
+extern int UtcDaliRenderTaskIsExclusive(void);
+extern int UtcDaliRenderTaskSetInputEnabled(void);
+extern int UtcDaliRenderTaskGetInputEnabled(void);
+extern int UtcDaliRenderTaskSetCameraActor(void);
+extern int UtcDaliRenderTaskGetCameraActor(void);
+extern int UtcDaliRenderTaskSetTargetFrameBuffer(void);
+extern int UtcDaliRenderTaskGetTargetFrameBuffer(void);
+extern int UtcDaliRenderTaskSetScreenToFrameBufferFunction(void);
+extern int UtcDaliRenderTaskGetScreenToFrameBufferFunction(void);
+extern int UtcDaliRenderTaskGetScreenToFrameBufferMappingActor(void);
+extern int UtcDaliRenderTaskSetViewport(void);
+extern int UtcDaliRenderTaskGetViewport(void);
+extern int UtcDaliRenderTaskSetViewportPosition(void);
+extern int UtcDaliRenderTaskSetViewportSize(void);
+extern int UtcDaliRenderTaskSetClearColor(void);
+extern int UtcDaliRenderTaskGetClearColor(void);
+extern int UtcDaliRenderTaskSetClearEnabled(void);
+extern int UtcDaliRenderTaskGetClearEnabled(void);
+extern int UtcDaliRenderTaskSetRefreshRate(void);
+extern int UtcDaliRenderTaskGetRefreshRate(void);
+extern int UtcDaliRenderTaskSignalFinished(void);
+extern int UtcDaliRenderTaskContinuous01(void);
+extern int UtcDaliRenderTaskContinuous02(void);
+extern int UtcDaliRenderTaskContinuous03(void);
+extern int UtcDaliRenderTaskContinuous04(void);
+extern int UtcDaliRenderTaskContinuous05(void);
+extern int UtcDaliRenderTaskContinuous06(void);
+extern int UtcDaliRenderTaskOnce01(void);
+extern int UtcDaliRenderTaskOnce02(void);
+extern int UtcDaliRenderTaskOnce03(void);
+extern int UtcDaliRenderTaskOnce05(void);
+extern int UtcDaliRenderTaskOnce06(void);
+extern int UtcDaliRenderTaskOnce07(void);
+extern int UtcDaliRenderTaskOnce08(void);
+extern int UtcDaliRenderTaskOnceNoSync01(void);
+extern int UtcDaliRenderTaskOnceNoSync02(void);
+extern int UtcDaliRenderTaskOnceNoSync03(void);
+extern int UtcDaliRenderTaskOnceNoSync05(void);
+extern int UtcDaliRenderTaskOnceNoSync06(void);
+extern int UtcDaliRenderTaskOnceNoSync07(void);
+extern int UtcDaliRenderTaskOnceNoSync08(void);
+extern int UtcDaliRenderTaskOnceChain01(void);
+extern int UtcDaliRenderTaskProperties(void);
+extern int UtcDaliRenderTaskListDefaultConstructor(void);
+extern int UtcDaliRenderTaskListDownCast(void);
+extern int UtcDaliRenderTaskListCreateTask(void);
+extern int UtcDaliRenderTaskListRemoveTask(void);
+extern int UtcDaliRenderTaskListGetTaskCount(void);
+extern int UtcDaliRenderTaskListGetTask(void);
+extern int UtcDaliRenderableActorDownCast(void);
+extern int UtcDaliRenderableActorSetSortModifier(void);
+extern int UtcDaliRenderableActorGetSortModifier(void);
+extern int UtcDaliRenderableActorSetGetBlendMode(void);
+extern int UtcDaliRenderableActorSetCullFace(void);
+extern int UtcDaliRenderableActorGetCullFace(void);
+extern int UtcDaliRenderableActorSetGetBlendFunc(void);
+extern int UtcDaliRenderableActorSetGetBlendEquation(void);
+extern int UtcDaliRenderableActorSetGetBlendColor(void);
+extern int UtcDaliRenderableActorSetGetAlpha(void);
+extern int UtcDaliRenderableActorCreateDestroy(void);
+extern int UtcDaliShaderEffectMethodNew01(void);
+extern int UtcDaliShaderEffectMethodNew02(void);
+extern int UtcDaliShaderEffectMethodNew03(void);
+extern int UtcDaliShaderEffectMethodNew04(void);
+extern int UtcDaliShaderEffectMethodNew05(void);
+extern int UtcDaliShaderEffectMethodNew06(void);
+extern int UtcDaliShaderEffectMethodDownCast(void);
+extern int UtcDaliShaderEffectMethodDelete01(void);
+extern int UtcDaliShaderEffectMethodSetUniformFloat(void);
+extern int UtcDaliShaderEffectMethodSetUniformVector2(void);
+extern int UtcDaliShaderEffectMethodSetUniformVector3(void);
+extern int UtcDaliShaderEffectMethodSetUniformVector4(void);
+extern int UtcDaliShaderEffectMethodSetUniformMatrix(void);
+extern int UtcDaliShaderEffectMethodSetUniformMatrix3(void);
+extern int UtcDaliShaderEffectMethodSetUniformViewport(void);
+extern int UtcDaliShaderEffectMethodSetEffectImage(void);
+extern int UtcDaliShaderEffectMethodSetEffectImageAndDelete(void);
+extern int UtcDaliShaderEffectMethodApplyConstraint(void);
+extern int UtcDaliShaderEffectMethodApplyConstraintFromActor(void);
+extern int UtcDaliShaderEffectMethodApplyConstraintFromActor2(void);
+extern int UtcDaliShaderEffectMethodApplyConstraintCallback(void);
+extern int UtcDaliShaderEffectMethodRemoveConstraints(void);
+extern int UtcDaliShaderEffectMethodRemoveConstraints2(void);
+extern int UtcDaliShaderEffectMethodCreateExtension(void);
+extern int UtcDaliShaderEffectMethodCreateExtension2(void);
+extern int UtcDaliShaderEffectMethodNoExtension(void);
+extern int UtcDaliShaderEffectPropertyIndices(void);
+extern int UtcDaliSignalFunctorsEmptyCheck(void);
+extern int UtcDaliSignalFunctorsEmit(void);
+extern int UtcDaliSignalFunctorsEmitReturn(void);
+extern int UtcDaliSignalFunctorsDisconnectBeforeEmit(void);
+extern int UtcDaliSignalFunctorsDestroySignal(void);
+extern int UtcDaliSignalConnectVoidFunctor(void);
+extern int UtcDaliSignalEmptyCheck(void);
+extern int UtcDaliSignalEmptyCheckSlotDestruction(void);
+extern int UtcDaliSignalConnectAndEmit(void);
+extern int UtcDaliSignalDisconnect(void);
+extern int UtcDaliSignalDisconnect2(void);
+extern int UtcDaliSignalDisconnect3(void);
+extern int UtcDaliSignalCustomConnectionTracker(void);
+extern int UtcDaliSignalMultipleConnections(void);
+extern int UtcDaliSignalMultipleConnections2(void);
+extern int UtcDaliSignalMultipleConnections3(void);
+extern int UtcDaliSignalDisconnectStatic(void);
+extern int UtcDaliSignalDisconnectDuringCallback(void);
+extern int UtcDaliSignalDisconnectDuringCallback2(void);
+extern int UtcDaliSignalEmitDuringCallback(void);
+extern int UtcDaliSignalTestApp01(void);
+extern int UtcDaliSignalTestApp02(void);
+extern int UtcDaliSignalTestApp03(void);
+extern int UtcDaliSignalTestApp04(void);
+extern int UtcDaliSignalTestApp05(void);
+extern int UtcDaliSignalTestApp06(void);
+extern int UtcDaliSlotDelegateConnection(void);
+extern int UtcDaliSignalSlotDelegateDestruction(void);
+extern int UtcDaliSlotHandlerDisconnect(void);
+extern int UtcDaliStageDefaultConstructor(void);
+extern int UtcDaliStageDestructor(void);
+extern int UtcDaliStageGetCurrent(void);
+extern int UtcDaliStageIsInstalled(void);
+extern int UtcDaliStageAdd(void);
+extern int UtcDaliStageRemove(void);
+extern int UtcDaliStageGetSize(void);
+extern int UtcDaliStageGetDpi01(void);
+extern int UtcDaliStageGetDpi02(void);
+extern int UtcDaliStageGetDpi03(void);
+extern int UtcDaliStageGetLayerCount(void);
+extern int UtcDaliStageGetLayer(void);
+extern int UtcDaliStageGetRootLayer(void);
+extern int UtcDaliStageSetBackgroundColor(void);
+extern int UtcDaliStageGetBackgroundColor(void);
+extern int UtcDaliStageKeepRendering(void);
+extern int UtcDaliStageEventProcessingFinished(void);
+extern int UtcDaliStageSignalKeyEvent(void);
+extern int UtcDaliStageTouchedSignal(void);
+extern int UtcDaliTapGestureConstructor(void);
+extern int UtcDaliTapGestureAssignment(void);
+extern int UtcDaliTapGestureDetectorConstructor(void);
+extern int UtcDaliTapGestureDetectorNew(void);
+extern int UtcDaliTapGestureDetectorDownCast(void);
+extern int UtcDaliTapGestureSetTapsRequired(void);
+extern int UtcDaliTapGestureGetTapsRequired(void);
+extern int UtcDaliTapGestureSetTouchesRequired(void);
+extern int UtcDaliTapGestureGetTouchesRequired(void);
+extern int UtcDaliTapGestureSignalReceptionNegative(void);
+extern int UtcDaliTapGestureSignalReceptionPositive(void);
+extern int UtcDaliTapGestureSignalReceptionDetach(void);
+extern int UtcDaliTapGestureSignalReceptionActorDestroyedWhileTapping(void);
+extern int UtcDaliTapGestureSignalReceptionRotatedActor(void);
+extern int UtcDaliTapGestureSignalReceptionChildHit(void);
+extern int UtcDaliTapGestureSignalReceptionAttachDetachMany(void);
+extern int UtcDaliTapGestureSignalReceptionActorBecomesUntouchable(void);
+extern int UtcDaliTapGestureSignalReceptionMultipleGestureDetectors(void);
+extern int UtcDaliTapGestureSignalReceptionMultipleDetectorsOnActor(void);
+extern int UtcDaliTapGestureSignalReceptionDifferentPossible(void);
+extern int UtcDaliTapGestureEmitIncorrectStateClear(void);
+extern int UtcDaliTapGestureEmitIncorrectStateContinuing(void);
+extern int UtcDaliTapGestureEmitIncorrectStateFinished(void);
+extern int UtcDaliTapGestureActorUnstaged(void);
+extern int UtcDaliTapGestureRepeatedState(void);
+extern int UtcDaliTapGesturePossibleCancelled(void);
+extern int UtcDaliTapGestureDetectorRemovedWhilePossible(void);
+extern int UtcDaliTapGestureActorRemovedWhilePossible(void);
+extern int UtcDaliTapGestureSystemOverlay(void);
+extern int UtcDaliTextConstructor(void);
+extern int UtcDaliTextCopyConstructor(void);
+extern int UtcDaliTextAssignmentOperator(void);
+extern int UtcDaliTextSetGetText(void);
+extern int UtcDaliTextAccessOperator01(void);
+extern int UtcDaliTextAccessOperator02(void);
+extern int UtcDaliTextIsEmpty(void);
+extern int UtcDaliTextGetLength(void);
+extern int UtcDaliTextAppend(void);
+extern int UtcDaliTextRemove01(void);
+extern int UtcDaliTextRemove02(void);
+extern int UtcDaliTextActorConstructorVoid(void);
+extern int UtcDaliTextActorNew01(void);
+extern int UtcDaliTextActorNew02(void);
+extern int UtcDaliTextActorNew03(void);
+extern int UtcDaliTextActorNew04(void);
+extern int UtcDaliTextActorNew05(void);
+extern int UtcDaliTextActorNew06(void);
+extern int UtcDaliTextActorNew07(void);
+extern int UtcDaliTextActorDownCast(void);
+extern int UtcDaliTextActorDownCast2(void);
+extern int UtcDaliTextActorSetText(void);
+extern int UtcDaliTextActorSetFont(void);
+extern int UtcDaliTextActorSetFontDetection(void);
+extern int UtcDaliTextActorSetTextIndividualStyles(void);
+extern int UtcDaliTextActorChangingText(void);
+extern int UtcDaliTextActorGetLoadingState(void);
+extern int UtcDaliTextActorSetItalics(void);
+extern int UtcDaliTextActorSetUnderline(void);
+extern int UtcDaliTextActorSetWeight(void);
+extern int UtcDaliTextActorSetStyle(void);
+extern int UtcDaliTextActorDefaultProperties(void);
+extern int UtcDaliTextActorSetGradientColor(void);
+extern int UtcDaliTextActorSetGradientStartPoint(void);
+extern int UtcDaliTextActorSetGradientEndPoint(void);
+extern int UtcDaliTextActorSynchronousGlyphLoading(void);
+extern int UtcDaliTextActorAutomaticSizeSet(void);
+extern int UtcDaliTextActorAutomaticSizeSetAnimation(void);
+extern int UtcDaliTextActorPropertyIndices(void);
+extern int UtcDaliTextStyleDefaultConstructor(void);
+extern int UtcDaliTextStyleCopyConstructor(void);
+extern int UtcDaliTextStyleComparisonOperator(void);
+extern int UtcDaliTextStyleCopy(void);
+extern int UtcDaliTextStyleSetGetFontName(void);
+extern int UtcDaliTextStyleSetGetFontStyle(void);
+extern int UtcDaliTextStyleSetGetFontPointSize(void);
+extern int UtcDaliTextStyleSetGetWeight(void);
+extern int UtcDaliTextStyleSetGetTextColor(void);
+extern int UtcDaliTextStyleSetGetItalics(void);
+extern int UtcDaliTextStyleSetGetItalicsAngle(void);
+extern int UtcDaliTextStyleSetGetUnderline(void);
+extern int UtcDaliTextStyleSetGetShadow(void);
+extern int UtcDaliTextStyleSetGetGlow(void);
+extern int UtcDaliTextStyleSetGetOutline(void);
+extern int UtcDaliTextStyleSetGetSmoothEdge(void);
+extern int UtcDaliTouchEventCombinerConstructors(void);
+extern int UtcDaliTouchEventCombinerConstructorsNegative(void);
+extern int UtcDaliTouchEventCombinerSettersAndGetters(void);
+extern int UtcDaliTouchEventCombinerSettersNegative(void);
+extern int UtcDaliTouchEventCombinerSingleTouchNormal(void);
+extern int UtcDaliTouchEventCombinerSingleTouchMotionWithoutDown(void);
+extern int UtcDaliTouchEventCombinerSingleTouchTwoDowns(void);
+extern int UtcDaliTouchEventCombinerSingleTouchUpWithoutDown(void);
+extern int UtcDaliTouchEventCombinerSingleTouchTwoUps(void);
+extern int UtcDaliTouchEventCombinerSingleTouchUpWithDifferentId(void);
+extern int UtcDaliTouchEventCombinerSingleTouchMotionWithDifferentId(void);
+extern int UtcDaliTouchEventCombinerMultiTouchNormal(void);
+extern int UtcDaliTouchEventCombinerSeveralPoints(void);
+extern int UtcDaliTouchEventCombinerReset(void);
+extern int UtcDaliTouchEventCombinerSingleTouchInterrupted(void);
+extern int UtcDaliTouchEventCombinerMultiTouchInterrupted(void);
+extern int UtcDaliTouchEventCombinerInvalidState(void);
+extern int UtcDaliTouchNormalProcessing(void);
+extern int UtcDaliTouchOutsideCameraNearFarPlanes(void);
+extern int UtcDaliTouchEmitEmpty(void);
+extern int UtcDaliTouchInterrupted(void);
+extern int UtcDaliTouchParentConsumer(void);
+extern int UtcDaliTouchInterruptedParentConsumer(void);
+extern int UtcDaliTouchLeave(void);
+extern int UtcDaliTouchLeaveParentConsumer(void);
+extern int UtcDaliTouchActorBecomesInsensitive(void);
+extern int UtcDaliTouchActorBecomesInsensitiveParentConsumer(void);
+extern int UtcDaliTouchMultipleLayers(void);
+extern int UtcDaliTouchMultipleRenderTasks(void);
+extern int UtcDaliTouchMultipleRenderTasksWithChildLayer(void);
+extern int UtcDaliTouchOffscreenRenderTasks(void);
+extern int UtcDaliTouchMultipleRenderableActors(void);
+extern int UtcDaliTouchActorRemovedInSignal(void);
+extern int UtcDaliTouchActorSignalNotConsumed(void);
+extern int UtcDaliTouchActorUnStaged(void);
+extern int UtcDaliTouchSystemOverlayActor(void);
+extern int UtcDaliVector2Cons(void);
+extern int UtcDaliVector2FitInside(void);
+extern int UtcDaliVector2FitScaleToFill(void);
+extern int UtcDaliVector2ShrinkInside(void);
+extern int UtcDaliVector2Add(void);
+extern int UtcDaliVector2Subtract(void);
+extern int UtcDaliVector2Negate(void);
+extern int UtcDaliVector2Multiply(void);
+extern int UtcDaliVector2Divide(void);
+extern int UtcDaliVector2Scale(void);
+extern int UtcDaliVector2Equals(void);
+extern int UtcDaliVector2Length(void);
+extern int UtcDaliVector2LengthSquared(void);
+extern int UtcDaliVector2Max(void);
+extern int UtcDaliVector2Min(void);
+extern int UtcDaliVector2Clamp(void);
+extern int UtcDaliVector2ClampVector2(void);
+extern int UtcDaliVector2Normalize(void);
+extern int UtcDaliVector2OperatorSubscript(void);
+extern int UtcDaliVector2OStreamOperator(void);
+extern int UtcDaliVector3Cons(void);
+extern int UtcDaliVector3Assign(void);
+extern int UtcDaliVector3Add(void);
+extern int UtcDaliVector3Constants(void);
+extern int UtcDaliVector3Cross(void);
+extern int UtcDaliVector3Dot(void);
+extern int UtcDaliVector3Equals(void);
+extern int UtcDaliVector3Length(void);
+extern int UtcDaliVector3LengthSquared(void);
+extern int UtcDaliVector3Max(void);
+extern int UtcDaliVector3Min(void);
+extern int UtcDaliVector3Clamp(void);
+extern int UtcDaliVector3ClampVector3(void);
+extern int UtcDaliVector3Multiply(void);
+extern int UtcDaliVector3Divide(void);
+extern int UtcDaliVector3Scale(void);
+extern int UtcDaliVector3Normalize(void);
+extern int UtcDaliVector3Subtract(void);
+extern int UtcDaliVector3OperatorSubscript(void);
+extern int UtcDaliVector3OStreamOperator(void);
+extern int UtcDaliVector3Rotate(void);
+extern int UtcDaliVector3AsFloat(void);
+extern int UtcDaliVector3AsVectorXY(void);
+extern int UtcDaliVector3FitKeepAspectRatio(void);
+extern int UtcDaliVector3FillKeepAspectRatio(void);
+extern int UtcDaliVector3FillXYKeepAspectRatio(void);
+extern int UtcDaliVector3ShrinkInsideKeepAspectRatio(void);
+extern int UtcDaliVector4Vector4(void);
+extern int UtcDaliVector4Add(void);
+extern int UtcDaliVector4Constants(void);
+extern int UtcDaliVector4Cross(void);
+extern int UtcDaliVector4Dot(void);
+extern int UtcDaliVector4DotVector3(void);
+extern int UtcDaliVector4Dot4(void);
+extern int UtcDaliVector4Equals(void);
+extern int UtcDaliVector4Length(void);
+extern int UtcDaliVector4LengthSquared(void);
+extern int UtcDaliVector4Max(void);
+extern int UtcDaliVector4Min(void);
+extern int UtcDaliVector4Clamp(void);
+extern int UtcDaliVector4ClampVector4(void);
+extern int UtcDaliVector4Multiply(void);
+extern int UtcDaliVector4Divide(void);
+extern int UtcDaliVector4Scale(void);
+extern int UtcDaliVector4Normalize(void);
+extern int UtcDaliVector4Subtract(void);
+extern int UtcDaliVector4OperatorSubscript(void);
+extern int UtcDaliVector4OStreamOperator(void);
+extern int UtcDaliVector4AsFloat(void);
+
+testcase tc_array[] = {
+ {"UtcDaliConstraintGetTargetObject", UtcDaliConstraintGetTargetObject, utc_dali_active_constraint_startup, utc_dali_active_constraint_cleanup},
+ {"UtcDaliConstraintGetTargetProperty", UtcDaliConstraintGetTargetProperty, utc_dali_active_constraint_startup, utc_dali_active_constraint_cleanup},
+ {"UtcDaliConstraintSetWeight", UtcDaliConstraintSetWeight, utc_dali_active_constraint_startup, utc_dali_active_constraint_cleanup},
+ {"UtcDaliConstraintGetCurrentWeight", UtcDaliConstraintGetCurrentWeight, utc_dali_active_constraint_startup, utc_dali_active_constraint_cleanup},
+ {"UtcDaliConstraintSignalApplied", UtcDaliConstraintSignalApplied, utc_dali_active_constraint_startup, utc_dali_active_constraint_cleanup},
+ {"UtcDaliConstraintRemove", UtcDaliConstraintRemove, utc_dali_active_constraint_startup, utc_dali_active_constraint_cleanup},
+ {"UtcDaliConstraintCallback", UtcDaliConstraintCallback, utc_dali_active_constraint_startup, utc_dali_active_constraint_cleanup},
+ {"UtcDaliConstraintProperties", UtcDaliConstraintProperties, utc_dali_active_constraint_startup, utc_dali_active_constraint_cleanup},
+ {"UtcDaliActorNew", UtcDaliActorNew, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorDownCast", UtcDaliActorDownCast, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorDownCast2", UtcDaliActorDownCast2, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetName", UtcDaliActorGetName, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetName", UtcDaliActorSetName, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetId", UtcDaliActorGetId, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorIsRoot", UtcDaliActorIsRoot, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorOnStage", UtcDaliActorOnStage, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorIsLayer", UtcDaliActorIsLayer, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetLayer", UtcDaliActorGetLayer, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorAdd", UtcDaliActorAdd, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorRemove01", UtcDaliActorRemove01, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorRemove02", UtcDaliActorRemove02, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetChildCount", UtcDaliActorGetChildCount, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetChildren01", UtcDaliActorGetChildren01, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetChildren02", UtcDaliActorGetChildren02, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetParent01", UtcDaliActorGetParent01, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetParent02", UtcDaliActorGetParent02, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetParentOrigin", UtcDaliActorSetParentOrigin, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetCurrentParentOrigin", UtcDaliActorGetCurrentParentOrigin, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetAnchorPoint", UtcDaliActorSetAnchorPoint, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetCurrentAnchorPoint", UtcDaliActorGetCurrentAnchorPoint, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetSize01", UtcDaliActorSetSize01, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetSize02", UtcDaliActorSetSize02, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetSize03", UtcDaliActorSetSize03, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetSize04", UtcDaliActorSetSize04, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetCurrentSize", UtcDaliActorGetCurrentSize, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetPosition01", UtcDaliActorSetPosition01, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetPosition02", UtcDaliActorSetPosition02, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetPosition03", UtcDaliActorSetPosition03, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetX", UtcDaliActorSetX, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetY", UtcDaliActorSetY, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetZ", UtcDaliActorSetZ, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorMoveBy", UtcDaliActorMoveBy, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetCurrentPosition", UtcDaliActorGetCurrentPosition, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetCurrentWorldPosition", UtcDaliActorGetCurrentWorldPosition, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorInheritPosition", UtcDaliActorInheritPosition, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetRotation01", UtcDaliActorSetRotation01, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetRotation02", UtcDaliActorSetRotation02, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorRotateBy01", UtcDaliActorRotateBy01, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorRotateBy02", UtcDaliActorRotateBy02, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetCurrentRotation", UtcDaliActorGetCurrentRotation, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetCurrentWorldRotation", UtcDaliActorGetCurrentWorldRotation, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetScale01", UtcDaliActorSetScale01, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetScale02", UtcDaliActorSetScale02, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetScale03", UtcDaliActorSetScale03, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorScaleBy", UtcDaliActorScaleBy, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetCurrentScale", UtcDaliActorGetCurrentScale, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetCurrentWorldScale", UtcDaliActorGetCurrentWorldScale, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorInheritScale", UtcDaliActorInheritScale, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetVisible", UtcDaliActorSetVisible, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorIsVisible", UtcDaliActorIsVisible, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetOpacity", UtcDaliActorSetOpacity, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetCurrentOpacity", UtcDaliActorGetCurrentOpacity, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetSensitive", UtcDaliActorSetSensitive, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorIsSensitive", UtcDaliActorIsSensitive, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetInheritShaderEffect", UtcDaliActorSetInheritShaderEffect, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetInheritShaderEffect", UtcDaliActorGetInheritShaderEffect, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetShaderEffect", UtcDaliActorSetShaderEffect, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetShaderEffect", UtcDaliActorGetShaderEffect, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorRemoveShaderEffect01", UtcDaliActorRemoveShaderEffect01, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorRemoveShaderEffect02", UtcDaliActorRemoveShaderEffect02, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetColor", UtcDaliActorSetColor, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetCurrentColor", UtcDaliActorGetCurrentColor, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetCurrentWorldColor", UtcDaliActorGetCurrentWorldColor, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetColorMode", UtcDaliActorSetColorMode, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorScreenToLocal", UtcDaliActorScreenToLocal, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetLeaveRequired", UtcDaliActorSetLeaveRequired, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetLeaveRequired", UtcDaliActorGetLeaveRequired, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetKeyboardFocusable", UtcDaliActorSetKeyboardFocusable, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorIsKeyboardFocusable", UtcDaliActorIsKeyboardFocusable, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorApplyConstraint", UtcDaliActorApplyConstraint, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorApplyConstraintAppliedCallback", UtcDaliActorApplyConstraintAppliedCallback, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorRemoveConstraints", UtcDaliActorRemoveConstraints, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorRemoveConstraint", UtcDaliActorRemoveConstraint, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorTouchedSignal", UtcDaliActorTouchedSignal, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetSizeSignal", UtcDaliActorSetSizeSignal, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorOnOffStageSignal", UtcDaliActorOnOffStageSignal, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorFindChildByName", UtcDaliActorFindChildByName, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorFindChildByAlias", UtcDaliActorFindChildByAlias, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorFindChildById", UtcDaliActorFindChildById, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorHitTest", UtcDaliActorHitTest, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetDrawMode", UtcDaliActorSetDrawMode, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetDrawModeOverlayRender", UtcDaliActorSetDrawModeOverlayRender, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetDrawModeOverlayHitTest", UtcDaliActorSetDrawModeOverlayHitTest, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetCurrentWorldMatrix", UtcDaliActorGetCurrentWorldMatrix, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorConstrainedToWorldMatrix", UtcDaliActorConstrainedToWorldMatrix, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorUnparent", UtcDaliActorUnparent, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorGetChildAt", UtcDaliActorGetChildAt, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorSetGetOverlay", UtcDaliActorSetGetOverlay, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorDynamics", UtcDaliActorDynamics, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliActorCreateDestroy", UtcDaliActorCreateDestroy, utc_dali_actor_startup, utc_dali_actor_cleanup},
+ {"UtcDaliAlphaFunctionsDefault", UtcDaliAlphaFunctionsDefault, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsLinear", UtcDaliAlphaFunctionsLinear, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsReverse", UtcDaliAlphaFunctionsReverse, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsEaseIn", UtcDaliAlphaFunctionsEaseIn, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsEaseOut", UtcDaliAlphaFunctionsEaseOut, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsEaseInOut", UtcDaliAlphaFunctionsEaseInOut, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsEaseInSine", UtcDaliAlphaFunctionsEaseInSine, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsEaseOutSine", UtcDaliAlphaFunctionsEaseOutSine, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsEaseInOutSine", UtcDaliAlphaFunctionsEaseInOutSine, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsBounce", UtcDaliAlphaFunctionsBounce, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsBounceBack", UtcDaliAlphaFunctionsBounceBack, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsEaseOutBack", UtcDaliAlphaFunctionsEaseOutBack, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsSin", UtcDaliAlphaFunctionsSin, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsSin2x", UtcDaliAlphaFunctionsSin2x, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsSquare", UtcDaliAlphaFunctionsSquare, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsEaseInSine33", UtcDaliAlphaFunctionsEaseInSine33, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsEaseOutSine33", UtcDaliAlphaFunctionsEaseOutSine33, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsEaseInOutSineXX", UtcDaliAlphaFunctionsEaseInOutSineXX, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsDoubleEaseInOutSine60", UtcDaliAlphaFunctionsDoubleEaseInOutSine60, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsEaseOutQuint50", UtcDaliAlphaFunctionsEaseOutQuint50, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsEaseOutQuint80", UtcDaliAlphaFunctionsEaseOutQuint80, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsEaseInBack", UtcDaliAlphaFunctionsEaseInBack, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAlphaFunctionsEaseInOutBack", UtcDaliAlphaFunctionsEaseInOutBack, utc_dali_alpha_functions_startup, utc_dali_alpha_functions_cleanup},
+ {"UtcDaliAngleAxisNew01", UtcDaliAngleAxisNew01, utc_dali_angle_axis_startup, utc_dali_angle_axis_cleanup},
+ {"UtcDaliAngleAxisNew02", UtcDaliAngleAxisNew02, utc_dali_angle_axis_startup, utc_dali_angle_axis_cleanup},
+ {"UtcDaliAngleAxisNew03", UtcDaliAngleAxisNew03, utc_dali_angle_axis_startup, utc_dali_angle_axis_cleanup},
+ {"UtcDaliAngleAxisAssign", UtcDaliAngleAxisAssign, utc_dali_angle_axis_startup, utc_dali_angle_axis_cleanup},
+ {"UtcDaliAngleAxisCopy", UtcDaliAngleAxisCopy, utc_dali_angle_axis_startup, utc_dali_angle_axis_cleanup},
+ {"UtcDaliAnimatableMeshConstructor01", UtcDaliAnimatableMeshConstructor01, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshConstructor02", UtcDaliAnimatableMeshConstructor02, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshConstructor03", UtcDaliAnimatableMeshConstructor03, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshNew01", UtcDaliAnimatableMeshNew01, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshNew02", UtcDaliAnimatableMeshNew02, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshNew03", UtcDaliAnimatableMeshNew03, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshNew04", UtcDaliAnimatableMeshNew04, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshNew05", UtcDaliAnimatableMeshNew05, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshNew06", UtcDaliAnimatableMeshNew06, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshDownCast01", UtcDaliAnimatableMeshDownCast01, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshGetPropertyIndex01", UtcDaliAnimatableMeshGetPropertyIndex01, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshGetPropertyIndex02", UtcDaliAnimatableMeshGetPropertyIndex02, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshGetPropertyIndex03", UtcDaliAnimatableMeshGetPropertyIndex03, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshGetPropertyIndex04", UtcDaliAnimatableMeshGetPropertyIndex04, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshOperatorArray01", UtcDaliAnimatableMeshOperatorArray01, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshOperatorArray02", UtcDaliAnimatableMeshOperatorArray02, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshAnimateVertex01", UtcDaliAnimatableMeshAnimateVertex01, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableVertexSettersAndGetters", UtcDaliAnimatableVertexSettersAndGetters, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshProperties", UtcDaliAnimatableMeshProperties, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimatableMeshExceedVertices", UtcDaliAnimatableMeshExceedVertices, utc_dali_animatable_mesh_startup, utc_dali_animatable_mesh_cleanup},
+ {"UtcDaliAnimationNew01", UtcDaliAnimationNew01, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationNew02", UtcDaliAnimationNew02, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationDownCast", UtcDaliAnimationDownCast, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationSetDuration", UtcDaliAnimationSetDuration, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationGetDuration", UtcDaliAnimationGetDuration, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationSetLooping", UtcDaliAnimationSetLooping, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationIsLooping", UtcDaliAnimationIsLooping, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationSetEndAction", UtcDaliAnimationSetEndAction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationGetEndAction", UtcDaliAnimationGetEndAction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationGetDestroyAction", UtcDaliAnimationGetDestroyAction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationSetDefaultAlphaFunction", UtcDaliAnimationSetDefaultAlphaFunction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationGetDefaultAlphaFunction", UtcDaliAnimationGetDefaultAlphaFunction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationPlay", UtcDaliAnimationPlay, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationPlayOffStage", UtcDaliAnimationPlayOffStage, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationPlayDiscardHandle", UtcDaliAnimationPlayDiscardHandle, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationPlayStopDiscardHandle", UtcDaliAnimationPlayStopDiscardHandle, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationPause", UtcDaliAnimationPause, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationStop", UtcDaliAnimationStop, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationStopSetPosition", UtcDaliAnimationStopSetPosition, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationClear", UtcDaliAnimationClear, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationSignalFinish", UtcDaliAnimationSignalFinish, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByBoolean", UtcDaliAnimationAnimateByBoolean, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByBooleanAlphaFunction", UtcDaliAnimationAnimateByBooleanAlphaFunction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByBooleanTimePeriod", UtcDaliAnimationAnimateByBooleanTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByBooleanAlphaFunctionTimePeriod", UtcDaliAnimationAnimateByBooleanAlphaFunctionTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByFloat", UtcDaliAnimationAnimateByFloat, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByFloatAlphaFunction", UtcDaliAnimationAnimateByFloatAlphaFunction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByFloatTimePeriod", UtcDaliAnimationAnimateByFloatTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByFloatAlphaFunctionTimePeriod", UtcDaliAnimationAnimateByFloatAlphaFunctionTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByVector2", UtcDaliAnimationAnimateByVector2, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByVector2AlphaFunction", UtcDaliAnimationAnimateByVector2AlphaFunction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByVector2TimePeriod", UtcDaliAnimationAnimateByVector2TimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByVector2AlphaFunctionTimePeriod", UtcDaliAnimationAnimateByVector2AlphaFunctionTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByVector3", UtcDaliAnimationAnimateByVector3, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByVector3AlphaFunction", UtcDaliAnimationAnimateByVector3AlphaFunction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByVector3TimePeriod", UtcDaliAnimationAnimateByVector3TimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByVector3AlphaFunctionTimePeriod", UtcDaliAnimationAnimateByVector3AlphaFunctionTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByVector4", UtcDaliAnimationAnimateByVector4, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByVector4AlphaFunction", UtcDaliAnimationAnimateByVector4AlphaFunction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByVector4TimePeriod", UtcDaliAnimationAnimateByVector4TimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByVector4AlphaFunctionTimePeriod", UtcDaliAnimationAnimateByVector4AlphaFunctionTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByActorPosition", UtcDaliAnimationAnimateByActorPosition, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByActorPositionAlphaFunction", UtcDaliAnimationAnimateByActorPositionAlphaFunction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByActorPositionTimePeriod", UtcDaliAnimationAnimateByActorPositionTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateByActorPositionAlphaFunctionTimePeriod", UtcDaliAnimationAnimateByActorPositionAlphaFunctionTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToBoolean", UtcDaliAnimationAnimateToBoolean, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToBooleanAlphaFunction", UtcDaliAnimationAnimateToBooleanAlphaFunction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToBooleanTimePeriod", UtcDaliAnimationAnimateToBooleanTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToBooleanAlphaFunctionTimePeriod", UtcDaliAnimationAnimateToBooleanAlphaFunctionTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToFloat", UtcDaliAnimationAnimateToFloat, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToFloatAlphaFunction", UtcDaliAnimationAnimateToFloatAlphaFunction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToFloatTimePeriod", UtcDaliAnimationAnimateToFloatTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToFloatAlphaFunctionTimePeriod", UtcDaliAnimationAnimateToFloatAlphaFunctionTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToVector2", UtcDaliAnimationAnimateToVector2, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToVector2AlphaFunction", UtcDaliAnimationAnimateToVector2AlphaFunction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToVector2TimePeriod", UtcDaliAnimationAnimateToVector2TimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToVector2AlphaFunctionTimePeriod", UtcDaliAnimationAnimateToVector2AlphaFunctionTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToVector3", UtcDaliAnimationAnimateToVector3, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToVector3AlphaFunction", UtcDaliAnimationAnimateToVector3AlphaFunction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToVector3TimePeriod", UtcDaliAnimationAnimateToVector3TimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToVector3AlphaFunctionTimePeriod", UtcDaliAnimationAnimateToVector3AlphaFunctionTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToVector3Component", UtcDaliAnimationAnimateToVector3Component, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToVector4", UtcDaliAnimationAnimateToVector4, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToVector4AlphaFunction", UtcDaliAnimationAnimateToVector4AlphaFunction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToVector4TimePeriod", UtcDaliAnimationAnimateToVector4TimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToVector4AlphaFunctionTimePeriod", UtcDaliAnimationAnimateToVector4AlphaFunctionTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorParentOrigin", UtcDaliAnimationAnimateToActorParentOrigin, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorParentOriginX", UtcDaliAnimationAnimateToActorParentOriginX, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorParentOriginY", UtcDaliAnimationAnimateToActorParentOriginY, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorParentOriginZ", UtcDaliAnimationAnimateToActorParentOriginZ, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorAnchorPoint", UtcDaliAnimationAnimateToActorAnchorPoint, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorAnchorPointX", UtcDaliAnimationAnimateToActorAnchorPointX, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorAnchorPointY", UtcDaliAnimationAnimateToActorAnchorPointY, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorAnchorPointZ", UtcDaliAnimationAnimateToActorAnchorPointZ, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorSize", UtcDaliAnimationAnimateToActorSize, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorSizeWidth", UtcDaliAnimationAnimateToActorSizeWidth, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorSizeHeight", UtcDaliAnimationAnimateToActorSizeHeight, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorSizeDepth", UtcDaliAnimationAnimateToActorSizeDepth, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorPosition", UtcDaliAnimationAnimateToActorPosition, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorPositionX", UtcDaliAnimationAnimateToActorPositionX, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorPositionY", UtcDaliAnimationAnimateToActorPositionY, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorPositionZ", UtcDaliAnimationAnimateToActorPositionZ, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorPositionAlphaFunction", UtcDaliAnimationAnimateToActorPositionAlphaFunction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorPositionTimePeriod", UtcDaliAnimationAnimateToActorPositionTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorPositionAlphaFunctionTimePeriod", UtcDaliAnimationAnimateToActorPositionAlphaFunctionTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorRotationAngleAxis", UtcDaliAnimationAnimateToActorRotationAngleAxis, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorRotationQuaternion", UtcDaliAnimationAnimateToActorRotationQuaternion, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorRotationAlphaFunction", UtcDaliAnimationAnimateToActorRotationAlphaFunction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorRotationTimePeriod", UtcDaliAnimationAnimateToActorRotationTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorRotationAlphaFunctionTimePeriod", UtcDaliAnimationAnimateToActorRotationAlphaFunctionTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorScale", UtcDaliAnimationAnimateToActorScale, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorScaleX", UtcDaliAnimationAnimateToActorScaleX, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorScaleY", UtcDaliAnimationAnimateToActorScaleY, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorScaleZ", UtcDaliAnimationAnimateToActorScaleZ, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorColor", UtcDaliAnimationAnimateToActorColor, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorColorRed", UtcDaliAnimationAnimateToActorColorRed, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorColorGreen", UtcDaliAnimationAnimateToActorColorGreen, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorColorBlue", UtcDaliAnimationAnimateToActorColorBlue, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateToActorColorAlpha", UtcDaliAnimationAnimateToActorColorAlpha, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationKeyFrames01", UtcDaliAnimationKeyFrames01, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationKeyFrames02", UtcDaliAnimationKeyFrames02, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationKeyFrames03", UtcDaliAnimationKeyFrames03, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationKeyFrames04", UtcDaliAnimationKeyFrames04, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationKeyFrames05", UtcDaliAnimationKeyFrames05, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationKeyFrames06", UtcDaliAnimationKeyFrames06, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateBetweenActorColorAlpha", UtcDaliAnimationAnimateBetweenActorColorAlpha, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateBetweenActorColor", UtcDaliAnimationAnimateBetweenActorColor, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateBetweenActorVisible01", UtcDaliAnimationAnimateBetweenActorVisible01, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateBetweenActorRotation02", UtcDaliAnimationAnimateBetweenActorRotation02, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationMoveByFloat3", UtcDaliAnimationMoveByFloat3, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationMoveByVector3Alpha", UtcDaliAnimationMoveByVector3Alpha, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationMoveByVector3AlphaFloat2", UtcDaliAnimationMoveByVector3AlphaFloat2, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationMoveToFloat3", UtcDaliAnimationMoveToFloat3, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationMoveToVector3Alpha", UtcDaliAnimationMoveToVector3Alpha, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationMoveToVector3AlphaFloat2", UtcDaliAnimationMoveToVector3AlphaFloat2, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationMove", UtcDaliAnimationMove, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationRotateByDegreeVector3", UtcDaliAnimationRotateByDegreeVector3, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationRotateByRadianVector3", UtcDaliAnimationRotateByRadianVector3, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationRotateByDegreeVector3Alpha", UtcDaliAnimationRotateByDegreeVector3Alpha, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationRotateByRadianVector3Alpha", UtcDaliAnimationRotateByRadianVector3Alpha, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationRotateByDegreeVector3AlphaFloat2", UtcDaliAnimationRotateByDegreeVector3AlphaFloat2, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationRotateByRadianVector3AlphaFloat2", UtcDaliAnimationRotateByRadianVector3AlphaFloat2, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationRotateToDegreeVector3", UtcDaliAnimationRotateToDegreeVector3, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationRotateToRadianVector3", UtcDaliAnimationRotateToRadianVector3, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationRotateToQuaternion", UtcDaliAnimationRotateToQuaternion, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationRotateToDegreeVector3Alpha", UtcDaliAnimationRotateToDegreeVector3Alpha, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationRotateToRadianVector3Alpha", UtcDaliAnimationRotateToRadianVector3Alpha, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationRotateToQuaternionAlpha", UtcDaliAnimationRotateToQuaternionAlpha, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationRotateToDegreeVector3AlphaFloat2", UtcDaliAnimationRotateToDegreeVector3AlphaFloat2, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationRotateToRadianVector3AlphaFloat2", UtcDaliAnimationRotateToRadianVector3AlphaFloat2, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationRotateToQuaternionAlphaFloat2", UtcDaliAnimationRotateToQuaternionAlphaFloat2, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationRotate", UtcDaliAnimationRotate, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationScaleBy", UtcDaliAnimationScaleBy, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationScaleTo", UtcDaliAnimationScaleTo, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationShow", UtcDaliAnimationShow, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationHide", UtcDaliAnimationHide, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationShowHideAtEnd", UtcDaliAnimationShowHideAtEnd, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationOpacityBy", UtcDaliAnimationOpacityBy, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationOpacityTo", UtcDaliAnimationOpacityTo, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationColorBy", UtcDaliAnimationColorBy, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationColorTo", UtcDaliAnimationColorTo, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationResize", UtcDaliAnimationResize, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateBool", UtcDaliAnimationAnimateBool, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateFloat", UtcDaliAnimationAnimateFloat, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateVector2", UtcDaliAnimationAnimateVector2, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateVector3", UtcDaliAnimationAnimateVector3, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateVector4", UtcDaliAnimationAnimateVector4, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateQuaternion", UtcDaliAnimationAnimateQuaternion, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliKeyFramesCreateDestroy", UtcDaliKeyFramesCreateDestroy, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliKeyFramesDownCast", UtcDaliKeyFramesDownCast, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationResizeByXY", UtcDaliAnimationResizeByXY, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateBetweenActorColorTimePeriod", UtcDaliAnimationAnimateBetweenActorColorTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateBetweenActorColorFunction", UtcDaliAnimationAnimateBetweenActorColorFunction, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateBetweenActorColorFunctionTimePeriod", UtcDaliAnimationAnimateBetweenActorColorFunctionTimePeriod, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationAnimateVector3Func", UtcDaliAnimationAnimateVector3Func, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnimationCreateDestroy", UtcDaliAnimationCreateDestroy, utc_dali_animation_startup, utc_dali_animation_cleanup},
+ {"UtcDaliAnyConstructors", UtcDaliAnyConstructors, utc_dali_any_startup, utc_dali_any_cleanup},
+ {"UtcDaliAnyAssignmentOperators", UtcDaliAnyAssignmentOperators, utc_dali_any_startup, utc_dali_any_cleanup},
+ {"UtcDaliAnyNegativeAssignmentOperators", UtcDaliAnyNegativeAssignmentOperators, utc_dali_any_startup, utc_dali_any_cleanup},
+ {"UtcDaliAnyGetType", UtcDaliAnyGetType, utc_dali_any_startup, utc_dali_any_cleanup},
+ {"UtcDaliAnyGet", UtcDaliAnyGet, utc_dali_any_startup, utc_dali_any_cleanup},
+ {"UtcDaliAnyNegativeGet", UtcDaliAnyNegativeGet, utc_dali_any_startup, utc_dali_any_cleanup},
+ {"UtcDaliBaseHandleConstructorVoid", UtcDaliBaseHandleConstructorVoid, utc_base_handle_startup, utc_base_handle_cleanup},
+ {"UtcDaliBaseHandleCopyConstructor", UtcDaliBaseHandleCopyConstructor, utc_base_handle_startup, utc_base_handle_cleanup},
+ {"UtcDaliBaseHandleAssignmentOperator", UtcDaliBaseHandleAssignmentOperator, utc_base_handle_startup, utc_base_handle_cleanup},
+ {"UtcDaliBaseHandleGetBaseObject", UtcDaliBaseHandleGetBaseObject, utc_base_handle_startup, utc_base_handle_cleanup},
+ {"UtcDaliBaseHandleReset", UtcDaliBaseHandleReset, utc_base_handle_startup, utc_base_handle_cleanup},
+ {"UtcDaliBaseHandleEqualityOperator01", UtcDaliBaseHandleEqualityOperator01, utc_base_handle_startup, utc_base_handle_cleanup},
+ {"UtcDaliBaseHandleEqualityOperator02", UtcDaliBaseHandleEqualityOperator02, utc_base_handle_startup, utc_base_handle_cleanup},
+ {"UtcDaliBaseHandleInequalityOperator01", UtcDaliBaseHandleInequalityOperator01, utc_base_handle_startup, utc_base_handle_cleanup},
+ {"UtcDaliBaseHandleInequalityOperator02", UtcDaliBaseHandleInequalityOperator02, utc_base_handle_startup, utc_base_handle_cleanup},
+ {"UtcDaliBaseHandleStlVector", UtcDaliBaseHandleStlVector, utc_base_handle_startup, utc_base_handle_cleanup},
+ {"UtcDaliBaseHandleDoAction", UtcDaliBaseHandleDoAction, utc_base_handle_startup, utc_base_handle_cleanup},
+ {"UtcDaliBaseHandleConnectSignal", UtcDaliBaseHandleConnectSignal, utc_base_handle_startup, utc_base_handle_cleanup},
+ {"UtcDaliBaseHandleGetTypeName", UtcDaliBaseHandleGetTypeName, utc_base_handle_startup, utc_base_handle_cleanup},
+ {"UtcDaliBaseHandleGetObjectPtr", UtcDaliBaseHandleGetObjectPtr, utc_base_handle_startup, utc_base_handle_cleanup},
+ {"UtcDaliBaseHandleBooleanCast", UtcDaliBaseHandleBooleanCast, utc_base_handle_startup, utc_base_handle_cleanup},
+ {"UtcDaliBitmapImageNew01", UtcDaliBitmapImageNew01, utc_dali_bitmap_image_startup, utc_dali_bitmap_image_cleanup},
+ {"UtcDaliBitmapImageNew02", UtcDaliBitmapImageNew02, utc_dali_bitmap_image_startup, utc_dali_bitmap_image_cleanup},
+ {"UtcDaliBitmapImageNewWithPolicy01", UtcDaliBitmapImageNewWithPolicy01, utc_dali_bitmap_image_startup, utc_dali_bitmap_image_cleanup},
+ {"UtcDaliBitmapImageNewWithPolicy02", UtcDaliBitmapImageNewWithPolicy02, utc_dali_bitmap_image_startup, utc_dali_bitmap_image_cleanup},
+ {"UtcDaliBitmapImageDownCast", UtcDaliBitmapImageDownCast, utc_dali_bitmap_image_startup, utc_dali_bitmap_image_cleanup},
+ {"UtcDaliBitmapImageDownCast2", UtcDaliBitmapImageDownCast2, utc_dali_bitmap_image_startup, utc_dali_bitmap_image_cleanup},
+ {"UtcDaliBitmapImageWHITE", UtcDaliBitmapImageWHITE, utc_dali_bitmap_image_startup, utc_dali_bitmap_image_cleanup},
+ {"UtcDaliBitmapImageGetBuffer", UtcDaliBitmapImageGetBuffer, utc_dali_bitmap_image_startup, utc_dali_bitmap_image_cleanup},
+ {"UtcDaliBitmapImageGetBufferSize", UtcDaliBitmapImageGetBufferSize, utc_dali_bitmap_image_startup, utc_dali_bitmap_image_cleanup},
+ {"UtcDaliBitmapImageGetBufferStride", UtcDaliBitmapImageGetBufferStride, utc_dali_bitmap_image_startup, utc_dali_bitmap_image_cleanup},
+ {"UtcDaliBitmapImageIsDataExternal", UtcDaliBitmapImageIsDataExternal, utc_dali_bitmap_image_startup, utc_dali_bitmap_image_cleanup},
+ {"UtcDaliBitmapImageUpdate01", UtcDaliBitmapImageUpdate01, utc_dali_bitmap_image_startup, utc_dali_bitmap_image_cleanup},
+ {"UtcDaliBitmapImageUpdate02", UtcDaliBitmapImageUpdate02, utc_dali_bitmap_image_startup, utc_dali_bitmap_image_cleanup},
+ {"UtcDaliBitmapImageUploadedSignal01", UtcDaliBitmapImageUploadedSignal01, utc_dali_bitmap_image_startup, utc_dali_bitmap_image_cleanup},
+ {"UtcDaliBitmapImageUploadedSignal02", UtcDaliBitmapImageUploadedSignal02, utc_dali_bitmap_image_startup, utc_dali_bitmap_image_cleanup},
+ {"UtcDaliCameraActorConstructorVoid", UtcDaliCameraActorConstructorVoid, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorNew", UtcDaliCameraActorNew, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorDownCast", UtcDaliCameraActorDownCast, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorDownCast2", UtcDaliCameraActorDownCast2, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorSetCameraOffStage", UtcDaliCameraActorSetCameraOffStage, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorSetCameraOnStage", UtcDaliCameraActorSetCameraOnStage, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorGetCamera", UtcDaliCameraActorGetCamera, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorDefaultProperties", UtcDaliCameraActorDefaultProperties, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorSetTarget", UtcDaliCameraActorSetTarget, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorSetType01", UtcDaliCameraActorSetType01, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorSetType02", UtcDaliCameraActorSetType02, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorSetFieldOfView", UtcDaliCameraActorSetFieldOfView, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorSetAspectRatio", UtcDaliCameraActorSetAspectRatio, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorSetNearClippingPlane", UtcDaliCameraActorSetNearClippingPlane, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorSetFarClippingPlane", UtcDaliCameraActorSetFarClippingPlane, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorSetTargetPosition", UtcDaliCameraActorSetTargetPosition, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorSetInvertYAxis", UtcDaliCameraActorSetInvertYAxis, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorModelView", UtcDaliCameraActorModelView, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorSetPerspectiveProjection", UtcDaliCameraActorSetPerspectiveProjection, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorSetOrthographicProjection01", UtcDaliCameraActorSetOrthographicProjection01, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorSetOrthographicProjection02", UtcDaliCameraActorSetOrthographicProjection02, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorSetOrthographicProjection03", UtcDaliCameraActorSetOrthographicProjection03, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorReadProjectionMatrix", UtcDaliCameraActorReadProjectionMatrix, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorAnimatedProperties", UtcDaliCameraActorAnimatedProperties, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorPropertyIndices", UtcDaliCameraActorPropertyIndices, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorCheckLookAtAndFreeLookViews01", UtcDaliCameraActorCheckLookAtAndFreeLookViews01, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorCheckLookAtAndFreeLookViews02", UtcDaliCameraActorCheckLookAtAndFreeLookViews02, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCameraActorCheckLookAtAndFreeLookViews03", UtcDaliCameraActorCheckLookAtAndFreeLookViews03, camera_actor_test_startup, camera_actor_test_cleanup},
+ {"UtcDaliCharacterCopyConstructor", UtcDaliCharacterCopyConstructor, utc_dali_character_startup, utc_dali_character_cleanup},
+ {"UtcDaliCharacterComparissonOperators", UtcDaliCharacterComparissonOperators, utc_dali_character_startup, utc_dali_character_cleanup},
+ {"UtcDaliCharacterAssignmentOperator", UtcDaliCharacterAssignmentOperator, utc_dali_character_startup, utc_dali_character_cleanup},
+ {"UtcDaliCharacterIsLeftToRight", UtcDaliCharacterIsLeftToRight, utc_dali_character_startup, utc_dali_character_cleanup},
+ {"UtcDaliGetCharacterDirection", UtcDaliGetCharacterDirection, utc_dali_character_startup, utc_dali_character_cleanup},
+ {"UtcDaliCharacterIsWhiteSpace", UtcDaliCharacterIsWhiteSpace, utc_dali_character_startup, utc_dali_character_cleanup},
+ {"UtcDaliCharacterIsNewLine", UtcDaliCharacterIsNewLine, utc_dali_character_startup, utc_dali_character_cleanup},
+ {"UtcDaliConstraintNewBoolean", UtcDaliConstraintNewBoolean, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewFloat", UtcDaliConstraintNewFloat, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewVector2", UtcDaliConstraintNewVector2, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewVector3", UtcDaliConstraintNewVector3, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewVector4", UtcDaliConstraintNewVector4, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewMatrix", UtcDaliConstraintNewMatrix, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewMatrix3", UtcDaliConstraintNewMatrix3, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewQuaternion", UtcDaliConstraintNewQuaternion, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewOffStageBoolean", UtcDaliConstraintNewOffStageBoolean, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewOffStageFloat", UtcDaliConstraintNewOffStageFloat, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewOffStageVector2", UtcDaliConstraintNewOffStageVector2, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewOffStageVector3", UtcDaliConstraintNewOffStageVector3, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewOffStageVector4", UtcDaliConstraintNewOffStageVector4, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewOffStageQuaternion", UtcDaliConstraintNewOffStageQuaternion, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewLocalInput", UtcDaliConstraintNewLocalInput, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewParentInput", UtcDaliConstraintNewParentInput, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewInput1", UtcDaliConstraintNewInput1, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewInput2", UtcDaliConstraintNewInput2, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewInput3", UtcDaliConstraintNewInput3, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewInput4", UtcDaliConstraintNewInput4, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewInput5", UtcDaliConstraintNewInput5, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintNewInput6", UtcDaliConstraintNewInput6, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintDownCast", UtcDaliConstraintDownCast, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintSetApplyTime", UtcDaliConstraintSetApplyTime, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintGetApplyTime", UtcDaliConstraintGetApplyTime, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintSetRemoveTime", UtcDaliConstraintSetRemoveTime, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintGetRemoveTime", UtcDaliConstraintGetRemoveTime, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintSetAlphaFunction", UtcDaliConstraintSetAlphaFunction, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintGetAlphaFunction", UtcDaliConstraintGetAlphaFunction, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintSetRemoveAction", UtcDaliConstraintSetRemoveAction, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintGetRemoveAction", UtcDaliConstraintGetRemoveAction, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintRemoveDuringApply", UtcDaliConstraintRemoveDuringApply, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintImmediateRemoveDuringApply", UtcDaliConstraintImmediateRemoveDuringApply, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintActorSize", UtcDaliConstraintActorSize, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintActorSizeWidth", UtcDaliConstraintActorSizeWidth, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintActorSizeHeight", UtcDaliConstraintActorSizeHeight, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintActorSizeDepth", UtcDaliConstraintActorSizeDepth, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintInputWorldPosition", UtcDaliConstraintInputWorldPosition, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintInputWorldRotation", UtcDaliConstraintInputWorldRotation, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintInputWorldScale", UtcDaliConstraintInputWorldScale, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintInputWorldColor", UtcDaliConstraintInputWorldColor, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliConstraintInvalidInputProperty", UtcDaliConstraintInvalidInputProperty, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliBuiltinConstraintParentSize", UtcDaliBuiltinConstraintParentSize, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliBuiltinConstraintParentSizeRelative", UtcDaliBuiltinConstraintParentSizeRelative, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliBuiltinConstraintScaleToFitConstraint", UtcDaliBuiltinConstraintScaleToFitConstraint, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliBuiltinConstraintScaleToFitKeepAspectRatio", UtcDaliBuiltinConstraintScaleToFitKeepAspectRatio, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliBuiltinConstraintScaleToFillKeepAspectRatio", UtcDaliBuiltinConstraintScaleToFillKeepAspectRatio, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliBuiltinConstraintScaleToFillXYKeepAspectRatio", UtcDaliBuiltinConstraintScaleToFillXYKeepAspectRatio, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliBuiltinConstraintShrinkInsideKeepAspectRatioConstraint", UtcDaliBuiltinConstraintShrinkInsideKeepAspectRatioConstraint, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliBuiltinConstraintMultiplyConstraint", UtcDaliBuiltinConstraintMultiplyConstraint, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliBuiltinConstraintDivideConstraint", UtcDaliBuiltinConstraintDivideConstraint, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliBuiltinConstraintEqualToConstraint", UtcDaliBuiltinConstraintEqualToConstraint, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliBuiltinConstraintRelativeToConstraint", UtcDaliBuiltinConstraintRelativeToConstraint, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliBuiltinConstraintInverseOfConstraint", UtcDaliBuiltinConstraintInverseOfConstraint, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliBuiltinConstraintFunctions", UtcDaliBuiltinConstraintFunctions, utc_dali_constraint_startup, utc_dali_constraint_cleanup},
+ {"UtcDaliCustomActorDestructor", UtcDaliCustomActorDestructor, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorImplDestructor", UtcDaliCustomActorImplDestructor, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorDownCast", UtcDaliCustomActorDownCast, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorDownCastNegative", UtcDaliCustomActorDownCastNegative, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorOnStageConnectionDisconnection", UtcDaliCustomActorOnStageConnectionDisconnection, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorOnStageConnectionOrder", UtcDaliCustomActorOnStageConnectionOrder, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorOnStageDisconnectionOrder", UtcDaliCustomActorOnStageDisconnectionOrder, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorAddDuringOnStageConnection", UtcDaliCustomActorAddDuringOnStageConnection, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorRemoveDuringOnStageConnection", UtcDaliCustomActorRemoveDuringOnStageConnection, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorAddDuringOnStageDisconnection", UtcDaliCustomActorAddDuringOnStageDisconnection, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorRemoveDuringOnStageDisconnection", UtcDaliCustomActorRemoveDuringOnStageDisconnection, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorRemoveParentDuringOnStageConnection", UtcDaliCustomActorRemoveParentDuringOnStageConnection, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorAddParentDuringOnStageDisconnection", UtcDaliCustomActorAddParentDuringOnStageDisconnection, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorOnChildAddRemove", UtcDaliCustomActorOnChildAddRemove, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorReparentDuringOnChildAdd", UtcDaliCustomActorReparentDuringOnChildAdd, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorRemoveDuringOnChildRemove", UtcDaliCustomActorRemoveDuringOnChildRemove, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorOnPropertySet", UtcDaliCustomActorOnPropertySet, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorOnSizeSet", UtcDaliCustomActorOnSizeSet, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorOnSizeAnimation", UtcDaliCustomActorOnSizeAnimation, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorOnTouchEvent", UtcDaliCustomActorOnTouchEvent, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorOnMouseWheelEvent", UtcDaliCustomActorOnMouseWheelEvent, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorFindChildByAlias", UtcDaliCustomActorFindChildByAlias, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorImplOnPropertySet", UtcDaliCustomActorImplOnPropertySet, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliCustomActorGetImplementation", UtcDaliCustomActorGetImplementation, custom_actor_test_startup, custom_actor_test_cleanup},
+ {"UtcDaliDegreeConstructors01", UtcDaliDegreeConstructors01, utc_dali_degree_startup, utc_dali_degree_cleanup},
+ {"UtcDaliDegreeComparison01", UtcDaliDegreeComparison01, utc_dali_degree_startup, utc_dali_degree_cleanup},
+ {"UtcDaliDegreeCastOperators01", UtcDaliDegreeCastOperators01, utc_dali_degree_startup, utc_dali_degree_cleanup},
+ {"UtcDaliDegreeCastOperatorEquals", UtcDaliDegreeCastOperatorEquals, utc_dali_degree_startup, utc_dali_degree_cleanup},
+ {"UtcDaliDegreeCastOperatorNotEquals", UtcDaliDegreeCastOperatorNotEquals, utc_dali_degree_startup, utc_dali_degree_cleanup},
+ {"UtcDaliDegreeCastOperatorLessThan", UtcDaliDegreeCastOperatorLessThan, utc_dali_degree_startup, utc_dali_degree_cleanup},
+ {"UtcDaliInvalidEvent", UtcDaliInvalidEvent, utc_dali_event_processing_startup, utc_dali_event_processing_cleanup},
+ {"UtcDaliInvalidGesture", UtcDaliInvalidGesture, utc_dali_event_processing_startup, utc_dali_event_processing_cleanup},
+ {"UtcDaliFontNew01", UtcDaliFontNew01, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcDaliFontNew02", UtcDaliFontNew02, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcDaliFontNew03", UtcDaliFontNew03, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcDaliFontNew04", UtcDaliFontNew04, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcDaliFontNew05", UtcDaliFontNew05, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcDaliFontNew06", UtcDaliFontNew06, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcDaliFontDownCast", UtcDaliFontDownCast, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcDaliFontGetPixelSize", UtcDaliFontGetPixelSize, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcDaliFontGetPointSize", UtcDaliFontGetPointSize, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcDaliFontPointsToPixels", UtcDaliFontPointsToPixels, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcFontMeasureTextWidth", UtcFontMeasureTextWidth, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcFontMeasureTextHeight", UtcFontMeasureTextHeight, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcFontMeasureText", UtcFontMeasureText, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcFontGetFamilyForText", UtcFontGetFamilyForText, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcFontGetFontLineHeightFromCapsHeight", UtcFontGetFontLineHeightFromCapsHeight, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcFontAllGlyphsSupported", UtcFontAllGlyphsSupported, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcFontGetMetrics", UtcFontGetMetrics, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcFontIsDefault", UtcFontIsDefault, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcFontGetInstalledFonts", UtcFontGetInstalledFonts, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcFontMetricsDefaultConstructor", UtcFontMetricsDefaultConstructor, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcFontMetricsCopyConstructor", UtcFontMetricsCopyConstructor, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcFontMetricsAssignmentOperator", UtcFontMetricsAssignmentOperator, utc_dali_font_startup, utc_dali_font_cleanup},
+ {"UtcDaliFontParamsDefaultConstructor", UtcDaliFontParamsDefaultConstructor, utc_dali_font_parameters_startup, utc_dali_font_parameters_cleanup},
+ {"UtcDaliFontParamsPointSizeConstructor", UtcDaliFontParamsPointSizeConstructor, utc_dali_font_parameters_startup, utc_dali_font_parameters_cleanup},
+ {"UtcDaliFontParamsPixelSizeConstructor", UtcDaliFontParamsPixelSizeConstructor, utc_dali_font_parameters_startup, utc_dali_font_parameters_cleanup},
+ {"UtcDaliFontParamsCopyConstructor", UtcDaliFontParamsCopyConstructor, utc_dali_font_parameters_startup, utc_dali_font_parameters_cleanup},
+ {"UtcDaliFontParamsAssignmentOperator", UtcDaliFontParamsAssignmentOperator, utc_dali_font_parameters_startup, utc_dali_font_parameters_cleanup},
+ {"UtcDaliFontParamsPointSizeEqualityOperator", UtcDaliFontParamsPointSizeEqualityOperator, utc_dali_font_parameters_startup, utc_dali_font_parameters_cleanup},
+ {"UtcDaliFrameBufferImageNew01", UtcDaliFrameBufferImageNew01, utc_dali_framebuffer_startup, utc_dali_framebuffer_cleanup},
+ {"UtcDaliFrameBufferImageDownCast", UtcDaliFrameBufferImageDownCast, utc_dali_framebuffer_startup, utc_dali_framebuffer_cleanup},
+ {"UtcDaliGestureConstructor", UtcDaliGestureConstructor, utc_dali_gesture_startup, utc_dali_gesture_cleanup},
+ {"UtcDaliGestureAssignment", UtcDaliGestureAssignment, utc_dali_gesture_startup, utc_dali_gesture_cleanup},
+ {"UtcDaliGestureDetectorConstructorNegative", UtcDaliGestureDetectorConstructorNegative, utc_dali_gesture_detector_startup, utc_dali_gesture_detector_cleanup},
+ {"UtcDaliGestureDetectorConstructorPositive", UtcDaliGestureDetectorConstructorPositive, utc_dali_gesture_detector_startup, utc_dali_gesture_detector_cleanup},
+ {"UtcDaliGestureDetectorDownCast", UtcDaliGestureDetectorDownCast, utc_dali_gesture_detector_startup, utc_dali_gesture_detector_cleanup},
+ {"UtcDaliGestureDetectorAttachPositive", UtcDaliGestureDetectorAttachPositive, utc_dali_gesture_detector_startup, utc_dali_gesture_detector_cleanup},
+ {"UtcDaliGestureDetectorAttachNegative", UtcDaliGestureDetectorAttachNegative, utc_dali_gesture_detector_startup, utc_dali_gesture_detector_cleanup},
+ {"UtcDaliGestureDetectorDetachPositive", UtcDaliGestureDetectorDetachPositive, utc_dali_gesture_detector_startup, utc_dali_gesture_detector_cleanup},
+ {"UtcDaliGestureDetectorDetachNegative01", UtcDaliGestureDetectorDetachNegative01, utc_dali_gesture_detector_startup, utc_dali_gesture_detector_cleanup},
+ {"UtcDaliGestureDetectorDetachNegative02", UtcDaliGestureDetectorDetachNegative02, utc_dali_gesture_detector_startup, utc_dali_gesture_detector_cleanup},
+ {"UtcDaliGestureDetectorDetachNegative03", UtcDaliGestureDetectorDetachNegative03, utc_dali_gesture_detector_startup, utc_dali_gesture_detector_cleanup},
+ {"UtcDaliGestureDetectorDetachAll", UtcDaliGestureDetectorDetachAll, utc_dali_gesture_detector_startup, utc_dali_gesture_detector_cleanup},
+ {"UtcDaliGestureDetectorDetachAllNegative", UtcDaliGestureDetectorDetachAllNegative, utc_dali_gesture_detector_startup, utc_dali_gesture_detector_cleanup},
+ {"UtcDaliGestureDetectorGetAttachedActors", UtcDaliGestureDetectorGetAttachedActors, utc_dali_gesture_detector_startup, utc_dali_gesture_detector_cleanup},
+ {"UtcDaliHandleConstructorVoid", UtcDaliHandleConstructorVoid, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleCopyConstructor", UtcDaliHandleCopyConstructor, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleAssignmentOperator", UtcDaliHandleAssignmentOperator, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleSupports", UtcDaliHandleSupports, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleGetPropertyCount", UtcDaliHandleGetPropertyCount, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleGetPropertyName", UtcDaliHandleGetPropertyName, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleGetPropertyIndex", UtcDaliHandleGetPropertyIndex, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleIsPropertyWritable", UtcDaliHandleIsPropertyWritable, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleIsPropertyAnimatable", UtcDaliHandleIsPropertyAnimatable, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleGetPropertyType", UtcDaliHandleGetPropertyType, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleNonAnimtableProperties", UtcDaliHandleNonAnimtableProperties, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleNonAnimtableCompositeProperties", UtcDaliHandleNonAnimtableCompositeProperties, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleSetProperty01", UtcDaliHandleSetProperty01, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleSetProperty02", UtcDaliHandleSetProperty02, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleRegisterProperty", UtcDaliHandleRegisterProperty, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleGetProperty", UtcDaliHandleGetProperty, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleDownCast", UtcDaliHandleDownCast, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleCreateProperty", UtcDaliHandleCreateProperty, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleGetPropertyGet", UtcDaliHandleGetPropertyGet, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliHandleGetPropertyIndices", UtcDaliHandleGetPropertyIndices, handle_test_startup, handle_test_cleanup},
+ {"UtcDaliImageNew01", UtcDaliImageNew01, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageNew02", UtcDaliImageNew02, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageNew03", UtcDaliImageNew03, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageNewWithPolicies01", UtcDaliImageNewWithPolicies01, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageNewWithPolicies02", UtcDaliImageNewWithPolicies02, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageNewWithPolicies03", UtcDaliImageNewWithPolicies03, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageNewWithPolicies04", UtcDaliImageNewWithPolicies04, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageNewDistanceField", UtcDaliImageNewDistanceField, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageNewDistanceFieldWithPolicies01", UtcDaliImageNewDistanceFieldWithPolicies01, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageNewDistanceFieldWithPolicies02", UtcDaliImageNewDistanceFieldWithPolicies02, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageNewDistanceFieldWithPolicies03", UtcDaliImageNewDistanceFieldWithPolicies03, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageNewDistanceFieldWithPolicies04", UtcDaliImageNewDistanceFieldWithPolicies04, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageNewDistanceFieldWithAttributes", UtcDaliImageNewDistanceFieldWithAttributes, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageNewDistanceFieldWithAttrandPol", UtcDaliImageNewDistanceFieldWithAttrandPol, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageDownCast", UtcDaliImageDownCast, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageGetImageSize", UtcDaliImageGetImageSize, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageGetFilename", UtcDaliImageGetFilename, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageGetLoadingState01", UtcDaliImageGetLoadingState01, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageGetLoadingState02", UtcDaliImageGetLoadingState02, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageGetReleasePolicy", UtcDaliImageGetReleasePolicy, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageGetLoadPolicy", UtcDaliImageGetLoadPolicy, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageSignalLoadingFinished", UtcDaliImageSignalLoadingFinished, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageSignalUploaded", UtcDaliImageSignalUploaded, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageDiscard01", UtcDaliImageDiscard01, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageDiscard02", UtcDaliImageDiscard02, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageDiscard03", UtcDaliImageDiscard03, utc_dali_image_startup, utc_dali_image_cleanup},
+ {"UtcDaliImageActorConstructorVoid", UtcDaliImageActorConstructorVoid, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorDestructor", UtcDaliImageActorDestructor, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorNew01", UtcDaliImageActorNew01, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorNew02", UtcDaliImageActorNew02, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorDownCast", UtcDaliImageActorDownCast, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorDownCast2", UtcDaliImageActorDownCast2, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActor9Patch", UtcDaliImageActor9Patch, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorPixelArea", UtcDaliImageActorPixelArea, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorGetCurrentImageSize01", UtcDaliImageActorGetCurrentImageSize01, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorGetCurrentImageSize02", UtcDaliImageActorGetCurrentImageSize02, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorGetCurrentImageSize03", UtcDaliImageActorGetCurrentImageSize03, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorGetCurrentImageSize04", UtcDaliImageActorGetCurrentImageSize04, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorGetCurrentImageSize05", UtcDaliImageActorGetCurrentImageSize05, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorNaturalPixelAreaSize01", UtcDaliImageActorNaturalPixelAreaSize01, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorNaturalPixelAreaSize02", UtcDaliImageActorNaturalPixelAreaSize02, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorDefaultProperties", UtcDaliImageActorDefaultProperties, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorUseImageAlpha01", UtcDaliImageActorUseImageAlpha01, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorUseImageAlpha02", UtcDaliImageActorUseImageAlpha02, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorUseImageAlpha03", UtcDaliImageActorUseImageAlpha03, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorUseImageAlpha04", UtcDaliImageActorUseImageAlpha04, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorUseImageAlpha05", UtcDaliImageActorUseImageAlpha05, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorClearPixelArea", UtcDaliImageActorClearPixelArea, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageGetStyle", UtcDaliImageGetStyle, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageSetNinePatchBorder", UtcDaliImageSetNinePatchBorder, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageSetFadeIn", UtcDaliImageSetFadeIn, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageSetFadeInDuration", UtcDaliImageSetFadeInDuration, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorNewNull", UtcDaliImageActorNewNull, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorNewNullWithArea", UtcDaliImageActorNewNullWithArea, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorSetImage", UtcDaliImageActorSetImage, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageActorPropertyIndices", UtcDaliImageActorPropertyIndices, image_actor_test_startup, image_actor_test_cleanup},
+ {"UtcDaliImageAttributesConstructor", UtcDaliImageAttributesConstructor, utc_dali_image_attributes_startup, utc_dali_image_attributes_cleanup},
+ {"UtcDaliImageAttributesLessThan", UtcDaliImageAttributesLessThan, utc_dali_image_attributes_startup, utc_dali_image_attributes_cleanup},
+ {"UtcDaliImageAttributesEquality", UtcDaliImageAttributesEquality, utc_dali_image_attributes_startup, utc_dali_image_attributes_cleanup},
+ {"UtcDaliImageAttributesInEquality", UtcDaliImageAttributesInEquality, utc_dali_image_attributes_startup, utc_dali_image_attributes_cleanup},
+ {"UtcDaliKeyEventConstructor", UtcDaliKeyEventConstructor, utc_dali_key_event_startup, utc_dali_key_event_cleanup},
+ {"UtcDaliKeyEventIsShiftModifier", UtcDaliKeyEventIsShiftModifier, utc_dali_key_event_startup, utc_dali_key_event_cleanup},
+ {"UtcDaliKeyEventIsCtrlModifier", UtcDaliKeyEventIsCtrlModifier, utc_dali_key_event_startup, utc_dali_key_event_cleanup},
+ {"UtcDaliKeyEventIsAltModifier", UtcDaliKeyEventIsAltModifier, utc_dali_key_event_startup, utc_dali_key_event_cleanup},
+ {"UtcDaliKeyEventIsNotShiftModifier", UtcDaliKeyEventIsNotShiftModifier, utc_dali_key_event_startup, utc_dali_key_event_cleanup},
+ {"UtcDaliKeyEventIsNotCtrlModifier", UtcDaliKeyEventIsNotCtrlModifier, utc_dali_key_event_startup, utc_dali_key_event_cleanup},
+ {"UtcDaliKeyEventIsNotAltModifier", UtcDaliKeyEventIsNotAltModifier, utc_dali_key_event_startup, utc_dali_key_event_cleanup},
+ {"UtcDaliKeyEventANDModifer", UtcDaliKeyEventANDModifer, utc_dali_key_event_startup, utc_dali_key_event_cleanup},
+ {"UtcDaliKeyEventORModifer", UtcDaliKeyEventORModifer, utc_dali_key_event_startup, utc_dali_key_event_cleanup},
+ {"UtcDaliKeyEventState", UtcDaliKeyEventState, utc_dali_key_event_startup, utc_dali_key_event_cleanup},
+ {"UtcDaliIntegrationKeyEvent", UtcDaliIntegrationKeyEvent, utc_dali_key_event_startup, utc_dali_key_event_cleanup},
+ {"UtcDaliLayerNew", UtcDaliLayerNew, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerDownCast", UtcDaliLayerDownCast, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerDownCast2", UtcDaliLayerDownCast2, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerGetDepth", UtcDaliLayerGetDepth, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerRaise", UtcDaliLayerRaise, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerLower", UtcDaliLayerLower, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerRaiseToTop", UtcDaliLayerRaiseToTop, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerLowerToBottom", UtcDaliLayerLowerToBottom, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerSetClipping", UtcDaliLayerSetClipping, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerIsClipping", UtcDaliLayerIsClipping, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerSetClippingBox", UtcDaliLayerSetClippingBox, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerGetClippingBox", UtcDaliLayerGetClippingBox, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerSetSortFunction", UtcDaliLayerSetSortFunction, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerRaiseAbove", UtcDaliLayerRaiseAbove, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerRaiseBelow", UtcDaliLayerRaiseBelow, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerMoveAbove", UtcDaliLayerMoveAbove, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerMoveBelow", UtcDaliLayerMoveBelow, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerDefaultProperties", UtcDaliLayerDefaultProperties, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerSetDepthTestDisabled", UtcDaliLayerSetDepthTestDisabled, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerCreateDestroy", UtcDaliLayerCreateDestroy, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLayerPropertyIndices", UtcDaliLayerPropertyIndices, layer_test_startup, layer_test_cleanup},
+ {"UtcDaliLongPressGestureConstructor", UtcDaliLongPressGestureConstructor, utc_dali_long_press_gesture_startup, utc_dali_long_press_gesture_cleanup},
+ {"UtcDaliLongPressGestureAssignment", UtcDaliLongPressGestureAssignment, utc_dali_long_press_gesture_startup, utc_dali_long_press_gesture_cleanup},
+ {"UtcDaliLongPressGestureDetectorConstructor", UtcDaliLongPressGestureDetectorConstructor, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureDetectorNew", UtcDaliLongPressGestureDetectorNew, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureDetectorDownCast", UtcDaliLongPressGestureDetectorDownCast, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureSetTouchesRequired01", UtcDaliLongPressGestureSetTouchesRequired01, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureSetTouchesRequired02", UtcDaliLongPressGestureSetTouchesRequired02, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureGetMinimumTouchesRequired", UtcDaliLongPressGestureGetMinimumTouchesRequired, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureGetMaximumTouchesRequired", UtcDaliLongPressGestureGetMaximumTouchesRequired, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureSignalReceptionNegative", UtcDaliLongPressGestureSignalReceptionNegative, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureSignalReceptionPositive", UtcDaliLongPressGestureSignalReceptionPositive, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureSignalReceptionDetach", UtcDaliLongPressGestureSignalReceptionDetach, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureSignalReceptionActorDestroyedDuringLongPress", UtcDaliLongPressGestureSignalReceptionActorDestroyedDuringLongPress, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureSignalReceptionRotatedActor", UtcDaliLongPressGestureSignalReceptionRotatedActor, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureSignalReceptionChildHit", UtcDaliLongPressGestureSignalReceptionChildHit, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureSignalReceptionAttachDetachMany", UtcDaliLongPressGestureSignalReceptionAttachDetachMany, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureSignalReceptionActorBecomesUntouchable", UtcDaliLongPressGestureSignalReceptionActorBecomesUntouchable, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureSignalReceptionMultipleGestureDetectors", UtcDaliLongPressGestureSignalReceptionMultipleGestureDetectors, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureSignalReceptionMultipleDetectorsOnActor", UtcDaliLongPressGestureSignalReceptionMultipleDetectorsOnActor, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureSignalReceptionDifferentPossible", UtcDaliLongPressGestureSignalReceptionDifferentPossible, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureEmitIncorrecteStateClear", UtcDaliLongPressGestureEmitIncorrecteStateClear, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureEmitIncorrectStateContinuing", UtcDaliLongPressGestureEmitIncorrectStateContinuing, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureRepeatedState", UtcDaliLongPressGestureRepeatedState, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGesturePossibleCancelled", UtcDaliLongPressGesturePossibleCancelled, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureDetachAfterStarted", UtcDaliLongPressGestureDetachAfterStarted, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureActorUnstaged", UtcDaliLongPressGestureActorUnstaged, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureActorStagedAndDestroyed", UtcDaliLongPressGestureActorStagedAndDestroyed, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliLongPressGestureSystemOverlay", UtcDaliLongPressGestureSystemOverlay, utc_dali_long_press_gesture_detector_startup, utc_dali_long_press_gesture_detector_cleanup},
+ {"UtcDaliMaterialNew01", UtcDaliMaterialNew01, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMaterialDownCast", UtcDaliMaterialDownCast, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMaterialSettersAndGetters", UtcDaliMaterialSettersAndGetters, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMaterialStage01", UtcDaliMaterialStage01, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMaterialStage01MemCheck", UtcDaliMaterialStage01MemCheck, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMaterialStage02", UtcDaliMaterialStage02, utc_dali_material_startup, utc_dali_material_cleanup},
+ {"UtcDaliMathUtilsNextPowerOfTwo", UtcDaliMathUtilsNextPowerOfTwo, utc_dali_math_utils_startup, utc_dali_math_utils_cleanup},
+ {"UtcDaliMathUtilsIsPowerOfTwo", UtcDaliMathUtilsIsPowerOfTwo, utc_dali_math_utils_startup, utc_dali_math_utils_cleanup},
+ {"UtcDaliMathUtilsGetRangedEpsilon", UtcDaliMathUtilsGetRangedEpsilon, utc_dali_math_utils_startup, utc_dali_math_utils_cleanup},
+ {"UtcDaliMathUtilsRound", UtcDaliMathUtilsRound, utc_dali_math_utils_startup, utc_dali_math_utils_cleanup},
+ {"UtcDaliMathUtilsClamp", UtcDaliMathUtilsClamp, utc_dali_math_utils_startup, utc_dali_math_utils_cleanup},
+ {"UtcDaliMathUtilsWrapInDomain", UtcDaliMathUtilsWrapInDomain, utc_dali_math_utils_startup, utc_dali_math_utils_cleanup},
+ {"UtcDaliMathUtilsShortestDistanceInDomain", UtcDaliMathUtilsShortestDistanceInDomain, utc_dali_math_utils_startup, utc_dali_math_utils_cleanup},
+ {"UtcDaliMathUtilsEquals", UtcDaliMathUtilsEquals, utc_dali_math_utils_startup, utc_dali_math_utils_cleanup},
+ {"UtcDaliMatrixCtor", UtcDaliMatrixCtor, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixOrthoNormalize0", UtcDaliMatrixOrthoNormalize0, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixOrthoNormalize1", UtcDaliMatrixOrthoNormalize1, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixInvert01", UtcDaliMatrixInvert01, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixInvert02", UtcDaliMatrixInvert02, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixInvertTransform01", UtcDaliMatrixInvertTransform01, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixInvertTransform02", UtcDaliMatrixInvertTransform02, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixGetXAxis", UtcDaliMatrixGetXAxis, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixGetYAxis", UtcDaliMatrixGetYAxis, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixGetZAxis", UtcDaliMatrixGetZAxis, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixGetTranslation", UtcDaliMatrixGetTranslation, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixGetTranslation3", UtcDaliMatrixGetTranslation3, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixSetIdentity", UtcDaliMatrixSetIdentity, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixSetIdentityAndScale", UtcDaliMatrixSetIdentityAndScale, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixSetXAxis", UtcDaliMatrixSetXAxis, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixSetYAxis", UtcDaliMatrixSetYAxis, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixSetZAxis", UtcDaliMatrixSetZAxis, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixSetTranslation", UtcDaliMatrixSetTranslation, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixSetTranslation3", UtcDaliMatrixSetTranslation3, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixTranspose", UtcDaliMatrixTranspose, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixOStreamOperator", UtcDaliMatrixOStreamOperator, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixMultiply", UtcDaliMatrixMultiply, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixOperatorMultiply", UtcDaliMatrixOperatorMultiply, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixOperatorMultiply02", UtcDaliMatrixOperatorMultiply02, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixOperatorEquals", UtcDaliMatrixOperatorEquals, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixOperatorNotEquals", UtcDaliMatrixOperatorNotEquals, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixGetTransformComponents01", UtcDaliMatrixGetTransformComponents01, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixGetTransformComponents02", UtcDaliMatrixGetTransformComponents02, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixSetTransformComponents01", UtcDaliMatrixSetTransformComponents01, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixSetInverseTransformComponent01", UtcDaliMatrixSetInverseTransformComponent01, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrixSetInverseTransformComponent02", UtcDaliMatrixSetInverseTransformComponent02, utc_dali_matrix_startup, utc_dali_matrix_cleanup},
+ {"UtcDaliMatrix3FromMatrix", UtcDaliMatrix3FromMatrix, utc_dali_matrix3_startup, utc_dali_matrix3_cleanup},
+ {"UtcDaliMatrix3OperatorAssign01", UtcDaliMatrix3OperatorAssign01, utc_dali_matrix3_startup, utc_dali_matrix3_cleanup},
+ {"UtcDaliMatrix3OperatorAssign02", UtcDaliMatrix3OperatorAssign02, utc_dali_matrix3_startup, utc_dali_matrix3_cleanup},
+ {"UtcDaliMatrix3AsFloat", UtcDaliMatrix3AsFloat, utc_dali_matrix3_startup, utc_dali_matrix3_cleanup},
+ {"UtcDaliMatrix3Invert", UtcDaliMatrix3Invert, utc_dali_matrix3_startup, utc_dali_matrix3_cleanup},
+ {"UtcDaliMatrix3Transpose", UtcDaliMatrix3Transpose, utc_dali_matrix3_startup, utc_dali_matrix3_cleanup},
+ {"UtcDaliMatrix3SetIdentity", UtcDaliMatrix3SetIdentity, utc_dali_matrix3_startup, utc_dali_matrix3_cleanup},
+ {"UtcDaliMatrix3Scale", UtcDaliMatrix3Scale, utc_dali_matrix3_startup, utc_dali_matrix3_cleanup},
+ {"UtcDaliMatrix3Magnitude", UtcDaliMatrix3Magnitude, utc_dali_matrix3_startup, utc_dali_matrix3_cleanup},
+ {"UtcDaliMatrix3ScaleInverseTranspose", UtcDaliMatrix3ScaleInverseTranspose, utc_dali_matrix3_startup, utc_dali_matrix3_cleanup},
+ {"UtcDaliMatrix3OStreamOperator", UtcDaliMatrix3OStreamOperator, utc_dali_matrix3_startup, utc_dali_matrix3_cleanup},
+ {"UtcDaliMatrix3Multiply", UtcDaliMatrix3Multiply, utc_dali_matrix3_startup, utc_dali_matrix3_cleanup},
+ {"UtcDaliMatrix3EqualityOperator", UtcDaliMatrix3EqualityOperator, utc_dali_matrix3_startup, utc_dali_matrix3_cleanup},
+ {"UtcDaliMatrix3InequalityOperator", UtcDaliMatrix3InequalityOperator, utc_dali_matrix3_startup, utc_dali_matrix3_cleanup},
+ {"UtcDaliMeshActorConstructorVoid", UtcDaliMeshActorConstructorVoid, mesh_actor_test_startup, mesh_actor_test_cleanup},
+ {"UtcDaliMeshActorNew01", UtcDaliMeshActorNew01, mesh_actor_test_startup, mesh_actor_test_cleanup},
+ {"UtcDaliMeshActorIndices", UtcDaliMeshActorIndices, mesh_actor_test_startup, mesh_actor_test_cleanup},
+ {"UtcDaliPanGestureConstructor", UtcDaliPanGestureConstructor, utc_dali_pan_gesture_startup, utc_dali_pan_gesture_cleanup},
+ {"UtcDaliPanGestureAssignment", UtcDaliPanGestureAssignment, utc_dali_pan_gesture_startup, utc_dali_pan_gesture_cleanup},
+ {"UtcDaliPanGestureGetSpeed", UtcDaliPanGestureGetSpeed, utc_dali_pan_gesture_startup, utc_dali_pan_gesture_cleanup},
+ {"UtcDaliPanGestureGetDistance", UtcDaliPanGestureGetDistance, utc_dali_pan_gesture_startup, utc_dali_pan_gesture_cleanup},
+ {"UtcDaliPanGestureGetScreenSpeed", UtcDaliPanGestureGetScreenSpeed, utc_dali_pan_gesture_startup, utc_dali_pan_gesture_cleanup},
+ {"UtcDaliPanGestureGetScreenDistance", UtcDaliPanGestureGetScreenDistance, utc_dali_pan_gesture_startup, utc_dali_pan_gesture_cleanup},
+ {"UtcDaliPanGestureDetectorConstructor", UtcDaliPanGestureDetectorConstructor, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureDetectorNew", UtcDaliPanGestureDetectorNew, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureDetectorDownCast", UtcDaliPanGestureDetectorDownCast, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSetMinimumTouchesRequired", UtcDaliPanGestureSetMinimumTouchesRequired, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSetMaximumTouchesRequired", UtcDaliPanGestureSetMaximumTouchesRequired, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureGetMinimumTouchesRequired", UtcDaliPanGestureGetMinimumTouchesRequired, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureGetMaximumTouchesRequired", UtcDaliPanGestureGetMaximumTouchesRequired, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSignalReceptionNegative", UtcDaliPanGestureSignalReceptionNegative, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSignalReceptionDownMotionLeave", UtcDaliPanGestureSignalReceptionDownMotionLeave, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSignalReceptionDownMotionUp", UtcDaliPanGestureSignalReceptionDownMotionUp, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSignalReceptionCancelled", UtcDaliPanGestureSignalReceptionCancelled, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSignalReceptionDetach", UtcDaliPanGestureSignalReceptionDetach, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSignalReceptionDetachWhilePanning", UtcDaliPanGestureSignalReceptionDetachWhilePanning, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSignalReceptionActorDestroyedWhilePanning", UtcDaliPanGestureSignalReceptionActorDestroyedWhilePanning, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSignalReceptionRotatedActor", UtcDaliPanGestureSignalReceptionRotatedActor, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSignalReceptionChildHit", UtcDaliPanGestureSignalReceptionChildHit, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSignalReceptionAttachDetachMany", UtcDaliPanGestureSignalReceptionAttachDetachMany, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSignalReceptionActorBecomesUntouchable", UtcDaliPanGestureSignalReceptionActorBecomesUntouchable, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSignalReceptionMultipleGestureDetectors", UtcDaliPanGestureSignalReceptionMultipleGestureDetectors, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSignalReceptionMultipleDetectorsOnActor", UtcDaliPanGestureSignalReceptionMultipleDetectorsOnActor, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSignalReceptionMultipleStarted", UtcDaliPanGestureSignalReceptionMultipleStarted, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSignalReceptionEnsureCorrectSignalling", UtcDaliPanGestureSignalReceptionEnsureCorrectSignalling, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSignalReceptionDifferentPossible", UtcDaliPanGestureSignalReceptionDifferentPossible, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureEmitIncorrectState", UtcDaliPanGestureEmitIncorrectState, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureActorUnstaged", UtcDaliPanGestureActorUnstaged, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureActorStagedAndDestroyed", UtcDaliPanGestureActorStagedAndDestroyed, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSystemOverlay", UtcDaliPanGestureSystemOverlay, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureAngleHandling", UtcDaliPanGestureAngleHandling, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureAngleOutOfRange", UtcDaliPanGestureAngleOutOfRange, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureAngleProcessing", UtcDaliPanGestureAngleProcessing, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureDirectionHandling", UtcDaliPanGestureDirectionHandling, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureDirectionProcessing", UtcDaliPanGestureDirectionProcessing, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSetProperties", UtcDaliPanGestureSetProperties, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGestureSetPropertiesAlreadyPanning", UtcDaliPanGestureSetPropertiesAlreadyPanning, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPanGesturePropertyIndices", UtcDaliPanGesturePropertyIndices, utc_dali_pan_gesture_detector_startup, utc_dali_pan_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureConstructor", UtcDaliPinchGestureConstructor, utc_dali_pinch_gesture_startup, utc_dali_pinch_gesture_cleanup},
+ {"UtcDaliPinchGestureAssignment", UtcDaliPinchGestureAssignment, utc_dali_pinch_gesture_startup, utc_dali_pinch_gesture_cleanup},
+ {"UtcDaliPinchGestureDetectorConstructor", UtcDaliPinchGestureDetectorConstructor, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureDetectorNew", UtcDaliPinchGestureDetectorNew, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureDetectorDownCast", UtcDaliPinchGestureDetectorDownCast, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureSignalReceptionNegative", UtcDaliPinchGestureSignalReceptionNegative, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureSignalReceptionDownMotionLeave", UtcDaliPinchGestureSignalReceptionDownMotionLeave, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureSignalReceptionDownMotionUp", UtcDaliPinchGestureSignalReceptionDownMotionUp, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureSignalReceptionCancelled", UtcDaliPinchGestureSignalReceptionCancelled, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureSignalReceptionDetach", UtcDaliPinchGestureSignalReceptionDetach, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureSignalReceptionDetachWhilePinching", UtcDaliPinchGestureSignalReceptionDetachWhilePinching, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureSignalReceptionActorDestroyedWhilePinching", UtcDaliPinchGestureSignalReceptionActorDestroyedWhilePinching, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureSignalReceptionRotatedActor", UtcDaliPinchGestureSignalReceptionRotatedActor, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureSignalReceptionChildHit", UtcDaliPinchGestureSignalReceptionChildHit, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureSignalReceptionAttachDetachMany", UtcDaliPinchGestureSignalReceptionAttachDetachMany, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureSignalReceptionActorBecomesUntouchable", UtcDaliPinchGestureSignalReceptionActorBecomesUntouchable, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureSignalReceptionMultipleDetectorsOnActor", UtcDaliPinchGestureSignalReceptionMultipleDetectorsOnActor, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureSignalReceptionMultipleStarted", UtcDaliPinchGestureSignalReceptionMultipleStarted, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureSignalReceptionEnsureCorrectSignalling", UtcDaliPinchGestureSignalReceptionEnsureCorrectSignalling, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureEmitIncorrectStateClear", UtcDaliPinchGestureEmitIncorrectStateClear, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureEmitIncorrectStatePossible", UtcDaliPinchGestureEmitIncorrectStatePossible, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureActorUnstaged", UtcDaliPinchGestureActorUnstaged, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureActorStagedAndDestroyed", UtcDaliPinchGestureActorStagedAndDestroyed, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPinchGestureSystemOverlay", UtcDaliPinchGestureSystemOverlay, utc_dali_pinch_gesture_detector_startup, utc_dali_pinch_gesture_detector_cleanup},
+ {"UtcDaliPixelHasAlpha", UtcDaliPixelHasAlpha, utc_dali_pixel_startup, utc_dali_pixel_cleanup},
+ {"UtcDaliPixelGetBytesPerPixel", UtcDaliPixelGetBytesPerPixel, utc_dali_pixel_startup, utc_dali_pixel_cleanup},
+ {"UtcDaliPixelGetAlphaOffsetAndMask", UtcDaliPixelGetAlphaOffsetAndMask, utc_dali_pixel_startup, utc_dali_pixel_cleanup},
+ {"UtcDaliPropertyNotificationDownCast", UtcDaliPropertyNotificationDownCast, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyNotificationDownCastNegative", UtcDaliPropertyNotificationDownCastNegative, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliAddPropertyNotification", UtcDaliAddPropertyNotification, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliAddPropertyNotificationCallback", UtcDaliAddPropertyNotificationCallback, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliAddPropertyNotificationTypeProperty", UtcDaliAddPropertyNotificationTypeProperty, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyNotificationGetCondition", UtcDaliPropertyNotificationGetCondition, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyNotificationGetConditionConst", UtcDaliPropertyNotificationGetConditionConst, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyNotificationGetTarget", UtcDaliPropertyNotificationGetTarget, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyNotificationGetProperty", UtcDaliPropertyNotificationGetProperty, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyNotificationGetNotifyMode", UtcDaliPropertyNotificationGetNotifyMode, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyNotificationGreaterThan", UtcDaliPropertyNotificationGreaterThan, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyNotificationLessThan", UtcDaliPropertyNotificationLessThan, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyNotificationInside", UtcDaliPropertyNotificationInside, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyNotificationOutside", UtcDaliPropertyNotificationOutside, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyNotificationVectorComponentGreaterThan", UtcDaliPropertyNotificationVectorComponentGreaterThan, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyNotificationVectorComponentLessThan", UtcDaliPropertyNotificationVectorComponentLessThan, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyNotificationVectorComponentInside", UtcDaliPropertyNotificationVectorComponentInside, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyNotificationVectorComponentOutside", UtcDaliPropertyNotificationVectorComponentOutside, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyConditionGetArguments", UtcDaliPropertyConditionGetArguments, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyConditionGetArgumentsConst", UtcDaliPropertyConditionGetArgumentsConst, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyNotificationStep", UtcDaliPropertyNotificationStep, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliPropertyNotificationVariableStep", UtcDaliPropertyNotificationVariableStep, utc_dali_property_notification_startup, utc_dali_property_notification_cleanup},
+ {"UtcDaliQuaternionCtor01", UtcDaliQuaternionCtor01, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionCtor02", UtcDaliQuaternionCtor02, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionCtor03", UtcDaliQuaternionCtor03, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionFromAxisAngle", UtcDaliQuaternionFromAxisAngle, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionToAxisAngle01", UtcDaliQuaternionToAxisAngle01, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionToAxisAngle02", UtcDaliQuaternionToAxisAngle02, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionToAxisAngle03", UtcDaliQuaternionToAxisAngle03, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionToAxisAngle04", UtcDaliQuaternionToAxisAngle04, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionEulerAngles", UtcDaliQuaternionEulerAngles, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionToMatrix01", UtcDaliQuaternionToMatrix01, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionToMatrix02", UtcDaliQuaternionToMatrix02, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionFromMatrix01", UtcDaliQuaternionFromMatrix01, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionFromMatrix02", UtcDaliQuaternionFromMatrix02, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionFromAxes01", UtcDaliQuaternionFromAxes01, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionFromAxes02", UtcDaliQuaternionFromAxes02, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionOperatorAddition", UtcDaliQuaternionOperatorAddition, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionOperatorSubtraction", UtcDaliQuaternionOperatorSubtraction, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionConjugate", UtcDaliQuaternionConjugate, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionOperatorMultiplication01", UtcDaliQuaternionOperatorMultiplication01, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionOperatorDivision", UtcDaliQuaternionOperatorDivision, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionOperatorScale01", UtcDaliQuaternionOperatorScale01, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionOperatorScale02", UtcDaliQuaternionOperatorScale02, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionOperatorNegation", UtcDaliQuaternionOperatorNegation, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionOperatorAddAssign", UtcDaliQuaternionOperatorAddAssign, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionOperatorSubtractAssign", UtcDaliQuaternionOperatorSubtractAssign, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionOperatorMultiplyAssign", UtcDaliQuaternionOperatorMultiplyAssign, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionOperatorScaleAssign01", UtcDaliQuaternionOperatorScaleAssign01, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionOperatorScaleAssign02", UtcDaliQuaternionOperatorScaleAssign02, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionOperatorEquality", UtcDaliQuaternionOperatorEquality, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionOperatorInequality", UtcDaliQuaternionOperatorInequality, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionLength", UtcDaliQuaternionLength, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionLengthSquared", UtcDaliQuaternionLengthSquared, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionNormalize", UtcDaliQuaternionNormalize, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionNormalized", UtcDaliQuaternionNormalized, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionInvert", UtcDaliQuaternionInvert, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionDot", UtcDaliQuaternionDot, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionOperatorMultiplication02", UtcDaliQuaternionOperatorMultiplication02, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionRotate01", UtcDaliQuaternionRotate01, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionRotate02", UtcDaliQuaternionRotate02, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionExp01", UtcDaliQuaternionExp01, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionExp02", UtcDaliQuaternionExp02, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionExp03", UtcDaliQuaternionExp03, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionLog01", UtcDaliQuaternionLog01, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionLog02", UtcDaliQuaternionLog02, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionLerp", UtcDaliQuaternionLerp, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionSlerp01", UtcDaliQuaternionSlerp01, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionSlerp02", UtcDaliQuaternionSlerp02, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionSlerp03", UtcDaliQuaternionSlerp03, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionSlerp04", UtcDaliQuaternionSlerp04, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionSlerpNoInvert01", UtcDaliQuaternionSlerpNoInvert01, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionSlerpNoInvert02", UtcDaliQuaternionSlerpNoInvert02, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionSquad", UtcDaliQuaternionSquad, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliAngleBetween", UtcDaliAngleBetween, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliQuaternionOStreamOperator", UtcDaliQuaternionOStreamOperator, utc_dali_quaternion_startup, utc_dali_quaternion_cleanup},
+ {"UtcDaliRadianConstructors01", UtcDaliRadianConstructors01, utc_dali_radian_startup, utc_dali_radian_cleanup},
+ {"UtcDaliRadianComparison01", UtcDaliRadianComparison01, utc_dali_radian_startup, utc_dali_radian_cleanup},
+ {"UtcDaliRadianCastOperators01", UtcDaliRadianCastOperators01, utc_dali_radian_startup, utc_dali_radian_cleanup},
+ {"UtcDaliRadianCastOperatorEquals", UtcDaliRadianCastOperatorEquals, utc_dali_radian_startup, utc_dali_radian_cleanup},
+ {"UtcDaliRadianCastOperatorNotEquals", UtcDaliRadianCastOperatorNotEquals, utc_dali_radian_startup, utc_dali_radian_cleanup},
+ {"UtcDaliRadianCastOperatorLessThan", UtcDaliRadianCastOperatorLessThan, utc_dali_radian_startup, utc_dali_radian_cleanup},
+ {"UtcDaliRectCons01", UtcDaliRectCons01, utc_dali_rect_startup, utc_dali_rect_cleanup},
+ {"UtcDaliRectCons02", UtcDaliRectCons02, utc_dali_rect_startup, utc_dali_rect_cleanup},
+ {"UtcDaliRectCons03", UtcDaliRectCons03, utc_dali_rect_startup, utc_dali_rect_cleanup},
+ {"UtcDaliRectCons04", UtcDaliRectCons04, utc_dali_rect_startup, utc_dali_rect_cleanup},
+ {"UtcDaliRectSet", UtcDaliRectSet, utc_dali_rect_startup, utc_dali_rect_cleanup},
+ {"UtcDaliRectIsEmpty", UtcDaliRectIsEmpty, utc_dali_rect_startup, utc_dali_rect_cleanup},
+ {"UtcDaliRectRight", UtcDaliRectRight, utc_dali_rect_startup, utc_dali_rect_cleanup},
+ {"UtcDaliRectBottom", UtcDaliRectBottom, utc_dali_rect_startup, utc_dali_rect_cleanup},
+ {"UtcDaliRectArea", UtcDaliRectArea, utc_dali_rect_startup, utc_dali_rect_cleanup},
+ {"UtcDaliRectIntersects", UtcDaliRectIntersects, utc_dali_rect_startup, utc_dali_rect_cleanup},
+ {"UtcDaliRectContains", UtcDaliRectContains, utc_dali_rect_startup, utc_dali_rect_cleanup},
+ {"UtcDaliRectOperatorNotEquals", UtcDaliRectOperatorNotEquals, utc_dali_rect_startup, utc_dali_rect_cleanup},
+ {"UtcDaliRectOperatorEquals", UtcDaliRectOperatorEquals, utc_dali_rect_startup, utc_dali_rect_cleanup},
+ {"UtcDaliRenderTaskDownCast", UtcDaliRenderTaskDownCast, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskSetSourceActor", UtcDaliRenderTaskSetSourceActor, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskSetSourceActorOffStage", UtcDaliRenderTaskSetSourceActorOffStage, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskSetSourceActorEmpty", UtcDaliRenderTaskSetSourceActorEmpty, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskGetSourceActor", UtcDaliRenderTaskGetSourceActor, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskSetExclusive", UtcDaliRenderTaskSetExclusive, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskIsExclusive", UtcDaliRenderTaskIsExclusive, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskSetInputEnabled", UtcDaliRenderTaskSetInputEnabled, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskGetInputEnabled", UtcDaliRenderTaskGetInputEnabled, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskSetCameraActor", UtcDaliRenderTaskSetCameraActor, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskGetCameraActor", UtcDaliRenderTaskGetCameraActor, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskSetTargetFrameBuffer", UtcDaliRenderTaskSetTargetFrameBuffer, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskGetTargetFrameBuffer", UtcDaliRenderTaskGetTargetFrameBuffer, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskSetScreenToFrameBufferFunction", UtcDaliRenderTaskSetScreenToFrameBufferFunction, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskGetScreenToFrameBufferFunction", UtcDaliRenderTaskGetScreenToFrameBufferFunction, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskGetScreenToFrameBufferMappingActor", UtcDaliRenderTaskGetScreenToFrameBufferMappingActor, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskSetViewport", UtcDaliRenderTaskSetViewport, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskGetViewport", UtcDaliRenderTaskGetViewport, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskSetViewportPosition", UtcDaliRenderTaskSetViewportPosition, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskSetViewportSize", UtcDaliRenderTaskSetViewportSize, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskSetClearColor", UtcDaliRenderTaskSetClearColor, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskGetClearColor", UtcDaliRenderTaskGetClearColor, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskSetClearEnabled", UtcDaliRenderTaskSetClearEnabled, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskGetClearEnabled", UtcDaliRenderTaskGetClearEnabled, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskSetRefreshRate", UtcDaliRenderTaskSetRefreshRate, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskGetRefreshRate", UtcDaliRenderTaskGetRefreshRate, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskSignalFinished", UtcDaliRenderTaskSignalFinished, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskContinuous01", UtcDaliRenderTaskContinuous01, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskContinuous02", UtcDaliRenderTaskContinuous02, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskContinuous03", UtcDaliRenderTaskContinuous03, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskContinuous04", UtcDaliRenderTaskContinuous04, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskContinuous05", UtcDaliRenderTaskContinuous05, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskContinuous06", UtcDaliRenderTaskContinuous06, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskOnce01", UtcDaliRenderTaskOnce01, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskOnce02", UtcDaliRenderTaskOnce02, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskOnce03", UtcDaliRenderTaskOnce03, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskOnce05", UtcDaliRenderTaskOnce05, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskOnce06", UtcDaliRenderTaskOnce06, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskOnce07", UtcDaliRenderTaskOnce07, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskOnce08", UtcDaliRenderTaskOnce08, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskOnceNoSync01", UtcDaliRenderTaskOnceNoSync01, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskOnceNoSync02", UtcDaliRenderTaskOnceNoSync02, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskOnceNoSync03", UtcDaliRenderTaskOnceNoSync03, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskOnceNoSync05", UtcDaliRenderTaskOnceNoSync05, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskOnceNoSync06", UtcDaliRenderTaskOnceNoSync06, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskOnceNoSync07", UtcDaliRenderTaskOnceNoSync07, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskOnceNoSync08", UtcDaliRenderTaskOnceNoSync08, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskOnceChain01", UtcDaliRenderTaskOnceChain01, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskProperties", UtcDaliRenderTaskProperties, utc_dali_render_task_startup, utc_dali_render_task_cleanup},
+ {"UtcDaliRenderTaskListDefaultConstructor", UtcDaliRenderTaskListDefaultConstructor, utc_dali_render_task_list_startup, utc_dali_render_task_list_cleanup},
+ {"UtcDaliRenderTaskListDownCast", UtcDaliRenderTaskListDownCast, utc_dali_render_task_list_startup, utc_dali_render_task_list_cleanup},
+ {"UtcDaliRenderTaskListCreateTask", UtcDaliRenderTaskListCreateTask, utc_dali_render_task_list_startup, utc_dali_render_task_list_cleanup},
+ {"UtcDaliRenderTaskListRemoveTask", UtcDaliRenderTaskListRemoveTask, utc_dali_render_task_list_startup, utc_dali_render_task_list_cleanup},
+ {"UtcDaliRenderTaskListGetTaskCount", UtcDaliRenderTaskListGetTaskCount, utc_dali_render_task_list_startup, utc_dali_render_task_list_cleanup},
+ {"UtcDaliRenderTaskListGetTask", UtcDaliRenderTaskListGetTask, utc_dali_render_task_list_startup, utc_dali_render_task_list_cleanup},
+ {"UtcDaliRenderableActorDownCast", UtcDaliRenderableActorDownCast, renderable_actor_startup, renderable_actor_cleanup},
+ {"UtcDaliRenderableActorSetSortModifier", UtcDaliRenderableActorSetSortModifier, renderable_actor_startup, renderable_actor_cleanup},
+ {"UtcDaliRenderableActorGetSortModifier", UtcDaliRenderableActorGetSortModifier, renderable_actor_startup, renderable_actor_cleanup},
+ {"UtcDaliRenderableActorSetGetBlendMode", UtcDaliRenderableActorSetGetBlendMode, renderable_actor_startup, renderable_actor_cleanup},
+ {"UtcDaliRenderableActorSetCullFace", UtcDaliRenderableActorSetCullFace, renderable_actor_startup, renderable_actor_cleanup},
+ {"UtcDaliRenderableActorGetCullFace", UtcDaliRenderableActorGetCullFace, renderable_actor_startup, renderable_actor_cleanup},
+ {"UtcDaliRenderableActorSetGetBlendFunc", UtcDaliRenderableActorSetGetBlendFunc, renderable_actor_startup, renderable_actor_cleanup},
+ {"UtcDaliRenderableActorSetGetBlendEquation", UtcDaliRenderableActorSetGetBlendEquation, renderable_actor_startup, renderable_actor_cleanup},
+ {"UtcDaliRenderableActorSetGetBlendColor", UtcDaliRenderableActorSetGetBlendColor, renderable_actor_startup, renderable_actor_cleanup},
+ {"UtcDaliRenderableActorSetGetAlpha", UtcDaliRenderableActorSetGetAlpha, renderable_actor_startup, renderable_actor_cleanup},
+ {"UtcDaliRenderableActorCreateDestroy", UtcDaliRenderableActorCreateDestroy, renderable_actor_startup, renderable_actor_cleanup},
+ {"UtcDaliShaderEffectMethodNew01", UtcDaliShaderEffectMethodNew01, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodNew02", UtcDaliShaderEffectMethodNew02, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodNew03", UtcDaliShaderEffectMethodNew03, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodNew04", UtcDaliShaderEffectMethodNew04, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodNew05", UtcDaliShaderEffectMethodNew05, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodNew06", UtcDaliShaderEffectMethodNew06, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodDownCast", UtcDaliShaderEffectMethodDownCast, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodDelete01", UtcDaliShaderEffectMethodDelete01, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodSetUniformFloat", UtcDaliShaderEffectMethodSetUniformFloat, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodSetUniformVector2", UtcDaliShaderEffectMethodSetUniformVector2, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodSetUniformVector3", UtcDaliShaderEffectMethodSetUniformVector3, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodSetUniformVector4", UtcDaliShaderEffectMethodSetUniformVector4, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodSetUniformMatrix", UtcDaliShaderEffectMethodSetUniformMatrix, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodSetUniformMatrix3", UtcDaliShaderEffectMethodSetUniformMatrix3, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodSetUniformViewport", UtcDaliShaderEffectMethodSetUniformViewport, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodSetEffectImage", UtcDaliShaderEffectMethodSetEffectImage, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodSetEffectImageAndDelete", UtcDaliShaderEffectMethodSetEffectImageAndDelete, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodApplyConstraint", UtcDaliShaderEffectMethodApplyConstraint, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodApplyConstraintFromActor", UtcDaliShaderEffectMethodApplyConstraintFromActor, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodApplyConstraintFromActor2", UtcDaliShaderEffectMethodApplyConstraintFromActor2, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodApplyConstraintCallback", UtcDaliShaderEffectMethodApplyConstraintCallback, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodRemoveConstraints", UtcDaliShaderEffectMethodRemoveConstraints, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodRemoveConstraints2", UtcDaliShaderEffectMethodRemoveConstraints2, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodCreateExtension", UtcDaliShaderEffectMethodCreateExtension, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodCreateExtension2", UtcDaliShaderEffectMethodCreateExtension2, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectMethodNoExtension", UtcDaliShaderEffectMethodNoExtension, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliShaderEffectPropertyIndices", UtcDaliShaderEffectPropertyIndices, utc_dali_shader_effect_startup, utc_dali_shader_effect_cleanup},
+ {"UtcDaliSignalFunctorsEmptyCheck", UtcDaliSignalFunctorsEmptyCheck, utc_dali_signal_templates_functors_startup, utc_dali_signal_templates_functors_cleanup},
+ {"UtcDaliSignalFunctorsEmit", UtcDaliSignalFunctorsEmit, utc_dali_signal_templates_functors_startup, utc_dali_signal_templates_functors_cleanup},
+ {"UtcDaliSignalFunctorsEmitReturn", UtcDaliSignalFunctorsEmitReturn, utc_dali_signal_templates_functors_startup, utc_dali_signal_templates_functors_cleanup},
+ {"UtcDaliSignalFunctorsDisconnectBeforeEmit", UtcDaliSignalFunctorsDisconnectBeforeEmit, utc_dali_signal_templates_functors_startup, utc_dali_signal_templates_functors_cleanup},
+ {"UtcDaliSignalFunctorsDestroySignal", UtcDaliSignalFunctorsDestroySignal, utc_dali_signal_templates_functors_startup, utc_dali_signal_templates_functors_cleanup},
+ {"UtcDaliSignalConnectVoidFunctor", UtcDaliSignalConnectVoidFunctor, utc_dali_signal_templates_functors_startup, utc_dali_signal_templates_functors_cleanup},
+ {"UtcDaliSignalEmptyCheck", UtcDaliSignalEmptyCheck, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalEmptyCheckSlotDestruction", UtcDaliSignalEmptyCheckSlotDestruction, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalConnectAndEmit", UtcDaliSignalConnectAndEmit, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalDisconnect", UtcDaliSignalDisconnect, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalDisconnect2", UtcDaliSignalDisconnect2, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalDisconnect3", UtcDaliSignalDisconnect3, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalCustomConnectionTracker", UtcDaliSignalCustomConnectionTracker, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalMultipleConnections", UtcDaliSignalMultipleConnections, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalMultipleConnections2", UtcDaliSignalMultipleConnections2, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalMultipleConnections3", UtcDaliSignalMultipleConnections3, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalDisconnectStatic", UtcDaliSignalDisconnectStatic, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalDisconnectDuringCallback", UtcDaliSignalDisconnectDuringCallback, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalDisconnectDuringCallback2", UtcDaliSignalDisconnectDuringCallback2, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalEmitDuringCallback", UtcDaliSignalEmitDuringCallback, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalTestApp01", UtcDaliSignalTestApp01, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalTestApp02", UtcDaliSignalTestApp02, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalTestApp03", UtcDaliSignalTestApp03, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalTestApp04", UtcDaliSignalTestApp04, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalTestApp05", UtcDaliSignalTestApp05, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalTestApp06", UtcDaliSignalTestApp06, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSlotDelegateConnection", UtcDaliSlotDelegateConnection, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSignalSlotDelegateDestruction", UtcDaliSignalSlotDelegateDestruction, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliSlotHandlerDisconnect", UtcDaliSlotHandlerDisconnect, utc_dali_signal_templates_startup, utc_dali_signal_templates_cleanup},
+ {"UtcDaliStageDefaultConstructor", UtcDaliStageDefaultConstructor, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageDestructor", UtcDaliStageDestructor, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageGetCurrent", UtcDaliStageGetCurrent, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageIsInstalled", UtcDaliStageIsInstalled, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageAdd", UtcDaliStageAdd, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageRemove", UtcDaliStageRemove, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageGetSize", UtcDaliStageGetSize, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageGetDpi01", UtcDaliStageGetDpi01, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageGetDpi02", UtcDaliStageGetDpi02, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageGetDpi03", UtcDaliStageGetDpi03, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageGetLayerCount", UtcDaliStageGetLayerCount, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageGetLayer", UtcDaliStageGetLayer, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageGetRootLayer", UtcDaliStageGetRootLayer, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageSetBackgroundColor", UtcDaliStageSetBackgroundColor, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageGetBackgroundColor", UtcDaliStageGetBackgroundColor, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageKeepRendering", UtcDaliStageKeepRendering, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageEventProcessingFinished", UtcDaliStageEventProcessingFinished, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageSignalKeyEvent", UtcDaliStageSignalKeyEvent, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliStageTouchedSignal", UtcDaliStageTouchedSignal, stage_test_startup, stage_test_cleanup},
+ {"UtcDaliTapGestureConstructor", UtcDaliTapGestureConstructor, utc_dali_tap_gesture_startup, utc_dali_tap_gesture_cleanup},
+ {"UtcDaliTapGestureAssignment", UtcDaliTapGestureAssignment, utc_dali_tap_gesture_startup, utc_dali_tap_gesture_cleanup},
+ {"UtcDaliTapGestureDetectorConstructor", UtcDaliTapGestureDetectorConstructor, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureDetectorNew", UtcDaliTapGestureDetectorNew, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureDetectorDownCast", UtcDaliTapGestureDetectorDownCast, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureSetTapsRequired", UtcDaliTapGestureSetTapsRequired, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureGetTapsRequired", UtcDaliTapGestureGetTapsRequired, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureSetTouchesRequired", UtcDaliTapGestureSetTouchesRequired, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureGetTouchesRequired", UtcDaliTapGestureGetTouchesRequired, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureSignalReceptionNegative", UtcDaliTapGestureSignalReceptionNegative, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureSignalReceptionPositive", UtcDaliTapGestureSignalReceptionPositive, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureSignalReceptionDetach", UtcDaliTapGestureSignalReceptionDetach, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureSignalReceptionActorDestroyedWhileTapping", UtcDaliTapGestureSignalReceptionActorDestroyedWhileTapping, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureSignalReceptionRotatedActor", UtcDaliTapGestureSignalReceptionRotatedActor, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureSignalReceptionChildHit", UtcDaliTapGestureSignalReceptionChildHit, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureSignalReceptionAttachDetachMany", UtcDaliTapGestureSignalReceptionAttachDetachMany, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureSignalReceptionActorBecomesUntouchable", UtcDaliTapGestureSignalReceptionActorBecomesUntouchable, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureSignalReceptionMultipleGestureDetectors", UtcDaliTapGestureSignalReceptionMultipleGestureDetectors, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureSignalReceptionMultipleDetectorsOnActor", UtcDaliTapGestureSignalReceptionMultipleDetectorsOnActor, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureSignalReceptionDifferentPossible", UtcDaliTapGestureSignalReceptionDifferentPossible, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureEmitIncorrectStateClear", UtcDaliTapGestureEmitIncorrectStateClear, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureEmitIncorrectStateContinuing", UtcDaliTapGestureEmitIncorrectStateContinuing, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureEmitIncorrectStateFinished", UtcDaliTapGestureEmitIncorrectStateFinished, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureActorUnstaged", UtcDaliTapGestureActorUnstaged, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureRepeatedState", UtcDaliTapGestureRepeatedState, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGesturePossibleCancelled", UtcDaliTapGesturePossibleCancelled, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureDetectorRemovedWhilePossible", UtcDaliTapGestureDetectorRemovedWhilePossible, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureActorRemovedWhilePossible", UtcDaliTapGestureActorRemovedWhilePossible, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTapGestureSystemOverlay", UtcDaliTapGestureSystemOverlay, utc_dali_tap_gesture_detector_startup, utc_dali_tap_gesture_detector_cleanup},
+ {"UtcDaliTextConstructor", UtcDaliTextConstructor, utc_dali_text_startup, utc_dali_text_cleanup},
+ {"UtcDaliTextCopyConstructor", UtcDaliTextCopyConstructor, utc_dali_text_startup, utc_dali_text_cleanup},
+ {"UtcDaliTextAssignmentOperator", UtcDaliTextAssignmentOperator, utc_dali_text_startup, utc_dali_text_cleanup},
+ {"UtcDaliTextSetGetText", UtcDaliTextSetGetText, utc_dali_text_startup, utc_dali_text_cleanup},
+ {"UtcDaliTextAccessOperator01", UtcDaliTextAccessOperator01, utc_dali_text_startup, utc_dali_text_cleanup},
+ {"UtcDaliTextAccessOperator02", UtcDaliTextAccessOperator02, utc_dali_text_startup, utc_dali_text_cleanup},
+ {"UtcDaliTextIsEmpty", UtcDaliTextIsEmpty, utc_dali_text_startup, utc_dali_text_cleanup},
+ {"UtcDaliTextGetLength", UtcDaliTextGetLength, utc_dali_text_startup, utc_dali_text_cleanup},
+ {"UtcDaliTextAppend", UtcDaliTextAppend, utc_dali_text_startup, utc_dali_text_cleanup},
+ {"UtcDaliTextRemove01", UtcDaliTextRemove01, utc_dali_text_startup, utc_dali_text_cleanup},
+ {"UtcDaliTextRemove02", UtcDaliTextRemove02, utc_dali_text_startup, utc_dali_text_cleanup},
+ {"UtcDaliTextActorConstructorVoid", UtcDaliTextActorConstructorVoid, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorNew01", UtcDaliTextActorNew01, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorNew02", UtcDaliTextActorNew02, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorNew03", UtcDaliTextActorNew03, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorNew04", UtcDaliTextActorNew04, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorNew05", UtcDaliTextActorNew05, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorNew06", UtcDaliTextActorNew06, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorNew07", UtcDaliTextActorNew07, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorDownCast", UtcDaliTextActorDownCast, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorDownCast2", UtcDaliTextActorDownCast2, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorSetText", UtcDaliTextActorSetText, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorSetFont", UtcDaliTextActorSetFont, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorSetFontDetection", UtcDaliTextActorSetFontDetection, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorSetTextIndividualStyles", UtcDaliTextActorSetTextIndividualStyles, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorChangingText", UtcDaliTextActorChangingText, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorGetLoadingState", UtcDaliTextActorGetLoadingState, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorSetItalics", UtcDaliTextActorSetItalics, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorSetUnderline", UtcDaliTextActorSetUnderline, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorSetWeight", UtcDaliTextActorSetWeight, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorSetStyle", UtcDaliTextActorSetStyle, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorDefaultProperties", UtcDaliTextActorDefaultProperties, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorSetGradientColor", UtcDaliTextActorSetGradientColor, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorSetGradientStartPoint", UtcDaliTextActorSetGradientStartPoint, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorSetGradientEndPoint", UtcDaliTextActorSetGradientEndPoint, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorSynchronousGlyphLoading", UtcDaliTextActorSynchronousGlyphLoading, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorAutomaticSizeSet", UtcDaliTextActorAutomaticSizeSet, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorAutomaticSizeSetAnimation", UtcDaliTextActorAutomaticSizeSetAnimation, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextActorPropertyIndices", UtcDaliTextActorPropertyIndices, text_actor_test_startup, text_actor_test_cleanup},
+ {"UtcDaliTextStyleDefaultConstructor", UtcDaliTextStyleDefaultConstructor, utc_dali_text_style_startup, utc_dali_text_style_cleanup},
+ {"UtcDaliTextStyleCopyConstructor", UtcDaliTextStyleCopyConstructor, utc_dali_text_style_startup, utc_dali_text_style_cleanup},
+ {"UtcDaliTextStyleComparisonOperator", UtcDaliTextStyleComparisonOperator, utc_dali_text_style_startup, utc_dali_text_style_cleanup},
+ {"UtcDaliTextStyleCopy", UtcDaliTextStyleCopy, utc_dali_text_style_startup, utc_dali_text_style_cleanup},
+ {"UtcDaliTextStyleSetGetFontName", UtcDaliTextStyleSetGetFontName, utc_dali_text_style_startup, utc_dali_text_style_cleanup},
+ {"UtcDaliTextStyleSetGetFontStyle", UtcDaliTextStyleSetGetFontStyle, utc_dali_text_style_startup, utc_dali_text_style_cleanup},
+ {"UtcDaliTextStyleSetGetFontPointSize", UtcDaliTextStyleSetGetFontPointSize, utc_dali_text_style_startup, utc_dali_text_style_cleanup},
+ {"UtcDaliTextStyleSetGetWeight", UtcDaliTextStyleSetGetWeight, utc_dali_text_style_startup, utc_dali_text_style_cleanup},
+ {"UtcDaliTextStyleSetGetTextColor", UtcDaliTextStyleSetGetTextColor, utc_dali_text_style_startup, utc_dali_text_style_cleanup},
+ {"UtcDaliTextStyleSetGetItalics", UtcDaliTextStyleSetGetItalics, utc_dali_text_style_startup, utc_dali_text_style_cleanup},
+ {"UtcDaliTextStyleSetGetItalicsAngle", UtcDaliTextStyleSetGetItalicsAngle, utc_dali_text_style_startup, utc_dali_text_style_cleanup},
+ {"UtcDaliTextStyleSetGetUnderline", UtcDaliTextStyleSetGetUnderline, utc_dali_text_style_startup, utc_dali_text_style_cleanup},
+ {"UtcDaliTextStyleSetGetShadow", UtcDaliTextStyleSetGetShadow, utc_dali_text_style_startup, utc_dali_text_style_cleanup},
+ {"UtcDaliTextStyleSetGetGlow", UtcDaliTextStyleSetGetGlow, utc_dali_text_style_startup, utc_dali_text_style_cleanup},
+ {"UtcDaliTextStyleSetGetOutline", UtcDaliTextStyleSetGetOutline, utc_dali_text_style_startup, utc_dali_text_style_cleanup},
+ {"UtcDaliTextStyleSetGetSmoothEdge", UtcDaliTextStyleSetGetSmoothEdge, utc_dali_text_style_startup, utc_dali_text_style_cleanup},
+ {"UtcDaliTouchEventCombinerConstructors", UtcDaliTouchEventCombinerConstructors, utc_dali_touch_event_combiner_startup, utc_dali_touch_event_combiner_cleanup},
+ {"UtcDaliTouchEventCombinerConstructorsNegative", UtcDaliTouchEventCombinerConstructorsNegative, utc_dali_touch_event_combiner_startup, utc_dali_touch_event_combiner_cleanup},
+ {"UtcDaliTouchEventCombinerSettersAndGetters", UtcDaliTouchEventCombinerSettersAndGetters, utc_dali_touch_event_combiner_startup, utc_dali_touch_event_combiner_cleanup},
+ {"UtcDaliTouchEventCombinerSettersNegative", UtcDaliTouchEventCombinerSettersNegative, utc_dali_touch_event_combiner_startup, utc_dali_touch_event_combiner_cleanup},
+ {"UtcDaliTouchEventCombinerSingleTouchNormal", UtcDaliTouchEventCombinerSingleTouchNormal, utc_dali_touch_event_combiner_startup, utc_dali_touch_event_combiner_cleanup},
+ {"UtcDaliTouchEventCombinerSingleTouchMotionWithoutDown", UtcDaliTouchEventCombinerSingleTouchMotionWithoutDown, utc_dali_touch_event_combiner_startup, utc_dali_touch_event_combiner_cleanup},
+ {"UtcDaliTouchEventCombinerSingleTouchTwoDowns", UtcDaliTouchEventCombinerSingleTouchTwoDowns, utc_dali_touch_event_combiner_startup, utc_dali_touch_event_combiner_cleanup},
+ {"UtcDaliTouchEventCombinerSingleTouchUpWithoutDown", UtcDaliTouchEventCombinerSingleTouchUpWithoutDown, utc_dali_touch_event_combiner_startup, utc_dali_touch_event_combiner_cleanup},
+ {"UtcDaliTouchEventCombinerSingleTouchTwoUps", UtcDaliTouchEventCombinerSingleTouchTwoUps, utc_dali_touch_event_combiner_startup, utc_dali_touch_event_combiner_cleanup},
+ {"UtcDaliTouchEventCombinerSingleTouchUpWithDifferentId", UtcDaliTouchEventCombinerSingleTouchUpWithDifferentId, utc_dali_touch_event_combiner_startup, utc_dali_touch_event_combiner_cleanup},
+ {"UtcDaliTouchEventCombinerSingleTouchMotionWithDifferentId", UtcDaliTouchEventCombinerSingleTouchMotionWithDifferentId, utc_dali_touch_event_combiner_startup, utc_dali_touch_event_combiner_cleanup},
+ {"UtcDaliTouchEventCombinerMultiTouchNormal", UtcDaliTouchEventCombinerMultiTouchNormal, utc_dali_touch_event_combiner_startup, utc_dali_touch_event_combiner_cleanup},
+ {"UtcDaliTouchEventCombinerSeveralPoints", UtcDaliTouchEventCombinerSeveralPoints, utc_dali_touch_event_combiner_startup, utc_dali_touch_event_combiner_cleanup},
+ {"UtcDaliTouchEventCombinerReset", UtcDaliTouchEventCombinerReset, utc_dali_touch_event_combiner_startup, utc_dali_touch_event_combiner_cleanup},
+ {"UtcDaliTouchEventCombinerSingleTouchInterrupted", UtcDaliTouchEventCombinerSingleTouchInterrupted, utc_dali_touch_event_combiner_startup, utc_dali_touch_event_combiner_cleanup},
+ {"UtcDaliTouchEventCombinerMultiTouchInterrupted", UtcDaliTouchEventCombinerMultiTouchInterrupted, utc_dali_touch_event_combiner_startup, utc_dali_touch_event_combiner_cleanup},
+ {"UtcDaliTouchEventCombinerInvalidState", UtcDaliTouchEventCombinerInvalidState, utc_dali_touch_event_combiner_startup, utc_dali_touch_event_combiner_cleanup},
+ {"UtcDaliTouchNormalProcessing", UtcDaliTouchNormalProcessing, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchOutsideCameraNearFarPlanes", UtcDaliTouchOutsideCameraNearFarPlanes, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchEmitEmpty", UtcDaliTouchEmitEmpty, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchInterrupted", UtcDaliTouchInterrupted, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchParentConsumer", UtcDaliTouchParentConsumer, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchInterruptedParentConsumer", UtcDaliTouchInterruptedParentConsumer, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchLeave", UtcDaliTouchLeave, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchLeaveParentConsumer", UtcDaliTouchLeaveParentConsumer, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchActorBecomesInsensitive", UtcDaliTouchActorBecomesInsensitive, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchActorBecomesInsensitiveParentConsumer", UtcDaliTouchActorBecomesInsensitiveParentConsumer, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchMultipleLayers", UtcDaliTouchMultipleLayers, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchMultipleRenderTasks", UtcDaliTouchMultipleRenderTasks, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchMultipleRenderTasksWithChildLayer", UtcDaliTouchMultipleRenderTasksWithChildLayer, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchOffscreenRenderTasks", UtcDaliTouchOffscreenRenderTasks, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchMultipleRenderableActors", UtcDaliTouchMultipleRenderableActors, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchActorRemovedInSignal", UtcDaliTouchActorRemovedInSignal, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchActorSignalNotConsumed", UtcDaliTouchActorSignalNotConsumed, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchActorUnStaged", UtcDaliTouchActorUnStaged, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliTouchSystemOverlayActor", UtcDaliTouchSystemOverlayActor, utc_dali_touch_processing_startup, utc_dali_touch_processing_cleanup},
+ {"UtcDaliVector2Cons", UtcDaliVector2Cons, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2FitInside", UtcDaliVector2FitInside, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2FitScaleToFill", UtcDaliVector2FitScaleToFill, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2ShrinkInside", UtcDaliVector2ShrinkInside, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2Add", UtcDaliVector2Add, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2Subtract", UtcDaliVector2Subtract, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2Negate", UtcDaliVector2Negate, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2Multiply", UtcDaliVector2Multiply, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2Divide", UtcDaliVector2Divide, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2Scale", UtcDaliVector2Scale, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2Equals", UtcDaliVector2Equals, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2Length", UtcDaliVector2Length, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2LengthSquared", UtcDaliVector2LengthSquared, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2Max", UtcDaliVector2Max, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2Min", UtcDaliVector2Min, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2Clamp", UtcDaliVector2Clamp, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2ClampVector2", UtcDaliVector2ClampVector2, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2Normalize", UtcDaliVector2Normalize, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2OperatorSubscript", UtcDaliVector2OperatorSubscript, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector2OStreamOperator", UtcDaliVector2OStreamOperator, utc_dali_vector2_startup, utc_dali_vector2_cleanup},
+ {"UtcDaliVector3Cons", UtcDaliVector3Cons, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3Assign", UtcDaliVector3Assign, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3Add", UtcDaliVector3Add, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3Constants", UtcDaliVector3Constants, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3Cross", UtcDaliVector3Cross, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3Dot", UtcDaliVector3Dot, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3Equals", UtcDaliVector3Equals, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3Length", UtcDaliVector3Length, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3LengthSquared", UtcDaliVector3LengthSquared, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3Max", UtcDaliVector3Max, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3Min", UtcDaliVector3Min, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3Clamp", UtcDaliVector3Clamp, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3ClampVector3", UtcDaliVector3ClampVector3, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3Multiply", UtcDaliVector3Multiply, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3Divide", UtcDaliVector3Divide, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3Scale", UtcDaliVector3Scale, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3Normalize", UtcDaliVector3Normalize, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3Subtract", UtcDaliVector3Subtract, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3OperatorSubscript", UtcDaliVector3OperatorSubscript, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3OStreamOperator", UtcDaliVector3OStreamOperator, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3Rotate", UtcDaliVector3Rotate, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3AsFloat", UtcDaliVector3AsFloat, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3AsVectorXY", UtcDaliVector3AsVectorXY, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3FitKeepAspectRatio", UtcDaliVector3FitKeepAspectRatio, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3FillKeepAspectRatio", UtcDaliVector3FillKeepAspectRatio, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3FillXYKeepAspectRatio", UtcDaliVector3FillXYKeepAspectRatio, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector3ShrinkInsideKeepAspectRatio", UtcDaliVector3ShrinkInsideKeepAspectRatio, utc_dali_vector3_startup, utc_dali_vector3_cleanup},
+ {"UtcDaliVector4Vector4", UtcDaliVector4Vector4, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4Add", UtcDaliVector4Add, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4Constants", UtcDaliVector4Constants, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4Cross", UtcDaliVector4Cross, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4Dot", UtcDaliVector4Dot, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4DotVector3", UtcDaliVector4DotVector3, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4Dot4", UtcDaliVector4Dot4, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4Equals", UtcDaliVector4Equals, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4Length", UtcDaliVector4Length, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4LengthSquared", UtcDaliVector4LengthSquared, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4Max", UtcDaliVector4Max, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4Min", UtcDaliVector4Min, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4Clamp", UtcDaliVector4Clamp, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4ClampVector4", UtcDaliVector4ClampVector4, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4Multiply", UtcDaliVector4Multiply, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4Divide", UtcDaliVector4Divide, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4Scale", UtcDaliVector4Scale, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4Normalize", UtcDaliVector4Normalize, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4Subtract", UtcDaliVector4Subtract, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4OperatorSubscript", UtcDaliVector4OperatorSubscript, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4OStreamOperator", UtcDaliVector4OStreamOperator, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {"UtcDaliVector4AsFloat", UtcDaliVector4AsFloat, utc_dali_vector4_startup, utc_dali_vector4_cleanup},
+ {NULL, NULL}
+};
+
+#endif // __TCT_DALI_CORE_H__
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_active_constraint_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_active_constraint_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+static const Vector3 TEST_CONSTRAINT_TARGET = Vector3( 10.0f, 10.0f, 10.0f );
+
+struct TestConstraintVector3
+{
+ Vector3 operator()( const Vector3& current )
+ {
+ return TEST_CONSTRAINT_TARGET;
+ }
+};
+
+static bool constraintSignalled=false;
+static void ConstraintCallback( ActiveConstraint& constraint )
+{
+ constraintSignalled = true;
+}
+
+} // anon namespace
+
+int UtcDaliConstraintGetTargetObject(void)
+{
+ TestApplication application;
+
+ // Apply a constraint to an actor
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SIZE, TestConstraintVector3() );
+
+ Actor actor = Actor::New();
+
+ ActiveConstraint active = actor.ApplyConstraint( constraint );
+
+ // Retrieve the actor back from the active-constraint
+
+ Handle object = active.GetTargetObject();
+
+ DALI_TEST_CHECK( object );
+
+ DALI_TEST_CHECK( object.GetObjectPtr() == actor.GetObjectPtr() );
+
+ // Throw-away the actor, and check GetTargetObject returns NULL
+
+ object.Reset();
+ actor.Reset();
+
+ object = active.GetTargetObject();
+
+ DALI_TEST_CHECK( !object );
+ END_TEST;
+}
+
+int UtcDaliConstraintGetTargetProperty(void)
+{
+ TestApplication application;
+
+ // Apply a constraint to an actor
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SIZE, TestConstraintVector3() );
+
+ Actor actor = Actor::New();
+
+ ActiveConstraint active = actor.ApplyConstraint( constraint );
+
+ // Check the property index
+
+ Property::Index index = active.GetTargetProperty();
+
+ DALI_TEST_CHECK( Actor::SIZE == index );
+ END_TEST;
+}
+
+int UtcDaliConstraintSetWeight(void)
+{
+ TestApplication application;
+
+ // Apply a constraint to an actor
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SIZE, TestConstraintVector3() );
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add( actor );
+
+ ActiveConstraint active = actor.ApplyConstraint( constraint );
+
+ // Apply the constraint manually
+
+ active.SetWeight( 0.0f ); // start at zero
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(1000.0f)); // 1 elapsed second
+
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ float weight( 0.25f );
+ active.SetWeight( weight );
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(1000.0f)); // 1 elapsed second
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), TEST_CONSTRAINT_TARGET * weight, TEST_LOCATION );
+
+ weight = 0.5f;
+ active.SetWeight( weight );
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(1000.0f)); // 2 elapsed seconds
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), TEST_CONSTRAINT_TARGET * weight, TEST_LOCATION );
+
+ weight = 0.75f;
+ active.SetWeight( weight );
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(1000.0f)); // 2 elapsed seconds
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), TEST_CONSTRAINT_TARGET * weight, TEST_LOCATION );
+
+ weight = 1.0f;
+ active.SetWeight( weight );
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(1000.0f)); // 2 elapsed seconds
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), TEST_CONSTRAINT_TARGET, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintGetCurrentWeight(void)
+{
+ TestApplication application;
+
+ // Apply a constraint to an actor
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SIZE, TestConstraintVector3() );
+
+ Actor actor = Actor::New();
+
+ ActiveConstraint active = actor.ApplyConstraint( constraint );
+
+ // Check default weight
+
+ DALI_TEST_CHECK( ActiveConstraint::DEFAULT_WEIGHT == active.GetCurrentWeight() );
+ END_TEST;
+}
+
+int UtcDaliConstraintSignalApplied(void)
+{
+ TestApplication application;
+
+ // Apply a constraint to an actor
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SIZE, TestConstraintVector3() );
+
+ float duration( 10.0f );
+ constraint.SetApplyTime( duration );
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add( actor );
+
+ ActiveConstraint active = actor.ApplyConstraint( constraint );
+
+ // Check signal is received after duration
+
+ bool constraintCheck( false );
+ ConstraintAppliedCheck appliedCheck( constraintCheck );
+
+ active.AppliedSignal().Connect( &application, appliedCheck );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(1000.0f)); // 1 elapsed second
+
+ // Check signal has not fired
+ application.SendNotification();
+ appliedCheck.CheckSignalNotReceived();
+
+ application.Render(static_cast<unsigned int>(4000.0f)); // 5 elapsed seconds
+
+ // Check signal has not fired
+ application.SendNotification();
+ appliedCheck.CheckSignalNotReceived();
+
+ application.Render(static_cast<unsigned int>(5000.0f - 1.0f)); // <10 elapsed seconds
+
+ // Check signal has not fired
+ application.SendNotification();
+ appliedCheck.CheckSignalNotReceived();
+
+ application.Render(static_cast<unsigned int>(2.0f)); // >10 elapsed seconds
+
+ // Signal should have fired
+ application.SendNotification();
+ appliedCheck.CheckSignalReceived();
+ END_TEST;
+}
+
+int UtcDaliConstraintRemove(void)
+{
+ TestApplication application;
+
+ // Apply a constraint to an actor
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SIZE, TestConstraintVector3() );
+
+ float duration( 1.0f );
+ constraint.SetApplyTime( duration );
+
+ Actor actor = Actor::New();
+ const Vector3 startSize( 1, 2, 3 );
+ actor.SetSize( startSize );
+ Stage::GetCurrent().Add( actor );
+
+ ActiveConstraint active = actor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(0.0f)); // 0 elapsed seconds
+
+ DALI_TEST_CHECK( 0 == active.GetCurrentWeight() );
+ DALI_TEST_CHECK( startSize == actor.GetCurrentSize() );
+
+ bool constraintCheck( false );
+ ConstraintAppliedCheck appliedCheck( constraintCheck );
+
+ active.AppliedSignal().Connect( &application, appliedCheck );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(2000.0f)); // 2 elapsed seconds
+
+ application.SendNotification();
+ appliedCheck.CheckSignalReceived();
+
+ DALI_TEST_CHECK( ActiveConstraint::DEFAULT_WEIGHT == active.GetCurrentWeight() );
+ DALI_TEST_CHECK( TEST_CONSTRAINT_TARGET == actor.GetCurrentSize() );
+
+ // This should be NOOP while constraint is applied
+ actor.SetSize( startSize );
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(1000.0f));
+ DALI_TEST_CHECK( ActiveConstraint::DEFAULT_WEIGHT == active.GetCurrentWeight() );
+ DALI_TEST_CHECK( TEST_CONSTRAINT_TARGET == actor.GetCurrentSize() );
+
+ // Remove constraint & try again
+ actor.RemoveConstraint( active );
+ actor.SetSize( startSize );
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(1000.0f));
+ DALI_TEST_CHECK( ActiveConstraint::DEFAULT_WEIGHT == active.GetCurrentWeight() );
+ DALI_TEST_CHECK( startSize == actor.GetCurrentSize() );
+
+ // Try setting the weight after removal
+ active.SetProperty( ActiveConstraint::WEIGHT, 0.5f );
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(1000.0f));
+ DALI_TEST_CHECK( 0.5f == active.GetCurrentWeight() );
+
+ // Quick check for operator = override on constrainables (needs rhs as a Handle!!) and destructor from heap
+ Constrainable* constrainable = new Constrainable;
+ Constrainable constrainable2;
+ Handle& handle = dynamic_cast< Handle& > ( *constrainable );
+ constrainable2 = handle;
+ delete constrainable;
+ END_TEST;
+}
+
+int UtcDaliConstraintCallback(void)
+{
+ TestApplication application;
+ Constraint constraint = Constraint::New<Vector3>( Actor::SIZE, TestConstraintVector3() );
+ constraint.SetApplyTime(2.0f);
+ Actor actor = Actor::New();
+ ActiveConstraint active = actor.ApplyConstraint( constraint );
+ active.AppliedSignal().Connect( ConstraintCallback );
+ application.SendNotification();
+ application.Render(0);
+ application.Render(1000);
+ application.SendNotification();
+ DALI_TEST_CHECK( ! constraintSignalled );
+ application.Render(1016);
+ application.SendNotification();
+
+ DALI_TEST_CHECK( constraintSignalled );
+ END_TEST;
+}
+
+int UtcDaliConstraintProperties(void)
+{
+ TestApplication application;
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SIZE, TestConstraintVector3() );
+ Actor actor = Actor::New();
+ ActiveConstraint active = actor.ApplyConstraint( constraint );
+
+ Property::IndexContainer indices;
+ active.GetPropertyIndices( indices );
+ DALI_TEST_CHECK( ! indices.empty() );
+ DALI_TEST_EQUALS( indices.size(), active.GetPropertyCount(), TEST_LOCATION );
+
+ // Valid property
+ DALI_TEST_EQUALS( active.GetPropertyName( 0 ), "weight", TEST_LOCATION );
+ DALI_TEST_EQUALS( active.GetPropertyIndex( "weight" ), 0, TEST_LOCATION );
+ DALI_TEST_CHECK( active.IsPropertyWritable( 0 ) );
+ DALI_TEST_CHECK( active.IsPropertyAnimatable( 0 ) );
+ DALI_TEST_EQUALS( active.GetPropertyType( 0 ), Property::FLOAT, TEST_LOCATION );
+ DALI_TEST_CHECK( active.GetCurrentWeight() != 21312.0f );
+ active.SetProperty( 0, 21312.0f );
+ DALI_TEST_EQUALS( active.GetCurrentWeight(), 21312.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( active.GetProperty< float >( 0 ), 21312.0f, TEST_LOCATION );
+
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "assert.h"
+#include <dali/dali.h>
+#include <string>
+#include <dali/integration-api/events/touch-event-integ.h>
+#include <dali-test-suite-utils.h>
+
+//& set: DaliActor
+
+using std::string;
+using namespace Dali;
+
+
+void utc_dali_actor_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_actor_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+const char* vertexSource =
+"void main()\n"
+"{\n"
+" gl_Position = uProjection * uModelView * vec4(aPosition, 1.0);\n"
+" vTexCoord = aTexCoord;\n"
+"}\n";
+
+const char* fragmentSource =
+"void main()\n"
+"{\n"
+" gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n"
+"}\n";
+
+bool gTouchCallBackCalled=false;
+bool gTouchCallBack2Called=false;
+
+/**
+ * Simulates a Down Touch at 25.0, 25.0.
+ * @param[in] app Test Application instance.
+ */
+int SimulateTouchForSetOverlayHitTest(TestApplication& app)
+{
+ app.SendNotification();
+ app.Render(1);
+ app.SendNotification();
+ app.Render(1);
+
+ gTouchCallBackCalled = false;
+ gTouchCallBack2Called = false;
+
+ // simulate a touch event
+ Dali::TouchPoint point( 0, TouchPoint::Down, 25.0f, 25.0f );
+ Dali::Integration::TouchEvent event;
+ event.AddPoint( point );
+ app.ProcessEvent( event );
+
+ app.SendNotification();
+ app.Render(1);
+ app.SendNotification();
+ app.Render(1);
+ END_TEST;
+}
+
+
+static bool gTestConstraintCalled;
+
+struct TestConstraint
+{
+ Vector4 operator()(const Vector4& color)
+ {
+ gTestConstraintCalled = true;
+ return Vector4(color.x, color.y, color.z, 0.1f);
+ }
+};
+
+/**
+ * TestConstraint reference.
+ * When constraint is called, the resultRef is updated
+ * with the value supplied.
+ */
+template<typename T>
+struct TestConstraintRef
+{
+ TestConstraintRef(unsigned int& resultRef, unsigned int value)
+ : mResultRef(resultRef),
+ mValue(value)
+ {
+ }
+
+ T operator()(const T& current)
+ {
+ mResultRef = mValue;
+ return current;
+ }
+
+ unsigned int& mResultRef;
+ unsigned int mValue;
+};
+
+bool wasConstraintCallbackCalled1 = false;
+void TestConstraintCallback1( ActiveConstraint& constraint )
+{
+ wasConstraintCallbackCalled1 = true;
+}
+
+bool wasConstraintCallbackCalled2 = false;
+void TestConstraintCallback2( ActiveConstraint& constraint )
+{
+ wasConstraintCallbackCalled2 = true;
+}
+
+bool wasConstraintCallbackCalled3 = false;
+void TestConstraintCallback3( ActiveConstraint& constraint )
+{
+ wasConstraintCallbackCalled3 = true;
+}
+
+static bool TestCallback(Actor actor, const TouchEvent& event)
+{
+ gTouchCallBackCalled = true;
+ return false;
+ END_TEST;
+}
+
+static bool TestCallback2(Actor actor, const TouchEvent& event)
+{
+ gTouchCallBack2Called = true;
+ return false;
+ END_TEST;
+}
+
+static Vector3 gSetSize;
+static bool gSetSizeCallBackCalled;
+void SetSizeCallback( Actor actor, const Vector3& size )
+{
+ gSetSizeCallBackCalled = true;
+ gSetSize = size;
+}
+// validation stuff for onstage & offstage signals
+static std::vector< std::string > gActorNamesOnOffStage;
+static int gOnStageCallBackCalled;
+void OnStageCallback( Actor actor )
+{
+ ++gOnStageCallBackCalled;
+ gActorNamesOnOffStage.push_back( actor.GetName() );
+ DALI_TEST_CHECK( actor.OnStage() == true );
+}
+static int gOffStageCallBackCalled;
+void OffStageCallback( Actor actor )
+{
+ ++gOffStageCallBackCalled;
+ gActorNamesOnOffStage.push_back( actor.GetName() );
+ DALI_TEST_CHECK( actor.OnStage() == false );
+}
+
+struct PositionComponentConstraint
+{
+ PositionComponentConstraint(){}
+
+ Vector3 operator()(const Vector3& current, const PropertyInput& property)
+ {
+ const Matrix& m = property.GetMatrix();
+ Vector3 pos;
+ Vector3 scale;
+ Quaternion rot;
+ m.GetTransformComponents(pos, rot, scale);
+ return pos;
+ }
+};
+
+
+
+} // anonymous namespace
+
+
+//& purpose: Testing New API
+int UtcDaliActorNew(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ DALI_TEST_CHECK(actor);
+ END_TEST;
+}
+
+//& purpose: Testing Dali::Actor::DownCast()
+int UtcDaliActorDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Actor::DownCast()");
+
+ Actor actor = Actor::New();
+ BaseHandle object(actor);
+ Actor actor2 = Actor::DownCast(object);
+ DALI_TEST_CHECK(actor2);
+ END_TEST;
+}
+
+//& purpose: Testing Dali::Actor::DownCast()
+int UtcDaliActorDownCast2(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Actor::DownCast()");
+
+ BaseHandle unInitializedObject;
+ Actor actor = Actor::DownCast(unInitializedObject);
+ DALI_TEST_CHECK(!actor);
+ END_TEST;
+}
+
+//& purpose: Testing Dali::Actor::GetName()
+int UtcDaliActorGetName(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ DALI_TEST_CHECK(actor.GetName().empty());
+ END_TEST;
+}
+
+//& purpose: Testing Dali::Actor::SetName()
+int UtcDaliActorSetName(void)
+{
+ TestApplication application;
+
+ string str("ActorName");
+ Actor actor = Actor::New();
+
+ actor.SetName(str);
+ DALI_TEST_CHECK(actor.GetName() == str);
+ END_TEST;
+}
+
+int UtcDaliActorGetId(void)
+{
+ tet_infoline("Testing Dali::Actor::UtcDaliActorGetId()");
+ TestApplication application;
+
+ Actor first = Actor::New();
+ Actor second = Actor::New();
+ Actor third = Actor::New();
+
+ DALI_TEST_CHECK(first.GetId() != second.GetId());
+ DALI_TEST_CHECK(second.GetId() != third.GetId());
+ END_TEST;
+}
+
+int UtcDaliActorIsRoot(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ DALI_TEST_CHECK(!actor.IsRoot());
+
+ // get the root layer
+ actor = Stage::GetCurrent().GetLayer( 0 );
+ DALI_TEST_CHECK( actor.IsRoot() );
+ END_TEST;
+}
+
+int UtcDaliActorOnStage(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ DALI_TEST_CHECK( !actor.OnStage() );
+
+ // get the root layer
+ actor = Stage::GetCurrent().GetLayer( 0 );
+ DALI_TEST_CHECK( actor.OnStage() );
+ END_TEST;
+}
+
+int UtcDaliActorIsLayer(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ DALI_TEST_CHECK( !actor.IsLayer() );
+
+ // get the root layer
+ actor = Stage::GetCurrent().GetLayer( 0 );
+ DALI_TEST_CHECK( actor.IsLayer() );
+ END_TEST;
+}
+
+int UtcDaliActorGetLayer(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ Layer layer = actor.GetLayer();
+
+ DALI_TEST_CHECK(layer);
+
+ // get the root layers layer
+ actor = Stage::GetCurrent().GetLayer( 0 );
+ DALI_TEST_CHECK( actor.GetLayer() );
+ END_TEST;
+}
+
+int UtcDaliActorAdd(void)
+{
+ tet_infoline("Testing Actor::Add");
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Actor child = Actor::New();
+
+ DALI_TEST_EQUALS( parent.GetChildCount(), 0u, TEST_LOCATION );
+
+ parent.Add(child);
+
+ DALI_TEST_EQUALS( parent.GetChildCount(), 1u, TEST_LOCATION );
+
+ Actor parent2 = Actor::New();
+ parent2.Add( child );
+
+ DALI_TEST_EQUALS( parent.GetChildCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( parent2.GetChildCount(), 1u, TEST_LOCATION );
+
+ // try Adding to same parent again, works
+ parent2.Add( child );
+ DALI_TEST_EQUALS( parent2.GetChildCount(), 1u, TEST_LOCATION );
+
+ // try reparenting an orphaned child
+ {
+ Actor temporaryParent = Actor::New();
+ temporaryParent.Add( child );
+ DALI_TEST_EQUALS( parent2.GetChildCount(), 0u, TEST_LOCATION );
+ }
+ // temporaryParent has now died, reparent the orphaned child
+ parent2.Add( child );
+ DALI_TEST_EQUALS( parent2.GetChildCount(), 1u, TEST_LOCATION );
+
+ // try illegal Add
+ try
+ {
+ parent2.Add( parent2 );
+ tet_printf("Assertion test failed - no Exception\n" );
+ tet_result(TET_FAIL);
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "this != &child", TEST_LOCATION);
+ DALI_TEST_EQUALS( parent2.GetChildCount(), 1u, TEST_LOCATION );
+ }
+ catch(...)
+ {
+ tet_printf("Assertion test failed - wrong Exception\n" );
+ tet_result(TET_FAIL);
+ }
+
+ // try reparenting root
+ try
+ {
+ parent2.Add( Stage::GetCurrent().GetLayer( 0 ) );
+ tet_printf("Assertion test failed - no Exception\n" );
+ tet_result(TET_FAIL);
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "!child.IsRoot()", TEST_LOCATION);
+ DALI_TEST_EQUALS( parent2.GetChildCount(), 1u, TEST_LOCATION );
+ }
+ catch(...)
+ {
+ tet_printf("Assertion test failed - wrong Exception\n" );
+ tet_result(TET_FAIL);
+ }
+
+ // try Add empty
+ try
+ {
+ Actor empty;
+ parent2.Add( empty );
+ tet_printf("Assertion test failed - no Exception\n" );
+ tet_result(TET_FAIL);
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "actor", TEST_LOCATION);
+ DALI_TEST_EQUALS( parent2.GetChildCount(), 1u, TEST_LOCATION );
+ }
+ catch(...)
+ {
+ tet_printf("Assertion test failed - wrong Exception\n" );
+ tet_result(TET_FAIL);
+ }
+ END_TEST;
+}
+
+int UtcDaliActorRemove01(void)
+{
+ tet_infoline("Testing Actor::Remove");
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Actor child = Actor::New();
+ DALI_TEST_EQUALS( parent.GetChildCount(), 0u, TEST_LOCATION );
+
+ parent.Add(child);
+ DALI_TEST_EQUALS( parent.GetChildCount(), 1u, TEST_LOCATION );
+
+ parent.Remove(child);
+ DALI_TEST_EQUALS( parent.GetChildCount(), 0u, TEST_LOCATION );
+
+ // remove again, no problem
+ parent.Remove(child);
+ DALI_TEST_EQUALS( parent.GetChildCount(), 0u, TEST_LOCATION );
+
+ // add child back
+ parent.Add(child);
+ // try illegal Remove
+ try
+ {
+ parent.Remove( parent );
+ tet_printf("Assertion test failed - no Exception\n" );
+ tet_result(TET_FAIL);
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "this != &child", TEST_LOCATION);
+ DALI_TEST_EQUALS( parent.GetChildCount(), 1u, TEST_LOCATION );
+ }
+ catch(...)
+ {
+ tet_printf("Assertion test failed - wrong Exception\n" );
+ tet_result(TET_FAIL);
+ }
+
+ // try Remove empty
+ try
+ {
+ Actor empty;
+ parent.Remove( empty );
+ tet_printf("Assertion test failed - no Exception\n" );
+ tet_result(TET_FAIL);
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "actor", TEST_LOCATION);
+ DALI_TEST_EQUALS( parent.GetChildCount(), 1u, TEST_LOCATION );
+ }
+ catch(...)
+ {
+ tet_printf("Assertion test failed - wrong Exception\n" );
+ tet_result(TET_FAIL);
+ }
+ END_TEST;
+}
+
+int UtcDaliActorRemove02(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Actor child = Actor::New();
+ Actor random = Actor::New();
+
+ Stage::GetCurrent().Add( parent );
+
+ DALI_TEST_CHECK(parent.GetChildCount() == 0);
+
+ parent.Add(child);
+
+ DALI_TEST_CHECK(parent.GetChildCount() == 1);
+
+ parent.Remove(random);
+
+ DALI_TEST_CHECK(parent.GetChildCount() == 1);
+
+ Stage::GetCurrent().Remove( parent );
+
+ DALI_TEST_CHECK(parent.GetChildCount() == 1);
+ END_TEST;
+}
+
+int UtcDaliActorGetChildCount(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Actor child = Actor::New();
+
+ DALI_TEST_CHECK(parent.GetChildCount() == 0);
+
+ parent.Add(child);
+
+ DALI_TEST_CHECK(parent.GetChildCount() == 1);
+ END_TEST;
+}
+
+int UtcDaliActorGetChildren01(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Actor first = Actor::New();
+ Actor second = Actor::New();
+ Actor third = Actor::New();
+
+ parent.Add(first);
+ parent.Add(second);
+ parent.Add(third);
+
+ DALI_TEST_CHECK(parent.GetChildAt(0) == first);
+ DALI_TEST_CHECK(parent.GetChildAt(1) == second);
+ DALI_TEST_CHECK(parent.GetChildAt(2) == third);
+ END_TEST;
+}
+
+int UtcDaliActorGetChildren02(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Actor first = Actor::New();
+ Actor second = Actor::New();
+ Actor third = Actor::New();
+
+ parent.Add(first);
+ parent.Add(second);
+ parent.Add(third);
+
+ const Actor& constParent = parent;
+
+ DALI_TEST_CHECK(constParent.GetChildAt(0) == first);
+ DALI_TEST_CHECK(constParent.GetChildAt(1) == second);
+ DALI_TEST_CHECK(constParent.GetChildAt(2) == third);
+ END_TEST;
+}
+
+int UtcDaliActorGetParent01(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Actor child = Actor::New();
+
+ parent.Add(child);
+
+ DALI_TEST_CHECK(child.GetParent() == parent);
+ END_TEST;
+}
+
+int UtcDaliActorGetParent02(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ DALI_TEST_CHECK(!actor.GetParent());
+ END_TEST;
+}
+
+int UtcDaliActorSetParentOrigin(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ Vector3 vector(0.7f, 0.8f, 0.9f);
+ DALI_TEST_CHECK(vector != actor.GetCurrentParentOrigin());
+
+ actor.SetParentOrigin(vector);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector == actor.GetCurrentParentOrigin());
+
+ Stage::GetCurrent().Add( actor );
+
+ actor.SetParentOrigin( Vector3( 0.1f, 0.2f, 0.3f ) );
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( Vector3( 0.1f, 0.2f, 0.3f ), actor.GetCurrentParentOrigin(), TEST_LOCATION );
+
+ Stage::GetCurrent().Remove( actor );
+ END_TEST;
+}
+
+int UtcDaliActorGetCurrentParentOrigin(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ Vector3 vector(0.7f, 0.8f, 0.9f);
+ DALI_TEST_CHECK(vector != actor.GetCurrentParentOrigin());
+
+ actor.SetParentOrigin(vector);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector == actor.GetCurrentParentOrigin());
+ END_TEST;
+}
+
+int UtcDaliActorSetAnchorPoint(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ Vector3 vector(0.7f, 0.8f, 0.9f);
+ DALI_TEST_CHECK(vector != actor.GetCurrentAnchorPoint());
+
+ actor.SetAnchorPoint(vector);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector == actor.GetCurrentAnchorPoint());
+
+ Stage::GetCurrent().Add( actor );
+
+ actor.SetAnchorPoint( Vector3( 0.1f, 0.2f, 0.3f ) );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( Vector3( 0.1f, 0.2f, 0.3f ), actor.GetCurrentAnchorPoint(), TEST_LOCATION );
+
+ Stage::GetCurrent().Remove( actor );
+ END_TEST;
+}
+
+int UtcDaliActorGetCurrentAnchorPoint(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ Vector3 vector(0.7f, 0.8f, 0.9f);
+ DALI_TEST_CHECK(vector != actor.GetCurrentAnchorPoint());
+
+ actor.SetAnchorPoint(vector);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector == actor.GetCurrentAnchorPoint());
+ END_TEST;
+}
+
+// SetSize(float width, float height)
+int UtcDaliActorSetSize01(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 vector(100.0f, 100.0f, 100.0f);
+
+ DALI_TEST_CHECK(vector != actor.GetCurrentSize());
+
+ actor.SetSize(vector.x, vector.y);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector == actor.GetCurrentSize());
+ END_TEST;
+}
+
+// SetSize(float width, float height, float depth)
+int UtcDaliActorSetSize02(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 vector(100.0f, 100.0f, 100.0f);
+
+ DALI_TEST_CHECK(vector != actor.GetCurrentSize());
+
+ actor.SetSize(vector.x, vector.y, vector.z);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector == actor.GetCurrentSize());
+ END_TEST;
+}
+
+// SetSize(Vector2 size)
+int UtcDaliActorSetSize03(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 vector(100.0f, 100.0f, 100.0f);
+
+ DALI_TEST_CHECK(vector != actor.GetCurrentSize());
+
+ actor.SetSize(Vector2(vector.x, vector.y));
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector == actor.GetCurrentSize());
+ END_TEST;
+}
+
+// SetSize(Vector3 size)
+int UtcDaliActorSetSize04(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 vector(100.0f, 100.0f, 100.0f);
+
+ DALI_TEST_CHECK(vector != actor.GetCurrentSize());
+
+ actor.SetSize(vector);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector == actor.GetCurrentSize());
+
+ Stage::GetCurrent().Add( actor );
+ actor.SetSize( Vector3( 0.1f, 0.2f, 0.3f ) );
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( Vector3( 0.1f, 0.2f, 0.3f ), actor.GetCurrentSize(), TEST_LOCATION );
+ Stage::GetCurrent().Remove( actor );
+ END_TEST;
+}
+
+int UtcDaliActorGetCurrentSize(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 vector(100.0f, 100.0f, 20.0f);
+
+ DALI_TEST_CHECK(vector != actor.GetCurrentSize());
+
+ actor.SetSize(vector);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector == actor.GetCurrentSize());
+ END_TEST;
+}
+
+// SetPosition(float x, float y)
+int UtcDaliActorSetPosition01(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Set to random to start off with
+ actor.SetPosition(Vector3(120.0f, 120.0f, 0.0f));
+
+ Vector3 vector(100.0f, 100.0f, 0.0f);
+
+ DALI_TEST_CHECK(vector != actor.GetCurrentPosition());
+
+ actor.SetPosition(vector.x, vector.y);
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_CHECK(vector == actor.GetCurrentPosition());
+
+ Stage::GetCurrent().Add( actor );
+ actor.SetPosition( Vector3( 0.1f, 0.2f, 0.3f ) );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( Vector3( 0.1f, 0.2f, 0.3f ), actor.GetCurrentPosition(), TEST_LOCATION );
+
+ actor.SetX( 1.0f );
+ actor.SetY( 1.1f );
+ actor.SetZ( 1.2f );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( Vector3( 1.0f, 1.1f, 1.2f ), actor.GetCurrentPosition(), TEST_LOCATION );
+
+ actor.MoveBy( Vector3( 0.1f, 0.1f, 0.1f ) );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( Vector3( 1.1f, 1.2f, 1.3f ), actor.GetCurrentPosition(), Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+
+ Stage::GetCurrent().Remove( actor );
+ END_TEST;
+}
+
+// SetPosition(float x, float y, float z)
+int UtcDaliActorSetPosition02(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Set to random to start off with
+ actor.SetPosition(Vector3(120.0f, 120.0f, 120.0f));
+
+ Vector3 vector(100.0f, 100.0f, 100.0f);
+
+ DALI_TEST_CHECK(vector != actor.GetCurrentPosition());
+
+ actor.SetPosition(vector.x, vector.y, vector.z);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector == actor.GetCurrentPosition());
+ END_TEST;
+}
+
+// SetPosition(Vector3 position)
+int UtcDaliActorSetPosition03(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Set to random to start off with
+ actor.SetPosition(Vector3(120.0f, 120.0f, 120.0f));
+
+ Vector3 vector(100.0f, 100.0f, 100.0f);
+
+ DALI_TEST_CHECK(vector != actor.GetCurrentPosition());
+
+ actor.SetPosition(vector);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector == actor.GetCurrentPosition());
+ END_TEST;
+}
+
+int UtcDaliActorSetX(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ Vector3 vector(100.0f, 0.0f, 0.0f);
+
+ DALI_TEST_CHECK(vector != actor.GetCurrentPosition());
+
+ actor.SetX(100.0f);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector == actor.GetCurrentPosition());
+ END_TEST;
+}
+
+int UtcDaliActorSetY(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ Vector3 vector(0.0f, 100.0f, 0.0f);
+
+ DALI_TEST_CHECK(vector != actor.GetCurrentPosition());
+
+ actor.SetY(100.0f);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector == actor.GetCurrentPosition());
+ END_TEST;
+}
+
+int UtcDaliActorSetZ(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ Vector3 vector(0.0f, 0.0f, 100.0f);
+
+ DALI_TEST_CHECK(vector != actor.GetCurrentPosition());
+
+ actor.SetZ(100.0f);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector == actor.GetCurrentPosition());
+ END_TEST;
+}
+
+int UtcDaliActorMoveBy(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 vector(100.0f, 100.0f, 100.0f);
+
+ DALI_TEST_CHECK(vector != actor.GetCurrentPosition());
+
+ actor.SetPosition(vector);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector == actor.GetCurrentPosition());
+
+ actor.MoveBy(vector);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector*2.0f == actor.GetCurrentPosition());
+ END_TEST;
+}
+
+int UtcDaliActorGetCurrentPosition(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 setVector(100.0f, 100.0f, 0.0f);
+ actor.SetPosition(setVector);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(actor.GetCurrentPosition() == setVector);
+ END_TEST;
+}
+
+int UtcDaliActorGetCurrentWorldPosition(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentPosition( 1.0f, 2.0f, 3.0f );
+ parent.SetPosition( parentPosition );
+ parent.SetParentOrigin( ParentOrigin::CENTER );
+ parent.SetAnchorPoint( AnchorPoint::CENTER );
+ Stage::GetCurrent().Add( parent );
+
+ Actor child = Actor::New();
+ child.SetParentOrigin( ParentOrigin::CENTER );
+ child.SetAnchorPoint( AnchorPoint::CENTER );
+ Vector3 childPosition( 6.0f, 6.0f, 6.0f );
+ child.SetPosition( childPosition );
+ parent.Add( child );
+
+ // The actors should not have a world position yet
+ DALI_TEST_EQUALS( parent.GetCurrentWorldPosition(), Vector3::ZERO, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldPosition(), Vector3::ZERO, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( parent.GetCurrentPosition(), parentPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentPosition(), childPosition, TEST_LOCATION );
+
+ // The actors should have a world position now
+ DALI_TEST_EQUALS( parent.GetCurrentWorldPosition(), parentPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldPosition(), parentPosition + childPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliActorInheritPosition(void)
+{
+ tet_infoline("Testing Actor::SetPositionInheritanceMode");
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentPosition( 1.0f, 2.0f, 3.0f );
+ parent.SetPosition( parentPosition );
+ parent.SetParentOrigin( ParentOrigin::CENTER );
+ parent.SetAnchorPoint( AnchorPoint::CENTER );
+ Stage::GetCurrent().Add( parent );
+
+ Actor child = Actor::New();
+ child.SetParentOrigin( ParentOrigin::CENTER );
+ child.SetAnchorPoint( AnchorPoint::CENTER );
+ Vector3 childPosition( 10.0f, 11.0f, 12.0f );
+ child.SetPosition( childPosition );
+ parent.Add( child );
+
+ // The actors should not have a world position yet
+ DALI_TEST_EQUALS( parent.GetCurrentWorldPosition(), Vector3::ZERO, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldPosition(), Vector3::ZERO, TEST_LOCATION );
+
+ // first test default, which is INHERIT_PARENT_POSITION
+ DALI_TEST_EQUALS( child.GetPositionInheritanceMode(), Dali::INHERIT_PARENT_POSITION, TEST_LOCATION );
+ application.SendNotification();
+ application.Render(0); // should only really call Update as Render is not required to update scene
+ DALI_TEST_EQUALS( parent.GetCurrentPosition(), parentPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentPosition(), childPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( parent.GetCurrentWorldPosition(), parentPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldPosition(), parentPosition + childPosition, TEST_LOCATION );
+
+ // Change inheritance mode to use parent
+ child.SetPositionInheritanceMode( Dali::USE_PARENT_POSITION );
+ DALI_TEST_EQUALS( child.GetPositionInheritanceMode(), Dali::USE_PARENT_POSITION, TEST_LOCATION );
+ application.SendNotification();
+ application.Render(0); // should only really call Update as Render is not required to update scene
+ DALI_TEST_EQUALS( parent.GetCurrentPosition(), parentPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentPosition(), childPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( parent.GetCurrentWorldPosition(), parentPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldPosition(), parentPosition, TEST_LOCATION );
+
+ // Change inheritance mode to use parent + offset
+ child.SetPositionInheritanceMode( Dali::USE_PARENT_POSITION_PLUS_LOCAL_POSITION );
+ Vector3 childOffset( -1.0f, 1.0f, 0.0f );
+ child.SetPosition( childOffset );
+ DALI_TEST_EQUALS( child.GetPositionInheritanceMode(), Dali::USE_PARENT_POSITION_PLUS_LOCAL_POSITION, TEST_LOCATION );
+ application.SendNotification();
+ application.Render(0); // should only really call Update as Render is not required to update scene
+ DALI_TEST_EQUALS( parent.GetCurrentPosition(), parentPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentPosition(), childOffset, TEST_LOCATION );
+ DALI_TEST_EQUALS( parent.GetCurrentWorldPosition(), parentPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldPosition(), parentPosition + childOffset, TEST_LOCATION );
+
+ // Change inheritance mode to not inherit
+ child.SetPositionInheritanceMode( Dali::DONT_INHERIT_POSITION );
+ DALI_TEST_EQUALS( child.GetPositionInheritanceMode(), Dali::DONT_INHERIT_POSITION, TEST_LOCATION );
+ application.SendNotification();
+ application.Render(0); // should only really call Update as Render is not required to update scene
+ DALI_TEST_EQUALS( parent.GetCurrentPosition(), parentPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentPosition(), childOffset, TEST_LOCATION );
+ DALI_TEST_EQUALS( parent.GetCurrentWorldPosition(), parentPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldPosition(), childOffset, TEST_LOCATION );
+ END_TEST;
+}
+
+// SetRotation(float angleRadians, Vector3 axis)
+int UtcDaliActorSetRotation01(void)
+{
+ TestApplication application;
+
+ Quaternion rotation(0.785f, Vector3(1.0f, 1.0f, 0.0f));
+ Actor actor = Actor::New();
+
+ actor.SetRotation(rotation);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(rotation, actor.GetCurrentRotation(), 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliActorSetRotation02(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ float angle = 0.785f;
+ Vector3 axis(1.0f, 1.0f, 0.0f);
+
+ actor.SetRotation(Radian( angle ), axis);
+ Quaternion rotation( angle, axis );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(rotation, actor.GetCurrentRotation(), 0.001, TEST_LOCATION);
+
+ Stage::GetCurrent().Add( actor );
+ actor.RotateBy( Degree( 360 ), axis);
+ DALI_TEST_EQUALS(rotation, actor.GetCurrentRotation(), 0.001, TEST_LOCATION);
+
+ actor.SetRotation( Degree( 0 ), Vector3( 1.0f, 0.0f, 0.0f ) );
+ Quaternion result( 0, Vector3( 1.0f, 0.0f, 0.0f ) );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( result, actor.GetCurrentRotation(), 0.001, TEST_LOCATION);
+
+ actor.SetRotation(Radian( angle ), axis);
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(rotation, actor.GetCurrentRotation(), 0.001, TEST_LOCATION);
+
+ Stage::GetCurrent().Remove( actor );
+ END_TEST;
+}
+
+// RotateBy(float angleRadians, Vector3 axis)
+int UtcDaliActorRotateBy01(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ float angle = M_PI * 0.25f;
+ actor.RotateBy(Radian( angle ), Vector3::ZAXIS);
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(Quaternion(M_PI*0.25f, Vector3::ZAXIS), actor.GetCurrentRotation(), 0.001, TEST_LOCATION);
+
+ Stage::GetCurrent().Add( actor );
+
+ actor.RotateBy(Radian( angle ), Vector3::ZAXIS);
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(Quaternion(M_PI*0.5f, Vector3::ZAXIS), actor.GetCurrentRotation(), 0.001, TEST_LOCATION);
+
+ Stage::GetCurrent().Remove( actor );
+ END_TEST;
+}
+
+// RotateBy(Quaternion relativeRotation)
+int UtcDaliActorRotateBy02(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ Quaternion rotation(M_PI*0.25f, Vector3::ZAXIS);
+ actor.RotateBy(rotation);
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(rotation, actor.GetCurrentRotation(), 0.001, TEST_LOCATION);
+
+ actor.RotateBy(rotation);
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(Quaternion(M_PI*0.5f, Vector3::ZAXIS), actor.GetCurrentRotation(), 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliActorGetCurrentRotation(void)
+{
+ TestApplication application;
+ Actor actor = Actor::New();
+
+ Quaternion rotation(0.785f, Vector3(1.0f, 1.0f, 0.0f));
+ actor.SetRotation(rotation);
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(rotation, actor.GetCurrentRotation(), 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliActorGetCurrentWorldRotation(void)
+{
+ tet_infoline("Testing Actor::GetCurrentWorldRotation");
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Radian rotationAngle( Degree(90.0f) );
+ Quaternion rotation( rotationAngle, Vector3::YAXIS );
+ parent.SetRotation( rotation );
+ Stage::GetCurrent().Add( parent );
+
+ Actor child = Actor::New();
+ child.SetRotation( rotation );
+ parent.Add( child );
+
+ // The actors should not have a world rotation yet
+ DALI_TEST_EQUALS( parent.GetCurrentWorldRotation(), Quaternion(0.0f, Vector3::YAXIS), 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldRotation(), Quaternion(0.0f, Vector3::YAXIS), 0.001, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( parent.GetCurrentRotation(), rotation, 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentRotation(), rotation, 0.001, TEST_LOCATION );
+
+ // The actors should have a world rotation now
+ DALI_TEST_EQUALS( parent.GetCurrentWorldRotation(), Quaternion( rotationAngle, Vector3::YAXIS ), 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldRotation(), Quaternion( rotationAngle * 2.0f, Vector3::YAXIS ), 0.001, TEST_LOCATION );
+
+ // turn off child rotation inheritance
+ child.SetInheritRotation( false );
+ DALI_TEST_EQUALS( child.IsRotationInherited(), false, TEST_LOCATION );
+ application.SendNotification();
+ application.Render(0);
+
+ // The actors should have a world rotation now
+ DALI_TEST_EQUALS( parent.GetCurrentWorldRotation(), Quaternion( rotationAngle, Vector3::YAXIS ), 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldRotation(), rotation, 0.001, TEST_LOCATION );
+ END_TEST;
+}
+
+// SetScale(float scale)
+int UtcDaliActorSetScale01(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Set to random value first - GetCurrentScale() asserts if called before SetScale()
+ actor.SetScale(0.25f);
+
+ Vector3 scale(10.0f, 10.0f, 10.0f);
+ DALI_TEST_CHECK(actor.GetCurrentScale() != scale);
+
+ actor.SetScale(scale.x);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(actor.GetCurrentScale() == scale);
+ END_TEST;
+}
+
+// SetScale(float scaleX, float scaleY, float scaleZ)
+int UtcDaliActorSetScale02(void)
+{
+ TestApplication application;
+ Vector3 scale(10.0f, 10.0f, 10.0f);
+
+ Actor actor = Actor::New();
+
+ // Set to random value first - GetCurrentScale() asserts if called before SetScale()
+ actor.SetScale(Vector3(12.0f, 1.0f, 2.0f));
+
+ DALI_TEST_CHECK(actor.GetCurrentScale() != scale);
+
+ actor.SetScale(scale.x, scale.y, scale.z);
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_CHECK(actor.GetCurrentScale() == scale);
+
+ // add to stage and test
+ Stage::GetCurrent().Add( actor );
+ actor.SetScale( 2.0f, 2.0f, 2.0f );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( Vector3( 2.0f, 2.0f, 2.0f ), actor.GetCurrentScale(), 0.001, TEST_LOCATION);
+
+ Stage::GetCurrent().Remove( actor );
+
+ END_TEST;
+}
+
+// SetScale(Vector3 scale)
+int UtcDaliActorSetScale03(void)
+{
+ TestApplication application;
+ Vector3 scale(10.0f, 10.0f, 10.0f);
+
+ Actor actor = Actor::New();
+
+ // Set to random value first - GetCurrentScale() asserts if called before SetScale()
+ actor.SetScale(Vector3(12.0f, 1.0f, 2.0f));
+
+ DALI_TEST_CHECK(actor.GetCurrentScale() != scale);
+
+ actor.SetScale(scale);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(actor.GetCurrentScale() == scale);
+ END_TEST;
+}
+
+int UtcDaliActorScaleBy(void)
+{
+ TestApplication application;
+ Actor actor = Actor::New();
+ Vector3 vector(100.0f, 100.0f, 100.0f);
+
+ DALI_TEST_CHECK(vector != actor.GetCurrentScale());
+
+ actor.SetScale(vector);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector == actor.GetCurrentScale());
+
+ actor.ScaleBy(vector);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(vector*100.0f == actor.GetCurrentScale());
+ END_TEST;
+}
+
+int UtcDaliActorGetCurrentScale(void)
+{
+ TestApplication application;
+ Vector3 scale(12.0f, 1.0f, 2.0f);
+
+ Actor actor = Actor::New();
+
+ actor.SetScale(scale);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(actor.GetCurrentScale() == scale);
+ END_TEST;
+}
+
+int UtcDaliActorGetCurrentWorldScale(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentScale( 1.0f, 2.0f, 3.0f );
+ parent.SetScale( parentScale );
+ Stage::GetCurrent().Add( parent );
+
+ Actor child = Actor::New();
+ Vector3 childScale( 2.0f, 2.0f, 2.0f );
+ child.SetScale( childScale );
+ parent.Add( child );
+
+ // The actors should not have a scale yet
+ DALI_TEST_EQUALS( parent.GetCurrentScale(), Vector3::ONE, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentScale(), Vector3::ONE, TEST_LOCATION );
+
+ // The actors should not have a world scale yet
+ DALI_TEST_EQUALS( parent.GetCurrentWorldScale(), Vector3::ONE, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldScale(), Vector3::ONE, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( parent.GetCurrentScale(), parentScale, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentScale(), childScale, TEST_LOCATION );
+
+ // The actors should have a world scale now
+ DALI_TEST_EQUALS( parent.GetCurrentWorldScale(), parentScale, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldScale(), parentScale * childScale, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliActorInheritScale(void)
+{
+ tet_infoline("Testing Actor::SetInheritScale");
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentScale( 1.0f, 2.0f, 3.0f );
+ parent.SetScale( parentScale );
+ Stage::GetCurrent().Add( parent );
+
+ Actor child = Actor::New();
+ Vector3 childScale( 2.0f, 2.0f, 2.0f );
+ child.SetScale( childScale );
+ parent.Add( child );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( child.IsScaleInherited(), true, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldScale(), parentScale * childScale, TEST_LOCATION );
+
+ child.SetInheritScale( false );
+ DALI_TEST_EQUALS( child.IsScaleInherited(), false, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( child.GetCurrentWorldScale(), childScale, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliActorSetVisible(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetVisible(false);
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_CHECK(actor.IsVisible() == false);
+
+ actor.SetVisible(true);
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_CHECK(actor.IsVisible() == true);
+
+ // put actor on stage
+ Stage::GetCurrent().Add( actor );
+ actor.SetVisible(false);
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_CHECK(actor.IsVisible() == false);
+ END_TEST;
+}
+
+int UtcDaliActorIsVisible(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ DALI_TEST_CHECK(actor.IsVisible() == true);
+ END_TEST;
+}
+
+int UtcDaliActorSetOpacity(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ // initial opacity is 1
+ DALI_TEST_EQUALS(actor.GetCurrentOpacity(), 1.0f, TEST_LOCATION );
+
+ actor.SetOpacity( 0.4f);
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(actor.GetCurrentOpacity(), 0.4f, TEST_LOCATION );
+
+ // change opacity, actor is on stage to change is not immediate
+ actor.OpacityBy( 0.1f );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(actor.GetCurrentOpacity(), 0.5f, TEST_LOCATION );
+
+ // put actor on stage
+ Stage::GetCurrent().Add( actor );
+
+ // change opacity, actor is on stage to change is not immediate
+ actor.SetOpacity( 0.9f );
+ DALI_TEST_EQUALS(actor.GetCurrentOpacity(), 0.5f, TEST_LOCATION );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(actor.GetCurrentOpacity(), 0.9f, TEST_LOCATION );
+
+ // change opacity, actor is on stage to change is not immediate
+ actor.OpacityBy( -0.9f );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS(actor.GetCurrentOpacity(), 0.0f, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliActorGetCurrentOpacity(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ DALI_TEST_CHECK(actor.GetCurrentOpacity() != 0.5f);
+
+ actor.SetOpacity(0.5f);
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_CHECK(actor.GetCurrentOpacity() == 0.5f);
+ END_TEST;
+}
+
+int UtcDaliActorSetSensitive(void)
+{
+ TestApplication application;
+ Actor actor = Actor::New();
+
+ bool sensitive = !actor.IsSensitive();
+
+ actor.SetSensitive(sensitive);
+
+ DALI_TEST_CHECK(sensitive == actor.IsSensitive());
+ END_TEST;
+}
+
+int UtcDaliActorIsSensitive(void)
+{
+ TestApplication application;
+ Actor actor = Actor::New();
+ actor.SetSensitive(false);
+
+ DALI_TEST_CHECK(false == actor.IsSensitive());
+ END_TEST;
+}
+
+int UtcDaliActorSetInheritShaderEffect(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ actor.SetInheritShaderEffect(false);
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_CHECK(actor.GetInheritShaderEffect() == false);
+
+ actor.SetInheritShaderEffect(true);
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_CHECK(actor.GetInheritShaderEffect() == true);
+ END_TEST;
+}
+
+int UtcDaliActorGetInheritShaderEffect(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ DALI_TEST_CHECK(actor.GetInheritShaderEffect() == true);
+ END_TEST;
+}
+
+int UtcDaliActorSetShaderEffect(void)
+{
+ TestApplication application;
+ Actor actor = Actor::New();
+
+ ShaderEffect effect = ShaderEffect::New(vertexSource, fragmentSource);
+
+ DALI_TEST_CHECK(effect != actor.GetShaderEffect());
+
+ actor.SetShaderEffect(effect);
+
+ DALI_TEST_CHECK(effect == actor.GetShaderEffect());
+ END_TEST;
+}
+
+int UtcDaliActorGetShaderEffect(void)
+{
+ TestApplication application;
+ Actor actor = Actor::New();
+
+ ShaderEffect effect = ShaderEffect::New(vertexSource, fragmentSource);
+ actor.SetShaderEffect(effect);
+
+ DALI_TEST_CHECK(effect == actor.GetShaderEffect());
+ END_TEST;
+}
+
+int UtcDaliActorRemoveShaderEffect01(void)
+{
+ TestApplication application;
+ Actor actor = Actor::New();
+
+ ShaderEffect defaultEffect = actor.GetShaderEffect();
+
+ ShaderEffect effect = ShaderEffect::New(vertexSource, fragmentSource);
+ actor.SetShaderEffect(effect);
+
+ DALI_TEST_CHECK(effect == actor.GetShaderEffect());
+
+ actor.RemoveShaderEffect();
+
+ DALI_TEST_CHECK(defaultEffect == actor.GetShaderEffect());
+ END_TEST;
+}
+
+int UtcDaliActorRemoveShaderEffect02(void)
+{
+ TestApplication application;
+ Actor actor = Actor::New();
+
+ ShaderEffect defaultEffect = actor.GetShaderEffect();
+
+ actor.RemoveShaderEffect();
+
+ DALI_TEST_CHECK(defaultEffect == actor.GetShaderEffect());
+ END_TEST;
+}
+
+int UtcDaliActorSetColor(void)
+{
+ TestApplication application;
+ Actor actor = Actor::New();
+ Vector4 color(1.0f, 1.0f, 1.0f, 0.5f);
+
+ DALI_TEST_CHECK(color != actor.GetCurrentColor());
+
+ actor.SetColor(color);
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_CHECK(color == actor.GetCurrentColor());
+
+ actor.ColorBy( Vector4( -0.4f, -0.5f, -0.6f, -0.4f ) );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( Vector4( 0.6f, 0.5f, 0.4f, 0.1f ), actor.GetCurrentColor(), TEST_LOCATION );
+
+ Stage::GetCurrent().Add( actor );
+ actor.SetColor( color );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( color, actor.GetCurrentColor(), TEST_LOCATION );
+
+ actor.ColorBy( Vector4( 1.1f, 1.1f, 1.1f, 1.1f ) );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ // Actor color is not clamped
+ DALI_TEST_EQUALS( Vector4( 2.1f, 2.1f, 2.1f, 1.6f ), actor.GetCurrentColor(), TEST_LOCATION );
+ // world color is clamped
+ DALI_TEST_EQUALS( Vector4( 1.0f, 1.0f, 1.0f, 1.0f ), actor.GetCurrentWorldColor(), TEST_LOCATION );
+
+ Stage::GetCurrent().Remove( actor );
+ END_TEST;
+}
+
+int UtcDaliActorGetCurrentColor(void)
+{
+ TestApplication application;
+ Actor actor = Actor::New();
+ Vector4 color(1.0f, 1.0f, 1.0f, 0.5f);
+
+ actor.SetColor(color);
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_CHECK(color == actor.GetCurrentColor());
+ END_TEST;
+}
+
+int UtcDaliActorGetCurrentWorldColor(void)
+{
+ tet_infoline("Actor::GetCurrentWorldColor");
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector4 parentColor( 1.0f, 0.5f, 0.0f, 0.8f );
+ parent.SetColor( parentColor );
+ Stage::GetCurrent().Add( parent );
+
+ Actor child = Actor::New();
+ Vector4 childColor( 0.5f, 0.6f, 0.5f, 1.0f );
+ child.SetColor( childColor );
+ parent.Add( child );
+
+ DALI_TEST_EQUALS( parent.GetCurrentColor(), Color::WHITE, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentColor(), Color::WHITE, TEST_LOCATION );
+
+ // verify the default color mode
+ DALI_TEST_EQUALS( USE_OWN_MULTIPLY_PARENT_ALPHA, child.GetColorMode(), TEST_LOCATION );
+
+ // The actors should not have a world color yet
+ DALI_TEST_EQUALS( parent.GetCurrentWorldColor(), Color::WHITE, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldColor(), Color::WHITE, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( parent.GetCurrentColor(), parentColor, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentColor(), childColor, TEST_LOCATION );
+
+ // The actors should have a world color now
+ DALI_TEST_EQUALS( parent.GetCurrentWorldColor(), parentColor, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldColor(), Vector4( childColor.r, childColor.g, childColor.b, childColor.a * parentColor.a), TEST_LOCATION );
+
+ // use own color
+ child.SetColorMode( USE_OWN_COLOR );
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( child.GetCurrentWorldColor(), childColor, TEST_LOCATION );
+
+ // use parent color
+ child.SetColorMode( USE_PARENT_COLOR );
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( child.GetCurrentColor(), childColor, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldColor(), parentColor, TEST_LOCATION );
+
+ // use parent alpha
+ child.SetColorMode( USE_OWN_MULTIPLY_PARENT_ALPHA );
+ application.SendNotification();
+ application.Render(0);
+ Vector4 expectedColor( childColor );
+ expectedColor.a *= parentColor.a;
+ DALI_TEST_EQUALS( child.GetCurrentColor(), childColor, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldColor(), expectedColor, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliActorSetColorMode(void)
+{
+ tet_infoline("Actor::SetColorMode");
+ TestApplication application;
+ Actor actor = Actor::New();
+ Actor child = Actor::New();
+ actor.Add( child );
+
+ actor.SetColorMode( USE_OWN_COLOR );
+ DALI_TEST_EQUALS( USE_OWN_COLOR, actor.GetColorMode(), TEST_LOCATION );
+
+ actor.SetColorMode( USE_OWN_MULTIPLY_PARENT_COLOR );
+ DALI_TEST_EQUALS( USE_OWN_MULTIPLY_PARENT_COLOR, actor.GetColorMode(), TEST_LOCATION );
+
+ actor.SetColorMode( USE_PARENT_COLOR );
+ DALI_TEST_EQUALS( USE_PARENT_COLOR, actor.GetColorMode(), TEST_LOCATION );
+
+ actor.SetColorMode( USE_OWN_MULTIPLY_PARENT_ALPHA );
+ DALI_TEST_EQUALS( USE_OWN_MULTIPLY_PARENT_ALPHA, actor.GetColorMode(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliActorScreenToLocal(void)
+{
+ TestApplication application;
+ Actor actor = Actor::New();
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetPosition(10.0f, 10.0f);
+ Stage::GetCurrent().Add(actor);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ float localX;
+ float localY;
+
+ DALI_TEST_CHECK( actor.ScreenToLocal(localX, localY, 50.0f, 50.0f) );
+
+ DALI_TEST_EQUALS(localX, 40.0f, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(localY, 40.0f, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliActorSetLeaveRequired(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ actor.SetLeaveRequired(false);
+ DALI_TEST_CHECK(actor.GetLeaveRequired() == false);
+
+ actor.SetLeaveRequired(true);
+ DALI_TEST_CHECK(actor.GetLeaveRequired() == true);
+ END_TEST;
+}
+
+int UtcDaliActorGetLeaveRequired(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ DALI_TEST_CHECK(actor.GetLeaveRequired() == false);
+ END_TEST;
+}
+
+int UtcDaliActorSetKeyboardFocusable(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ actor.SetKeyboardFocusable(true);
+ DALI_TEST_CHECK(actor.IsKeyboardFocusable() == true);
+
+ actor.SetKeyboardFocusable(false);
+ DALI_TEST_CHECK(actor.IsKeyboardFocusable() == false);
+ END_TEST;
+}
+
+int UtcDaliActorIsKeyboardFocusable(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ DALI_TEST_CHECK(actor.IsKeyboardFocusable() == false);
+ END_TEST;
+}
+
+
+int UtcDaliActorApplyConstraint(void)
+{
+ TestApplication application;
+
+ gTestConstraintCalled = false;
+
+ Actor actor = Actor::New();
+
+ Constraint constraint = Constraint::New<Vector4>( Actor::COLOR, TestConstraint() );
+ actor.ApplyConstraint(constraint);
+
+ DALI_TEST_CHECK( gTestConstraintCalled == false );
+ // add to stage
+ Stage::GetCurrent().Add( actor );
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK( gTestConstraintCalled == true );
+ END_TEST;
+}
+
+
+int UtcDaliActorApplyConstraintAppliedCallback(void)
+{
+ TestApplication application;
+
+ // Build a reusable constraint
+
+ Actor parent = Actor::New();
+ Vector3 parentSize( 100.0f, 100.0f, 100.0f );
+ parent.SetSize( parentSize );
+ Stage::GetCurrent().Add( parent );
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SIZE,
+ Source( parent, Actor::SIZE ),
+ EqualToConstraint() );
+
+ // Create some child actors
+
+ Actor child1 = Actor::New();
+ parent.Add( child1 );
+
+ Actor child2 = Actor::New();
+ parent.Add( child2 );
+
+ Actor child3 = Actor::New();
+ parent.Add( child3 );
+
+ // Apply constraint with different timings - everything should be finished after 10 seconds
+
+ wasConstraintCallbackCalled1 = false;
+ wasConstraintCallbackCalled2 = false;
+ wasConstraintCallbackCalled3 = false;
+
+ constraint.SetApplyTime( 5.0f );
+ ActiveConstraint activeConstraint1 = child1.ApplyConstraint( constraint );
+ activeConstraint1.AppliedSignal().Connect( TestConstraintCallback1 );
+
+ constraint.SetApplyTime( 10.0f );
+ ActiveConstraint activeConstraint2 = child2.ApplyConstraint( constraint );
+ activeConstraint2.AppliedSignal().Connect( TestConstraintCallback2 );
+
+ constraint.SetApplyTime( TimePeriod( 2.0f/*delay*/, 5.0f/*duration*/ ) );
+ ActiveConstraint activeConstraint3 = child3.ApplyConstraint( constraint );
+ activeConstraint3.AppliedSignal().Connect( TestConstraintCallback3 );
+
+ DALI_TEST_EQUALS( child1.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+ DALI_TEST_EQUALS( child2.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+ DALI_TEST_EQUALS( child3.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ application.SendNotification();
+
+ application.Render(static_cast<unsigned int>(1000.0f)); // 1 elapsed second
+ DALI_TEST_EQUALS( child1.GetCurrentSize(), parentSize*0.20f, TEST_LOCATION ); // 1 / 5 * 100 = 20%
+ DALI_TEST_EQUALS( child2.GetCurrentSize(), parentSize*0.10f, TEST_LOCATION ); // 1 / 10 * 100 = 10%
+ DALI_TEST_EQUALS( child3.GetCurrentSize(), parentSize*0.00f, TEST_LOCATION ); // 0%
+
+ // Check signals have not fired
+ application.SendNotification();
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled1, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled2, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled3, false, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(1000.0f)); // 2 elapsed seconds
+ DALI_TEST_EQUALS( child1.GetCurrentSize(), parentSize*0.40f, TEST_LOCATION ); // 2 / 5 * 100 = 40%
+ DALI_TEST_EQUALS( child2.GetCurrentSize(), parentSize*0.20f, TEST_LOCATION ); // 2 / 10 * 100 = 20%
+ DALI_TEST_EQUALS( child3.GetCurrentSize(), parentSize*0.00f, TEST_LOCATION ); // 0%
+
+ // Check signals have not fired
+ application.SendNotification();
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled1, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled2, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled3, false, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(1000.0f)); // 3 elapsed seconds
+ DALI_TEST_EQUALS( child1.GetCurrentSize(), parentSize*0.60f, TEST_LOCATION ); // 3 / 5 * 100 = 60%
+ DALI_TEST_EQUALS( child2.GetCurrentSize(), parentSize*0.30f, TEST_LOCATION ); // 3 / 10 * 100 = 30%
+ DALI_TEST_EQUALS( child3.GetCurrentSize(), parentSize*0.20f, TEST_LOCATION ); // (3 - 2) / 5 * 100 = 20%
+
+ // Check signals have not fired
+ application.SendNotification();
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled1, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled2, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled3, false, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(1000.0f)); // 4 elapsed seconds
+ DALI_TEST_EQUALS( child1.GetCurrentSize(), parentSize*0.80f, TEST_LOCATION ); // 4 / 5 * 100 = 80%
+ DALI_TEST_EQUALS( child2.GetCurrentSize(), parentSize*0.40f, TEST_LOCATION ); // 4 / 10 * 100 = 40%
+ DALI_TEST_EQUALS( child3.GetCurrentSize(), parentSize*0.40f, TEST_LOCATION ); // (4 - 2) / 5 * 100 = 40%
+
+ // Check signals have not fired
+ application.SendNotification();
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled1, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled2, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled3, false, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(1000.0f)); // 5 elapsed seconds
+ DALI_TEST_EQUALS( child1.GetCurrentSize(), parentSize, TEST_LOCATION ); // 5 / 5 * 100 = 100%
+ DALI_TEST_EQUALS( child2.GetCurrentSize(), parentSize*0.50f, TEST_LOCATION ); // 5 / 10 * 100 = 50%
+ DALI_TEST_EQUALS( child3.GetCurrentSize(), parentSize*0.60f, TEST_LOCATION ); // (5 - 2) / 5 * 100 = 60%
+
+ // Check signals have not fired
+ application.SendNotification();
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled1, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled2, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled3, false, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(1000.0f)); // 6 elapsed seconds
+ DALI_TEST_EQUALS( child1.GetCurrentSize(), parentSize, TEST_LOCATION ); // Past 100% (signal 1 should fire)
+ DALI_TEST_EQUALS( child2.GetCurrentSize(), parentSize*0.60f, TEST_LOCATION ); // 6 / 10 * 100 = 60%
+ DALI_TEST_EQUALS( child3.GetCurrentSize(), parentSize*0.80f, TEST_LOCATION ); // (6 - 2) / 5 * 100 = 80%
+
+ // 1st signal should have fired
+ application.SendNotification();
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled1, true, TEST_LOCATION );
+ wasConstraintCallbackCalled1 = false;
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled2, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled3, false, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(1000.0f)); // 7 elapsed seconds
+ DALI_TEST_EQUALS( child1.GetCurrentSize(), parentSize, TEST_LOCATION ); // Past 100%
+ DALI_TEST_EQUALS( child2.GetCurrentSize(), parentSize*0.70f, TEST_LOCATION ); // 7 / 10 * 100 = 70%
+ DALI_TEST_EQUALS( child3.GetCurrentSize(), parentSize, TEST_LOCATION ); // (7 - 2) / 5 * 100 = 100%
+
+ // Check signals have not fired
+ application.SendNotification();
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled1, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled2, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled3, false, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(1000.0f)); // 8 elapsed seconds
+ DALI_TEST_EQUALS( child1.GetCurrentSize(), parentSize, TEST_LOCATION ); // Past 100%
+ DALI_TEST_EQUALS( child2.GetCurrentSize(), parentSize*0.80f, TEST_LOCATION ); // 8 / 10 * 100 = 80%
+ DALI_TEST_EQUALS( child3.GetCurrentSize(), parentSize, TEST_LOCATION ); // Past 100% (signal 3 should fire)
+
+ // 3rd signal should have fired
+ application.SendNotification();
+
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled1, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled2, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled3, true, TEST_LOCATION );
+ wasConstraintCallbackCalled3 = false;
+
+ application.Render(static_cast<unsigned int>(1000.0f)); // 9 elapsed seconds
+ DALI_TEST_EQUALS( child1.GetCurrentSize(), parentSize, TEST_LOCATION ); // Past 100%
+ DALI_TEST_EQUALS( child2.GetCurrentSize(), parentSize*0.90f, TEST_LOCATION ); // 9 / 10 * 100 = 90%
+ DALI_TEST_EQUALS( child3.GetCurrentSize(), parentSize, TEST_LOCATION ); // Past 100%
+
+ // Check signals have not fired
+ application.SendNotification();
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled1, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled2, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled3, false, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(1000.0f + 1.0f)); // over 10 elapsed seconds
+ DALI_TEST_EQUALS( child1.GetCurrentSize(), parentSize, TEST_LOCATION ); // Past 100%
+ DALI_TEST_EQUALS( child2.GetCurrentSize(), parentSize, TEST_LOCATION ); // Past 100% (signal 2 should fire)
+ DALI_TEST_EQUALS( child3.GetCurrentSize(), parentSize, TEST_LOCATION ); // Past 100%
+
+ // 2nd signal should have fired
+ application.SendNotification();
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled1, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled2, true, TEST_LOCATION );
+ wasConstraintCallbackCalled2 = false;
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled3, false, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+
+ application.Render(0);
+ DALI_TEST_EQUALS( child1.GetCurrentSize(), parentSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( child2.GetCurrentSize(), parentSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( child3.GetCurrentSize(), parentSize, TEST_LOCATION );
+
+ application.SendNotification();
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled1, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled2, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled3, false, TEST_LOCATION );
+
+ application.Render(0);
+ DALI_TEST_EQUALS( child1.GetCurrentSize(), parentSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( child2.GetCurrentSize(), parentSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( child3.GetCurrentSize(), parentSize, TEST_LOCATION );
+
+ application.SendNotification();
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled1, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled2, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( wasConstraintCallbackCalled3, false, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliActorRemoveConstraints(void)
+{
+ tet_infoline(" UtcDaliActorRemoveConstraints");
+ TestApplication application;
+
+ gTestConstraintCalled = false;
+
+ Actor actor = Actor::New();
+
+ Constraint constraint = Constraint::New<Vector4>( Actor::COLOR, TestConstraint() );
+ actor.ApplyConstraint(constraint);
+ actor.RemoveConstraints();
+
+ DALI_TEST_CHECK( gTestConstraintCalled == false );
+
+ Stage::GetCurrent().Add( actor );
+ actor.ApplyConstraint(constraint);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ actor.RemoveConstraints();
+
+ DALI_TEST_CHECK( gTestConstraintCalled == true );
+ END_TEST;
+}
+
+int UtcDaliActorRemoveConstraint(void)
+{
+ tet_infoline(" UtcDaliActorRemoveConstraint");
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // 1. Apply Constraint1 and Constraint2, and test...
+ unsigned int result1 = 0u;
+ unsigned int result2 = 0u;
+ ActiveConstraint activeConstraint1 = actor.ApplyConstraint( Constraint::New<Vector4>( Actor::COLOR, TestConstraintRef<Vector4>(result1, 1) ) );
+ ActiveConstraint activeConstraint2 = actor.ApplyConstraint( Constraint::New<Vector4>( Actor::COLOR, TestConstraintRef<Vector4>(result2, 2) ) );
+
+ Stage::GetCurrent().Add( actor );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( result1, 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( result2, 2u, TEST_LOCATION );
+
+ // 2. Remove Constraint1 and test...
+ result1 = 0;
+ result2 = 0;
+ actor.RemoveConstraint(activeConstraint1);
+ // make color property dirty, which will trigger constraints to be reapplied.
+ actor.SetColor( Color::WHITE );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( result1, 0u, TEST_LOCATION ); ///< constraint 1 should not apply now.
+ DALI_TEST_EQUALS( result2, 2u, TEST_LOCATION );
+
+ // 3. Re-Apply Constraint1 and test...
+ result1 = 0;
+ result2 = 0;
+ activeConstraint1 = actor.ApplyConstraint( Constraint::New<Vector4>( Actor::COLOR, TestConstraintRef<Vector4>(result1, 1) ) );
+ // make color property dirty, which will trigger constraints to be reapplied.
+ actor.SetColor( Color::WHITE );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( result1, 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( result2, 2u, TEST_LOCATION );
+
+ // 2. Remove Constraint2 and test...
+ result1 = 0;
+ result2 = 0;
+ actor.RemoveConstraint(activeConstraint2);
+ // make color property dirty, which will trigger constraints to be reapplied.
+ actor.SetColor( Color::WHITE );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( result1, 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( result2, 0u, TEST_LOCATION ); ///< constraint 2 should not apply now.
+
+ // 2. Remove Constraint1 as well and test...
+ result1 = 0;
+ result2 = 0;
+ actor.RemoveConstraint(activeConstraint1);
+ // make color property dirty, which will trigger constraints to be reapplied.
+ actor.SetColor( Color::WHITE );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( result1, 0u, TEST_LOCATION ); ///< constraint 1 should not apply now.
+ DALI_TEST_EQUALS( result2, 0u, TEST_LOCATION ); ///< constraint 2 should not apply now.
+ END_TEST;
+}
+
+
+int UtcDaliActorTouchedSignal(void)
+{
+ TestApplication application;
+
+ gTouchCallBackCalled = false;
+
+ // get the root layer
+ Actor actor = Stage::GetCurrent().GetRootLayer();
+ DALI_TEST_CHECK( gTouchCallBackCalled == false );
+
+ application.SendNotification();
+ application.Render();
+
+ // connect to its touch signal
+ actor.TouchedSignal().Connect( TestCallback );
+
+ // simulate a touch event in the middle of the screen
+ Vector2 touchPoint( Stage::GetCurrent().GetSize() * 0.5 );
+ Dali::TouchPoint point( 1, TouchPoint::Down, touchPoint.x, touchPoint.y );
+ Dali::Integration::TouchEvent event;
+ event.AddPoint( point );
+ application.ProcessEvent( event );
+
+ DALI_TEST_CHECK( gTouchCallBackCalled == true );
+ END_TEST;
+}
+
+
+int UtcDaliActorSetSizeSignal(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSizeSignal().Connect( SetSizeCallback );
+
+ gSetSize.x = gSetSize.y = gSetSize.z = 0.0f;
+ gSetSizeCallBackCalled = false;
+ Vector2 size2d( 1.0f, 2.0f );
+ actor.SetSize( size2d );
+ DALI_TEST_CHECK( gSetSizeCallBackCalled == true );
+ // SetSize with Vector2 sets depth to be the minimum of width & height
+ DALI_TEST_EQUALS( Vector3( 1.0f, 2.0f, 1.0f ), gSetSize, TEST_LOCATION );
+
+ gSetSize.x = gSetSize.y = gSetSize.z = 0.0f;
+ gSetSizeCallBackCalled = false;
+ actor.SetSize( 22.0f, 11.0f );
+ DALI_TEST_CHECK( gSetSizeCallBackCalled == true );
+ // SetSize with Vector2 sets depth to be the minimum of width & height
+ DALI_TEST_EQUALS( Vector3( 22.0f, 11.0f, 11.0f ), gSetSize, TEST_LOCATION );
+
+ gSetSize.x = gSetSize.y = gSetSize.z = 0.0f;
+ gSetSizeCallBackCalled = false;
+ Vector3 size( 3.0f, 4.0f, 5.0f );
+ actor.SetSize( size );
+ DALI_TEST_CHECK( gSetSizeCallBackCalled == true );
+ DALI_TEST_EQUALS( size, gSetSize, TEST_LOCATION );
+
+ // add actor to stage to see that signal still works
+ Stage::GetCurrent().Add( actor );
+
+ gSetSize.x = gSetSize.y = gSetSize.z = 0.0f;
+ gSetSizeCallBackCalled = false;
+ actor.SetSize( -1.0f, -2.0f, -3.0f );
+ DALI_TEST_CHECK( gSetSizeCallBackCalled == true );
+ DALI_TEST_EQUALS( Vector3( -1.0f, -2.0f, -3.0f ), gSetSize, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliActorOnOffStageSignal(void)
+{
+ tet_infoline("Testing Dali::Actor::OnStageSignal() and OffStageSignal()");
+
+ TestApplication application;
+
+ // clean test data
+ gOnStageCallBackCalled = gOffStageCallBackCalled = 0;
+ gActorNamesOnOffStage.clear();
+
+ Actor parent = Actor::New();
+ parent.SetName( "parent" );
+ parent.OnStageSignal().Connect( OnStageCallback );
+ parent.OffStageSignal().Connect( OffStageCallback );
+ // sanity check
+ DALI_TEST_CHECK( gOnStageCallBackCalled == 0 );
+ DALI_TEST_CHECK( gOffStageCallBackCalled == 0 );
+
+ // add parent to stage
+ Stage::GetCurrent().Add( parent );
+ // onstage emitted, offstage not
+ DALI_TEST_EQUALS( gOnStageCallBackCalled, 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( gOffStageCallBackCalled, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( "parent", gActorNamesOnOffStage[ 0 ], TEST_LOCATION );
+
+ // test adding a child, should get onstage emitted
+ // clean test data
+ gOnStageCallBackCalled = gOffStageCallBackCalled = 0;
+ gActorNamesOnOffStage.clear();
+
+ Actor child = Actor::New();
+ child.SetName( "child" );
+ child.OnStageSignal().Connect( OnStageCallback );
+ child.OffStageSignal().Connect( OffStageCallback );
+ parent.Add( child ); // add child
+ // onstage emitted, offstage not
+ DALI_TEST_EQUALS( gOnStageCallBackCalled, 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( gOffStageCallBackCalled, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( "child", gActorNamesOnOffStage[ 0 ], TEST_LOCATION );
+
+ // test removing parent from stage
+ // clean test data
+ gOnStageCallBackCalled = gOffStageCallBackCalled = 0;
+ gActorNamesOnOffStage.clear();
+
+ Stage::GetCurrent().Remove( parent );
+ // onstage not emitted, offstage is
+ DALI_TEST_EQUALS( gOnStageCallBackCalled, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( gOffStageCallBackCalled, 2, TEST_LOCATION );
+ DALI_TEST_EQUALS( "child", gActorNamesOnOffStage[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "parent", gActorNamesOnOffStage[ 1 ], TEST_LOCATION );
+
+ // test adding parent back to stage
+ // clean test data
+ gOnStageCallBackCalled = gOffStageCallBackCalled = 0;
+ gActorNamesOnOffStage.clear();
+
+ Stage::GetCurrent().Add( parent );
+ // onstage emitted, offstage not
+ DALI_TEST_EQUALS( gOnStageCallBackCalled, 2, TEST_LOCATION );
+ DALI_TEST_EQUALS( gOffStageCallBackCalled, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( "parent", gActorNamesOnOffStage[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "child", gActorNamesOnOffStage[ 1 ], TEST_LOCATION );
+
+ // test removing child
+ // clean test data
+ gOnStageCallBackCalled = gOffStageCallBackCalled = 0;
+ gActorNamesOnOffStage.clear();
+
+ parent.Remove( child );
+ // onstage not emitted, offstage is
+ DALI_TEST_EQUALS( gOnStageCallBackCalled, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( gOffStageCallBackCalled, 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( "child", gActorNamesOnOffStage[ 0 ], TEST_LOCATION );
+
+ // test removing parent
+ // clean test data
+ gOnStageCallBackCalled = gOffStageCallBackCalled = 0;
+ gActorNamesOnOffStage.clear();
+
+ Stage::GetCurrent().Remove( parent );
+ // onstage not emitted, offstage is
+ DALI_TEST_EQUALS( gOnStageCallBackCalled, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( gOffStageCallBackCalled, 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( "parent", gActorNamesOnOffStage[ 0 ], TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliActorFindChildByName(void)
+{
+ tet_infoline("Testing Dali::Actor::FindChildByName()");
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ parent.SetName( "parent" );
+ Actor first = Actor::New();
+ first .SetName( "first" );
+ Actor second = Actor::New();
+ second.SetName( "second" );
+
+ parent.Add(first);
+ first.Add(second);
+
+ Actor found = parent.FindChildByName( "foo" );
+ DALI_TEST_CHECK( !found );
+
+ found = parent.FindChildByName( "parent" );
+ DALI_TEST_CHECK( found == parent );
+
+ found = parent.FindChildByName( "first" );
+ DALI_TEST_CHECK( found == first );
+
+ found = parent.FindChildByName( "second" );
+ DALI_TEST_CHECK( found == second );
+ END_TEST;
+}
+
+int UtcDaliActorFindChildByAlias(void)
+{
+ tet_infoline("Testing Dali::Actor::FindChildByAlias()");
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ parent.SetName( "parent" );
+ Actor first = Actor::New();
+ first .SetName( "first" );
+ Actor second = Actor::New();
+ second.SetName( "second" );
+
+ parent.Add(first);
+ first.Add(second);
+
+ Actor found = parent.FindChildByAlias( "foo" );
+ DALI_TEST_CHECK( !found );
+
+ found = parent.FindChildByAlias( "parent" );
+ DALI_TEST_CHECK( found == parent );
+
+ found = parent.FindChildByAlias( "first" );
+ DALI_TEST_CHECK( found == first );
+
+ found = parent.FindChildByAlias( "second" );
+ DALI_TEST_CHECK( found == second );
+ END_TEST;
+}
+
+int UtcDaliActorFindChildById(void)
+{
+ tet_infoline("Testing Dali::Actor::UtcDaliActorFindChildById()");
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Actor first = Actor::New();
+ Actor second = Actor::New();
+
+ parent.Add(first);
+ first.Add(second);
+
+ Actor found = parent.FindChildById( 100000 );
+ DALI_TEST_CHECK( !found );
+
+ found = parent.FindChildById( parent.GetId() );
+ DALI_TEST_CHECK( found == parent );
+
+ found = parent.FindChildById( first.GetId() );
+ DALI_TEST_CHECK( found == first );
+
+ found = parent.FindChildById( second.GetId() );
+ DALI_TEST_CHECK( found == second );
+ END_TEST;
+}
+
+int UtcDaliActorHitTest(void)
+{
+ struct HitTestData
+ {
+ public:
+ HitTestData( const Vector3& scale, const Vector2& touchPoint, bool result )
+ : mScale( scale ),
+ mTouchPoint( touchPoint ),
+ mResult( result )
+ {}
+
+ Vector3 mScale;
+ Vector2 mTouchPoint;
+ bool mResult;
+ };
+
+ TestApplication application;
+ tet_infoline(" UtcDaliActorHitTest");
+
+ // Fill a vector with different hit tests.
+ struct HitTestData* hitTestData[] = {
+ // scale touch point result
+ new HitTestData( Vector3( 100.f, 100.f, 1.f ), Vector2( 289.f, 400.f ), true ), // touch point close to the right edge (inside)
+ new HitTestData( Vector3( 100.f, 100.f, 1.f ), Vector2( 291.f, 400.f ), false ), // touch point close to the right edge (outside)
+ new HitTestData( Vector3( 110.f, 100.f, 1.f ), Vector2( 291.f, 400.f ), true ), // same point as above with a wider scale. Should be inside.
+ new HitTestData( Vector3( 100.f, 100.f, 1.f ), Vector2( 200.f, 451.f ), false ), // touch point close to the down edge (outside)
+ new HitTestData( Vector3( 100.f, 110.f, 1.f ), Vector2( 200.f, 451.f ), true ), // same point as above with a wider scale. Should be inside.
+ NULL,
+ };
+
+ // get the root layer
+ Actor actor = Actor::New();
+ actor.SetAnchorPoint( AnchorPoint::CENTER );
+ actor.SetParentOrigin( ParentOrigin::CENTER );
+
+ Stage::GetCurrent().Add( actor );
+
+ gTouchCallBackCalled = false;
+
+ unsigned int index = 0;
+ while( NULL != hitTestData[index] )
+ {
+ actor.SetSize( 1.f, 1.f );
+ actor.SetScale( hitTestData[index]->mScale.x, hitTestData[index]->mScale.y, hitTestData[index]->mScale.z );
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK( !gTouchCallBackCalled );
+
+ // connect to its touch signal
+ actor.TouchedSignal().Connect(TestCallback);
+
+ Dali::TouchPoint point( 0, TouchPoint::Down, hitTestData[index]->mTouchPoint.x, hitTestData[index]->mTouchPoint.y );
+ Dali::Integration::TouchEvent event;
+ event.AddPoint( point );
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ application.ProcessEvent( event );
+
+ DALI_TEST_CHECK( gTouchCallBackCalled == hitTestData[index]->mResult );
+
+ if( gTouchCallBackCalled != hitTestData[index]->mResult )
+ tet_printf("Test failed:\nScale %f %f %f\nTouchPoint %f, %f\nResult %d\n",
+ hitTestData[index]->mScale.x, hitTestData[index]->mScale.y, hitTestData[index]->mScale.z,
+ hitTestData[index]->mTouchPoint.x, hitTestData[index]->mTouchPoint.y,
+ hitTestData[index]->mResult );
+
+ gTouchCallBackCalled = false;
+ ++index;
+ }
+ END_TEST;
+}
+
+int UtcDaliActorSetDrawMode(void)
+{
+ TestApplication app;
+ tet_infoline(" UtcDaliActorSetDrawModeOverlay");
+
+ Actor a = Actor::New();
+
+ Stage::GetCurrent().Add(a);
+ app.SendNotification();
+ app.Render(0);
+ app.SendNotification();
+ app.Render(1);
+
+ DALI_TEST_CHECK( DrawMode::NORMAL == a.GetDrawMode() ); // Ensure overlay is off by default
+
+ a.SetDrawMode( DrawMode::OVERLAY );
+ app.SendNotification();
+ app.Render(1);
+
+ DALI_TEST_CHECK( DrawMode::OVERLAY == a.GetDrawMode() ); // Check Actor is overlay
+
+ a.SetDrawMode( DrawMode::STENCIL );
+ app.SendNotification();
+ app.Render(1);
+
+ DALI_TEST_CHECK( DrawMode::STENCIL == a.GetDrawMode() ); // Check Actor is stencil, not overlay
+
+ a.SetDrawMode( DrawMode::NORMAL );
+ app.SendNotification();
+ app.Render(1);
+
+ DALI_TEST_CHECK( DrawMode::NORMAL == a.GetDrawMode() ); // Check Actor is not stencil
+ END_TEST;
+}
+
+int UtcDaliActorSetDrawModeOverlayRender(void)
+{
+ TestApplication app;
+ tet_infoline(" UtcDaliActorSetDrawModeOverlayRender");
+
+ app.SendNotification();
+ app.Render(1);
+
+ std::vector<GLuint> ids;
+ ids.push_back( 8 ); // first rendered actor
+ ids.push_back( 9 ); // second rendered actor
+ ids.push_back( 10 ); // third rendered actor
+ app.GetGlAbstraction().SetNextTextureIds( ids );
+
+ BitmapImage imageA = BitmapImage::New(16, 16);
+ BitmapImage imageB = BitmapImage::New(16, 16);
+ BitmapImage imageC = BitmapImage::New(16, 16);
+ ImageActor a = ImageActor::New( imageA );
+ ImageActor b = ImageActor::New( imageB );
+ ImageActor c = ImageActor::New( imageC );
+
+ // Render a,b,c as regular non-overlays. so order will be:
+ // a (8)
+ // b (9)
+ // c (10)
+ Stage::GetCurrent().Add(a);
+ Stage::GetCurrent().Add(b);
+ Stage::GetCurrent().Add(c);
+
+ app.SendNotification();
+ app.Render(1);
+
+ // Should be 3 textures changes.
+ const std::vector<GLuint>& boundTextures = app.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
+ typedef std::vector<GLuint>::size_type TextureSize;
+ DALI_TEST_EQUALS( boundTextures.size(), static_cast<TextureSize>( 3 ), TEST_LOCATION );
+ if( boundTextures.size() == 3 )
+ {
+ DALI_TEST_CHECK( boundTextures[0] == 8u );
+ DALI_TEST_CHECK( boundTextures[1] == 9u );
+ DALI_TEST_CHECK( boundTextures[2] == 10u );
+ }
+
+ // Now texture ids have been set, we can monitor their render order.
+ // render a as an overlay (last), so order will be:
+ // b (9)
+ // c (10)
+ // a (8)
+ a.SetDrawMode( DrawMode::OVERLAY );
+ app.GetGlAbstraction().ClearBoundTextures();
+
+ app.SendNotification();
+ app.Render(1);
+
+ // Should be 3 texture changes.
+ DALI_TEST_EQUALS( boundTextures.size(), static_cast<TextureSize>(3), TEST_LOCATION );
+ if( boundTextures.size() == 3 )
+ {
+ DALI_TEST_CHECK( boundTextures[0] == 9u );
+ DALI_TEST_CHECK( boundTextures[1] == 10u );
+ DALI_TEST_CHECK( boundTextures[2] == 8u );
+ }
+ END_TEST;
+}
+
+
+int UtcDaliActorSetDrawModeOverlayHitTest(void)
+{
+ TestApplication app;
+ tet_infoline(" UtcDaliActorSetDrawModeOverlayHitTest");
+
+ BitmapImage imageA = BitmapImage::New(16, 16);
+ BitmapImage imageB = BitmapImage::New(16, 16);
+ ImageActor a = ImageActor::New( imageA );
+ ImageActor b = ImageActor::New( imageB );
+
+ // Render a,b as regular non-overlays. so order will be:
+ Stage::GetCurrent().Add(a);
+ Stage::GetCurrent().Add(b);
+
+ a.SetSize(Vector2(100.0f, 100.0f));
+ b.SetSize(Vector2(100.0f, 100.0f));
+
+ // position b overlapping a. (regular non-overlays)
+ // hit test at point 'x'
+ // --------
+ // | |
+ // | a |
+ // | --------
+ // | |x |
+ // | | |
+ // ----| |
+ // | b |
+ // | |
+ // --------
+ // note: b is on top, because it's Z position is higher.
+ a.SetPosition(Vector3(0.0f, 0.0f, 0.0f));
+ b.SetPosition(Vector3(50.0f, 50.0f, 1.0f));
+
+ // connect to their touch signals
+ a.TouchedSignal().Connect(TestCallback);
+ b.TouchedSignal().Connect(TestCallback2);
+
+ a.SetDrawMode( DrawMode::NORMAL );
+ b.SetDrawMode( DrawMode::NORMAL );
+ SimulateTouchForSetOverlayHitTest(app);
+
+ DALI_TEST_CHECK( gTouchCallBackCalled == false );
+ DALI_TEST_CHECK( gTouchCallBack2Called == true );
+ // Make Actor a an overlay.
+ // --------
+ // | |
+ // | a |
+ // | |----
+ // | x | |
+ // | | |
+ // -------- |
+ // | b |
+ // | |
+ // --------
+ // note: a is on top, because it is an overlay.
+ a.SetDrawMode( DrawMode::OVERLAY );
+ b.SetDrawMode( DrawMode::NORMAL );
+ SimulateTouchForSetOverlayHitTest(app);
+
+ DALI_TEST_CHECK( gTouchCallBackCalled == true );
+ DALI_TEST_CHECK( gTouchCallBack2Called == false );
+ // Make both Actors as overlays
+ // --------
+ // | |
+ // | a |
+ // | --------
+ // | |x |
+ // | | |
+ // ----| |
+ // | b |
+ // | |
+ // --------
+ // note: b is on top, because it is the 2nd child in the hierarchy.
+ a.SetDrawMode( DrawMode::OVERLAY );
+ b.SetDrawMode( DrawMode::OVERLAY );
+ SimulateTouchForSetOverlayHitTest(app);
+
+ DALI_TEST_CHECK( gTouchCallBackCalled == false );
+ DALI_TEST_CHECK( gTouchCallBack2Called == true );
+ END_TEST;
+}
+
+int UtcDaliActorGetCurrentWorldMatrix(void)
+{
+ TestApplication app;
+ tet_infoline(" UtcDaliActorGetCurrentWorldMatrix");
+
+ Actor parent = Actor::New();
+ parent.SetParentOrigin(ParentOrigin::CENTER);
+ parent.SetAnchorPoint(AnchorPoint::CENTER);
+ Vector3 parentPosition( 10.0f, 20.0f, 30.0f);
+ Radian rotationAngle(Degree(85.0f));
+ Quaternion parentRotation(rotationAngle, Vector3::ZAXIS);
+ Vector3 parentScale( 1.0f, 2.0f, 3.0f );
+ parent.SetPosition( parentPosition );
+ parent.SetRotation( parentRotation );
+ parent.SetScale( parentScale );
+ Stage::GetCurrent().Add( parent );
+
+ Actor child = Actor::New();
+ child.SetParentOrigin(ParentOrigin::CENTER);
+ Vector3 childPosition( 0.0f, 0.0f, 100.0f );
+ Radian childRotationAngle(Degree(23.0f));
+ Quaternion childRotation( childRotationAngle, Vector3::YAXIS );
+ Vector3 childScale( 2.0f, 2.0f, 2.0f );
+ child.SetPosition( childPosition );
+ child.SetRotation( childRotation );
+ child.SetScale( childScale );
+ parent.Add( child );
+
+ // The actors should not have a world matrix yet
+ DALI_TEST_EQUALS( parent.GetCurrentWorldMatrix(), Matrix::IDENTITY, 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldMatrix(), Matrix::IDENTITY, 0.001, TEST_LOCATION );
+
+ app.SendNotification();
+ app.Render(0);
+ app.Render();
+ app.SendNotification();
+
+ Matrix parentMatrix(false);
+ parentMatrix.SetTransformComponents(parentScale, parentRotation, parentPosition);
+
+ Vector3 childWorldPosition = parentPosition + parentRotation * parentScale * childPosition;
+ Quaternion childWorldRotation = parentRotation * childRotation;
+ Vector3 childWorldScale = parentScale * childScale;
+
+ Matrix childWorldMatrix(false);
+ childWorldMatrix.SetTransformComponents(childWorldScale, childWorldRotation, childWorldPosition);
+
+ DALI_TEST_EQUALS( parent.GetCurrentWorldMatrix(), parentMatrix, 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldMatrix(), childWorldMatrix, 0.001, TEST_LOCATION );
+ END_TEST;
+}
+
+
+
+int UtcDaliActorConstrainedToWorldMatrix(void)
+{
+ TestApplication app;
+ tet_infoline(" UtcDaliActorConstrainedToWorldMatrix");
+
+ Actor parent = Actor::New();
+ parent.SetParentOrigin(ParentOrigin::CENTER);
+ parent.SetAnchorPoint(AnchorPoint::CENTER);
+ Vector3 parentPosition( 10.0f, 20.0f, 30.0f);
+ Radian rotationAngle(Degree(85.0f));
+ Quaternion parentRotation(rotationAngle, Vector3::ZAXIS);
+ Vector3 parentScale( 1.0f, 2.0f, 3.0f );
+ parent.SetPosition( parentPosition );
+ parent.SetRotation( parentRotation );
+ parent.SetScale( parentScale );
+ Stage::GetCurrent().Add( parent );
+
+ Actor child = Actor::New();
+ child.SetParentOrigin(ParentOrigin::CENTER);
+ Constraint posConstraint = Constraint::New<Vector3>( Actor::POSITION, Source( parent, Actor::WORLD_MATRIX), PositionComponentConstraint() );
+ child.ApplyConstraint(posConstraint);
+
+ Stage::GetCurrent().Add( child );
+
+ // The actors should not have a world matrix yet
+ DALI_TEST_EQUALS( parent.GetCurrentWorldMatrix(), Matrix::IDENTITY, 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldMatrix(), Matrix::IDENTITY, 0.001, TEST_LOCATION );
+
+ app.SendNotification();
+ app.Render(0);
+ app.Render();
+ app.SendNotification();
+
+ Matrix parentMatrix(false);
+ parentMatrix.SetTransformComponents(parentScale, parentRotation, parentPosition);
+
+ DALI_TEST_EQUALS( parent.GetCurrentWorldMatrix(), parentMatrix, 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentPosition(), parent.GetCurrentPosition(), 0.001, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliActorUnparent(void)
+{
+ TestApplication app;
+ tet_infoline(" UtcDaliActorUnparent");
+
+ Actor parent = Actor::New();
+ Stage::GetCurrent().Add( parent );
+
+ Actor child = Actor::New();
+
+ DALI_TEST_EQUALS( parent.GetChildCount(), 0u, TEST_LOCATION );
+ DALI_TEST_CHECK( !child.GetParent() );
+
+ // Test that calling Unparent with no parent is a NOOP
+ child.Unparent();
+
+ DALI_TEST_EQUALS( parent.GetChildCount(), 0u, TEST_LOCATION );
+ DALI_TEST_CHECK( !child.GetParent() );
+
+ // Test that Unparent works
+ parent.Add( child );
+
+ DALI_TEST_EQUALS( parent.GetChildCount(), 1u, TEST_LOCATION );
+ DALI_TEST_CHECK( parent == child.GetParent() );
+
+ child.Unparent();
+
+ DALI_TEST_EQUALS( parent.GetChildCount(), 0u, TEST_LOCATION );
+ DALI_TEST_CHECK( !child.GetParent() );
+
+ // Test that UnparentAndReset works
+ parent.Add( child );
+
+ DALI_TEST_EQUALS( parent.GetChildCount(), 1u, TEST_LOCATION );
+ DALI_TEST_CHECK( parent == child.GetParent() );
+
+ UnparentAndReset( child );
+
+ DALI_TEST_EQUALS( parent.GetChildCount(), 0u, TEST_LOCATION );
+ DALI_TEST_CHECK( !child );
+
+ // Test that UnparentAndReset is a NOOP with empty handle
+ UnparentAndReset( child );
+
+ DALI_TEST_CHECK( !child );
+ END_TEST;
+}
+
+int UtcDaliActorGetChildAt(void)
+{
+ TestApplication app;
+ tet_infoline(" UtcDaliActorGetChildAt");
+
+ Actor parent = Actor::New();
+ Stage::GetCurrent().Add( parent );
+
+ Actor child0 = Actor::New();
+ parent.Add( child0 );
+
+ Actor child1 = Actor::New();
+ parent.Add( child1 );
+
+ Actor child2 = Actor::New();
+ parent.Add( child2 );
+
+ DALI_TEST_EQUALS( parent.GetChildAt( 0 ), child0, TEST_LOCATION );
+ DALI_TEST_EQUALS( parent.GetChildAt( 1 ), child1, TEST_LOCATION );
+ DALI_TEST_EQUALS( parent.GetChildAt( 2 ), child2, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliActorSetGetOverlay(void)
+{
+ TestApplication app;
+ tet_infoline(" UtcDaliActorSetGetOverlay");
+
+ Actor parent = Actor::New();
+ parent.SetDrawMode(DrawMode::OVERLAY );
+ DALI_TEST_CHECK( parent.GetDrawMode() == DrawMode::OVERLAY );
+ END_TEST;
+}
+
+
+// Current Dynamics functions are crashing, so testing these sections are futile
+
+int UtcDaliActorDynamics(void)
+{
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
+
+int UtcDaliActorCreateDestroy(void)
+{
+ Actor* actor = new Actor;
+ DALI_TEST_CHECK( actor );
+ delete actor;
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_alpha_functions_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_alpha_functions_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsDefault(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::Default( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Default( 0.25f ), 0.25f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Default( 0.5f ), 0.5f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Default( 0.75f ), 0.75f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Default( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsLinear(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::Linear( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Linear( 0.25f ), 0.25f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Linear( 0.5f ), 0.5f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Linear( 0.75f ), 0.75f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Linear( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsReverse(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::Reverse( 0.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Reverse( 0.25f ), 0.75f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Reverse( 0.5f ), 0.5f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Reverse( 0.75f ), 0.25f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Reverse( 1.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsEaseIn(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::EaseIn( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseIn( 0.25f ), 0.015625f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseIn( 0.5f ), 0.125f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseIn( 0.75f ), 0.421875f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseIn( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsEaseOut(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOut( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOut( 0.25f ), 0.578125f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOut( 0.5f ), 0.875f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOut( 0.75f ), 0.984375f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOut( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsEaseInOut(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOut( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOut( 0.25f ), 0.0625f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOut( 0.5f ), 0.5f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOut( 0.75f ), 0.9375f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOut( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsEaseInSine(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInSine( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInSine( 0.25f ), 0.07612f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInSine( 0.5f ), 0.292893f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInSine( 0.75f ), 0.617317f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInSine( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsEaseOutSine(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutSine( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutSine( 0.25f ), 0.382683f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutSine( 0.5f ), 0.707107f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutSine( 0.75f ), 0.92388f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutSine( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsEaseInOutSine(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine( 0.25f ), 0.146447f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine( 0.5f ), 0.5f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine( 0.75f ), 0.853553f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsBounce(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::Bounce( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Bounce( 0.25f ), 0.707107f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Bounce( 0.5f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Bounce( 0.75f ), 0.707107f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Bounce( 1.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsBounceBack(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::BounceBack( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::BounceBack( 0.25f ), 0.900316f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::BounceBack( 0.5f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::BounceBack( 0.75f ), -0.300105f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::BounceBack( 1.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsEaseOutBack(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutBack( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutBack( 0.25f ), 0.817410f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutBack( 0.5f ), 1.087698f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutBack( 0.75f ), 1.064137f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutBack( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsSin(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::Sin( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Sin( 0.25f ), 0.5f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Sin( 0.5f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Sin( 0.75f ), 0.5f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Sin( 1.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsSin2x(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::Sin2x( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Sin2x( 0.25f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Sin2x( 0.5f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Sin2x( 0.75f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Sin2x( 1.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsSquare(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::Square( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Square( 0.25f ), 0.0625f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Square( 0.5f ), 0.25f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Square( 0.75f ), 0.5625f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::Square( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsEaseInSine33(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInSine33( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInSine33( 0.25f ), 0.064146f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInSine33( 0.5f ), 0.255256f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInSine33( 0.75f ), 0.569374f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInSine33( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsEaseOutSine33(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutSine33( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutSine33( 0.25f ), 0.430626f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutSine33( 0.5f ), 0.744744f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutSine33( 0.75f ), 0.935854f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutSine33( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsEaseInOutSineXX(void)
+{
+ TestApplication application;
+
+ {
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine33( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine33( 0.25f ), 0.239263f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine33( 0.5f ), 0.5f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine33( 0.75f ), 0.760737f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine33( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ }
+ {
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine50( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine50( 0.25f ), 0.224156f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine50( 0.5f ), 0.5f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine50( 0.75f ), 0.775844f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine50( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ }
+ {
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine60( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine60( 0.25f ), 0.211325f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine60( 0.5f ), 0.5f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine60( 0.75f ), 0.788675f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine60( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ }
+ {
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine70( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine70( 0.25f ), 0.194806f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine70( 0.5f ), 0.5f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine70( 0.75f ), 0.805194f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine70( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ }
+ {
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine80( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine80( 0.25f ), 0.173648f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine80( 0.5f ), 0.5f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine80( 0.75f ), 0.826352f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine80( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ }
+ {
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine90( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine90( 0.25f ), 0.146447f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine90( 0.5f ), 0.5f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine90( 0.75f ), 0.853553f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutSine90( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsDoubleEaseInOutSine60(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::DoubleEaseInOutSine60( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::DoubleEaseInOutSine60( 0.25f ), 0.25f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::DoubleEaseInOutSine60( 0.5f ), 0.5f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::DoubleEaseInOutSine60( 0.75f ), 0.75f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::DoubleEaseInOutSine60( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsEaseOutQuint50(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutQuint50( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutQuint50( 0.25f ), 0.386797f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutQuint50( 0.5f ), 0.692214f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutQuint50( 0.75f ), 0.905268f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutQuint50( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsEaseOutQuint80(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutQuint80( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutQuint80( 0.25f ), 0.484010f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutQuint80( 0.5f ), 0.796937f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutQuint80( 0.75f ), 0.958765f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseOutQuint80( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsEaseInBack(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInBack( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInBack( 0.25f ), -0.064137f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInBack( 0.5f ), -0.087698f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInBack( 0.75f ), 0.182590f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInBack( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAlphaFunctionsEaseInOutBack(void)
+{
+ TestApplication application;
+
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutBack( 0.0f ), 0.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutBack( 0.25f ), -0.043849f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutBack( 0.5f ), 0.5f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutBack( 0.75f ), 1.043849f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS( AlphaFunctions::EaseInOutBack( 1.0f ), 1.0f, Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+void utc_dali_angle_axis_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_angle_axis_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+
+int UtcDaliAngleAxisNew01(void)
+{
+ TestApplication application;
+
+ AngleAxis a;
+ DALI_TEST_EQUALS(float(a.angle), 0.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(a.axis, Vector3(0.0f, 0.0f, 0.0f), 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+
+int UtcDaliAngleAxisNew02(void)
+{
+ TestApplication application;
+
+ Degree d(75.0f);
+ AngleAxis a(d, Vector3::XAXIS);
+
+ DALI_TEST_EQUALS(a.angle, d, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(a.axis, Vector3::XAXIS, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliAngleAxisNew03(void)
+{
+ TestApplication application;
+
+ Radian r(Math::PI_2);
+ AngleAxis a(r, Vector3::ZAXIS);
+
+ // AngleAxis stores its angle as a degree, so should only do degree comparison.
+ DALI_TEST_EQUALS(a.angle, Degree(Radian(Math::PI_2)), 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(a.axis, Vector3::ZAXIS, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliAngleAxisAssign(void)
+{
+ TestApplication application;
+
+ Radian r(Math::PI_2);
+ AngleAxis a(r, Vector3::ZAXIS);
+
+ AngleAxis b = a;
+
+ // AngleAxis stores its angle as a degree, so should only do degree comparison.
+ DALI_TEST_EQUALS(b.angle, Degree(Radian(Math::PI_2)), 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(b.axis, Vector3::ZAXIS, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliAngleAxisCopy(void)
+{
+ TestApplication application;
+
+ Radian r(Math::PI_2);
+ AngleAxis a(r, Vector3::ZAXIS);
+ AngleAxis b(a);
+
+ // AngleAxis stores its angle as a degree, so should only do degree comparison.
+ DALI_TEST_EQUALS(b.angle, Degree(Radian(Math::PI_2)), 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(b.axis, Vector3::ZAXIS, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+
+void utc_dali_animatable_mesh_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_animatable_mesh_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+void CreateFaces(Dali::AnimatableMesh::Faces& faces, int numVerts)
+{
+ for(int i=0; i<numVerts-3; i++)
+ {
+ faces.push_back(i);
+ faces.push_back(i+1);
+ faces.push_back(i+2);
+ }
+}
+
+void CreateOutOfRangeFaces(Dali::AnimatableMesh::Faces& faces, int numVerts)
+{
+ for(int i=numVerts; i<numVerts*2-3; i++)
+ {
+ faces.push_back(i);
+ faces.push_back(i+1);
+ faces.push_back(i+2);
+ }
+}
+
+AnimatableMesh CreateMesh()
+{
+ AnimatableMesh::Faces faces;
+ CreateFaces(faces, 10);
+ AnimatableMesh mesh = AnimatableMesh::New(10, faces);
+ return mesh;
+}
+
+} // anon namespace
+
+// Negative test case for a method
+int UtcDaliAnimatableMeshConstructor01(void)
+{
+ TestApplication application;
+
+ AnimatableMesh mesh;
+
+ DALI_TEST_CHECK( ! mesh );
+ END_TEST;
+}
+
+int UtcDaliAnimatableMeshConstructor02(void)
+{
+ TestApplication application;
+
+ Dali::AnimatableMesh::Faces faces;
+ CreateFaces(faces, 10);
+
+ AnimatableMesh mesh = AnimatableMesh::New(10, faces);
+ DALI_TEST_CHECK( mesh );
+
+ AnimatableMesh mesh2 = mesh;
+ DALI_TEST_CHECK( mesh2 );
+
+ AnimatableMesh mesh3 ( mesh2 );
+ DALI_TEST_CHECK( mesh3 );
+ END_TEST;
+}
+
+int UtcDaliAnimatableMeshConstructor03(void)
+{
+ TestApplication application;
+
+ // Heap allocate a handle. Don't do this in real code!
+ AnimatableMesh* mesh = new AnimatableMesh();
+ DALI_TEST_CHECK( ! *mesh );
+ delete mesh;
+ END_TEST;
+}
+
+
+// Positive test case for a method
+int UtcDaliAnimatableMeshNew01(void)
+{
+ TestApplication application;
+
+ Dali::AnimatableMesh::Faces faces;
+ CreateFaces(faces, 10);
+
+ AnimatableMesh mesh = AnimatableMesh::New(10, faces);
+ DALI_TEST_CHECK( mesh );
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliAnimatableMeshNew02(void)
+{
+ TestApplication application;
+
+ Dali::AnimatableMesh::Faces faces;
+ CreateFaces(faces, 10);
+
+ Dali::Material mat = Dali::Material::New("dummy mat");
+ AnimatableMesh mesh = AnimatableMesh::New(10, faces, mat);
+ DALI_TEST_CHECK( mesh );
+ END_TEST;
+}
+
+
+// Negative test case for a method
+int UtcDaliAnimatableMeshNew03(void)
+{
+ TestApplication application;
+ Dali::AnimatableMesh::Faces faces;
+ try
+ {
+ AnimatableMesh mesh = AnimatableMesh::New(0, faces);
+ DALI_TEST_CHECK( !mesh );
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "numVertices > 0", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+// Negative test case for a method
+int UtcDaliAnimatableMeshNew04(void)
+{
+ TestApplication application;
+
+ Dali::AnimatableMesh::Faces faces;
+
+ try
+ {
+ AnimatableMesh mesh = AnimatableMesh::New(10, faces);
+ DALI_TEST_CHECK( !mesh );
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "faceIndices.size() > 0", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+// Negative test case for a method
+int UtcDaliAnimatableMeshNew05(void)
+{
+ TestApplication application;
+
+ Dali::AnimatableMesh::Faces faces;
+ CreateOutOfRangeFaces(faces, 10);
+
+ try
+ {
+ AnimatableMesh mesh = AnimatableMesh::New(10, faces);
+ DALI_TEST_CHECK( !mesh );
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "faceIndex < numVertices", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+// Negative test case for a method
+int UtcDaliAnimatableMeshNew06(void)
+{
+ TestApplication application;
+
+ Dali::AnimatableMesh::Faces faces;
+ CreateFaces(faces, 10);
+
+ try
+ {
+ AnimatableMesh mesh = AnimatableMesh::New(10, faces, Dali::Material() );
+ DALI_TEST_CHECK( !mesh );
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "material", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimatableMeshDownCast01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::AnimatableMesh::DownCast()");
+
+ Dali::AnimatableMesh::Faces faces;
+ CreateFaces(faces, 10);
+
+ AnimatableMesh mesh = AnimatableMesh::New(10, faces);
+ BaseHandle* bh = &mesh;
+
+ AnimatableMesh mesh2 = AnimatableMesh::DownCast(*bh);
+ DALI_TEST_CHECK( mesh2 );
+ END_TEST;
+}
+
+int UtcDaliAnimatableMeshGetPropertyIndex01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::AnimatableMesh::operator[]");
+ AnimatableMesh mesh = CreateMesh();
+
+ Property::Index i = mesh.GetPropertyIndex(0, AnimatableVertex::POSITION );
+ DALI_TEST_EQUALS( i, 0*3+0, TEST_LOCATION );
+
+ i = mesh.GetPropertyIndex(5, AnimatableVertex::POSITION );
+ DALI_TEST_EQUALS( i, 5*3+0, TEST_LOCATION );
+
+ i = mesh.GetPropertyIndex(7, AnimatableVertex::COLOR );
+ DALI_TEST_EQUALS( i, 7*3+1, TEST_LOCATION );
+
+ i = mesh.GetPropertyIndex(9, AnimatableVertex::TEXTURE_COORDS );
+ DALI_TEST_EQUALS( i, 9*3+2, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimatableMeshGetPropertyIndex02(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::AnimatableMesh::GetPropertyIndex");
+
+ AnimatableMesh mesh = CreateMesh();
+ try
+ {
+ Property::Index i = mesh.GetPropertyIndex(12, AnimatableVertex::POSITION );
+ DALI_TEST_CHECK( i==0 );
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "index < GetNumberOfVertices()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimatableMeshGetPropertyIndex03(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::AnimatableMesh::GetPropertyIndex");
+
+ AnimatableMesh mesh = CreateMesh();
+ try
+ {
+ Property::Index i = mesh.GetPropertyIndex(12, AnimatableVertex::COLOR );
+ DALI_TEST_CHECK( i==0 );
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "index < GetNumberOfVertices()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimatableMeshGetPropertyIndex04(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::AnimatableMesh::GetPropertyIndexa");
+
+ AnimatableMesh mesh = CreateMesh();
+ try
+ {
+ Property::Index i = mesh.GetPropertyIndex(12342343, AnimatableVertex::TEXTURE_COORDS );
+ DALI_TEST_CHECK( i==0 );
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "index < GetNumberOfVertices()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimatableMeshOperatorArray01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::AnimatableMesh::operator[]");
+
+ AnimatableMesh mesh = CreateMesh();
+ {
+ Vector3 initialPos1(0.0f, 200.0f, 0.0f);
+ Vector3 initialPos2(100.0f, 300.0f, 0.0f);
+
+ mesh[1].SetPosition(initialPos1);
+ mesh[3].SetPosition(initialPos2);
+
+ application.Render(0);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ DALI_TEST_EQUALS( mesh[1].GetCurrentPosition(), initialPos1, TEST_LOCATION );
+
+ Vector3 pos = mesh[3].GetCurrentPosition();
+ DALI_TEST_EQUALS( pos, initialPos2, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimatableMeshOperatorArray02(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::AnimatableMesh::operator[]");
+
+ AnimatableMesh mesh = CreateMesh();
+ try
+ {
+ mesh[20].SetPosition(Vector3(0.0f, 0.0f, 0.0f));
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "index < GetNumberOfVertices()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimatableMeshAnimateVertex01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::AnimatableMesh Animating properties");
+
+ AnimatableMesh mesh = CreateMesh();
+ MeshActor meshActor = MeshActor::New(mesh);
+ Stage::GetCurrent().Add(meshActor);
+ {
+ mesh[0].SetPosition(Vector3(0.0f, 200.0f, 0.0f));
+ mesh[1].SetPosition(Vector3(100.0f, 300.0f, 0.0f));
+
+ Animation anim = Animation::New(1);
+ anim.AnimateBy(mesh.GetVertexProperty(0, AnimatableVertex::POSITION), Vector3( 0.0f, 100.0f, 0.0f));
+ anim.AnimateTo(mesh.GetVertexProperty(1, AnimatableVertex::POSITION), Vector3(100.0f, 0.0f, 0.0f));
+ anim.Play();
+
+ application.SendNotification();
+ application.Render(0);
+ application.Render(500);
+ application.SendNotification();
+
+ // 50% progress
+ DALI_TEST_EQUALS( mesh[0].GetCurrentPosition(), Vector3( 0.0f, 250.0f, 0.0f), TEST_LOCATION );
+ DALI_TEST_EQUALS( mesh[1].GetCurrentPosition(), Vector3(100.0f, 150.0f, 0.0f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(501);
+ application.SendNotification();
+
+ DALI_TEST_EQUALS( mesh[0].GetCurrentPosition(), Vector3( 0.0f, 300.0f, 0.0f), TEST_LOCATION );
+ DALI_TEST_EQUALS( mesh[1].GetCurrentPosition(), Vector3(100.0f, 0.0f, 0.0f), TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimatableVertexSettersAndGetters(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::AnimatableVertex constructors");
+ AnimatableMesh mesh = CreateMesh();
+ Vector3 v1Pos(0.0f, 200.0f, 0.0f);
+ Vector3 v2Pos(100.0f, 300.0f, 0.0f);
+ Vector2 uvs(0.1f, 0.2f);
+ mesh[0].SetPosition(v1Pos);
+ mesh[1].SetPosition(v2Pos);
+ mesh[2].SetColor(Color::BLACK);
+ mesh[3].SetTextureCoords(uvs);
+
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_EQUALS(mesh[0].GetCurrentPosition(), v1Pos, TEST_LOCATION);
+ DALI_TEST_EQUALS(mesh[1].GetCurrentPosition(), v2Pos, TEST_LOCATION);
+ DALI_TEST_EQUALS(mesh[2].GetCurrentColor(), Color::BLACK, TEST_LOCATION);
+ DALI_TEST_EQUALS(mesh[3].GetCurrentTextureCoords(), uvs, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliAnimatableMeshProperties(void)
+{
+ TestApplication application;
+ AnimatableMesh mesh = CreateMesh();
+
+ Property::IndexContainer indices;
+ mesh.GetPropertyIndices( indices );
+ DALI_TEST_CHECK( ! indices.empty() );
+ DALI_TEST_EQUALS( indices.size(), mesh.GetPropertyCount(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimatableMeshExceedVertices(void)
+{
+ TestApplication application;
+
+ AnimatableMesh::Faces faces;
+ CreateFaces(faces, 10);
+
+ try
+ {
+ AnimatableMesh mesh = AnimatableMesh::New(3333334, faces);
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT_CONDITION_STARTS_WITH_SUBSTRING( e, "( numVertices * 3 ) < DEFAULT_PROPERTY_MAX_COUNT", TEST_LOCATION );
+ }
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <algorithm>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using std::max;
+using namespace Dali;
+
+void utc_dali_animation_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_animation_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+static const float ROTATION_EPSILON = 0.0001f;
+static const float VECTOR4_EPSILON = 0.0001f;
+
+// Functor to test whether a Finish signal is emitted
+struct AnimationFinishCheck
+{
+ AnimationFinishCheck(bool& signalReceived)
+ : mSignalReceived(signalReceived)
+ {
+ }
+
+ void operator()(Animation& animation)
+ {
+ mSignalReceived = true;
+ }
+
+ void Reset()
+ {
+ mSignalReceived = false;
+ }
+
+ void CheckSignalReceived()
+ {
+ if (!mSignalReceived)
+ {
+ tet_printf("Expected Finish signal was not received\n");
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+ }
+
+ void CheckSignalNotReceived()
+ {
+ if (mSignalReceived)
+ {
+ tet_printf("Unexpected Finish signal was received\n");
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+ }
+
+ bool& mSignalReceived; // owned by individual tests
+};
+
+static bool ReturnFalseAfterProgressOne( float alpha, const bool& current )
+{
+ return alpha < 1.0f;
+}
+
+struct AnimateFloatTestFunctor
+{
+ AnimateFloatTestFunctor( float start, float end )
+ : mStart( start ),
+ mEnd( end )
+ {
+ }
+
+ float operator()( float alpha, const float& current )
+ {
+ return mStart + ((mEnd - mStart) * alpha );
+ }
+
+ float mStart;
+ float mEnd;
+};
+
+struct AnimateVector2TestFunctor
+{
+ AnimateVector2TestFunctor( Vector2 start, Vector2 end )
+ : mStart( start ),
+ mEnd( end )
+ {
+ }
+
+ Vector2 operator()( float alpha, const Vector2& current )
+ {
+ return mStart + ((mEnd - mStart) * alpha );
+ }
+
+ Vector2 mStart;
+ Vector2 mEnd;
+};
+
+struct AnimateVector4TestFunctor
+{
+ AnimateVector4TestFunctor( Vector4 start, Vector4 end )
+ : mStart( start ),
+ mEnd( end )
+ {
+ }
+
+ Vector4 operator()( float alpha, const Vector4& current )
+ {
+ return mStart + ((mEnd - mStart) * alpha );
+ }
+
+ Vector4 mStart;
+ Vector4 mEnd;
+};
+
+struct AnimateQuaternionTestFunctor
+{
+ AnimateQuaternionTestFunctor( Quaternion start, Quaternion end )
+ : mStart( start ),
+ mEnd( end )
+ {
+ }
+
+ Quaternion operator()( float alpha, const Quaternion& current )
+ {
+ return Quaternion::Slerp(mStart, mEnd, alpha);
+ }
+
+ Quaternion mStart;
+ Quaternion mEnd;
+};
+
+struct BounceFunc
+{
+ BounceFunc(float x, float y, float z)
+ : mDistance(Vector3(x, y, z))
+ {
+ }
+ Vector3 operator()(float alpha, const Vector3& current)
+ {
+ if (alpha>0.001f && alpha<1.0f)
+ {
+ const float flip = 0.5f - cosf(alpha * Math::PI * 2.0f) * 0.5f;
+ Vector3 newTranslation(current);
+ newTranslation += mDistance * flip;
+ return newTranslation;
+ }
+ return current;
+ }
+ Vector3 mDistance;
+};
+
+
+struct TumbleFunc
+{
+ TumbleFunc(Vector3 axis) : tumbleAxis(axis){}
+ Quaternion operator()(float alpha, const Quaternion& current)
+ {
+ if (alpha>0.001f && alpha<1.0f)
+ {
+ Quaternion tumbleRotation(alpha * Math::PI * 2.0f, tumbleAxis);
+ return tumbleRotation * current;
+ }
+ return current;
+ }
+ Vector3 tumbleAxis;
+};
+
+} // anon namespace
+
+int UtcDaliAnimationNew01(void)
+{
+ TestApplication application;
+
+ Animation animation;
+ DALI_TEST_CHECK(!animation);
+
+ animation = Animation::New(1.0f);
+
+ DALI_TEST_CHECK(animation);
+ END_TEST;
+}
+
+int UtcDaliAnimationNew02(void)
+{
+ TestApplication application;
+
+ Animation animation;
+ DALI_TEST_CHECK(!animation);
+ try
+ {
+ animation = Animation::New(0.0f);
+ }
+ catch (Dali::DaliException& e)
+ {
+ // TODO: Determine why catch doesn't.
+ //
+
+ // Tests that a negative test of an assertion succeeds
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_EQUALS(e.mCondition, "durationSeconds > 0.0f", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimationDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Animation::DownCast()");
+
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+
+ BaseHandle object(animation);
+
+ Animation animation2 = Animation::DownCast(object);
+ DALI_TEST_CHECK(animation2);
+
+ Animation animation3 = DownCast< Animation >(object);
+ DALI_TEST_CHECK(animation3);
+
+ BaseHandle unInitializedObject;
+ Animation animation4 = Animation::DownCast(unInitializedObject);
+ DALI_TEST_CHECK(!animation4);
+
+ Animation animation5 = DownCast< Animation >(unInitializedObject);
+ DALI_TEST_CHECK(!animation5);
+ END_TEST;
+}
+
+int UtcDaliAnimationSetDuration(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ DALI_TEST_EQUALS(animation.GetDuration(), durationSeconds, TEST_LOCATION);
+
+ // Start the animation
+ Vector3 targetPosition(10.0f, 10.0f, 10.0f);
+ animation.MoveTo(actor, targetPosition, AlphaFunctions::Linear);
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*1000.0f) - 1u/*just less than the animation duration*/);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ application.Render(2u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( targetPosition, actor.GetCurrentPosition(), TEST_LOCATION );
+
+ // Restart the animation, with a different duration
+ finishCheck.Reset();
+ actor.SetPosition(Vector3::ZERO);
+ durationSeconds = 3.5f;
+ animation.SetDuration(durationSeconds);
+ DALI_TEST_EQUALS(animation.GetDuration(), durationSeconds, TEST_LOCATION);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*1000.0f) - 1u/*just less than the animation duration*/);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ application.Render(2u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( targetPosition, actor.GetCurrentPosition(), TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( targetPosition, actor.GetCurrentPosition(), TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( targetPosition, actor.GetCurrentPosition(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationGetDuration(void)
+{
+ TestApplication application;
+
+ Animation animation = Animation::New(1.0f);
+ DALI_TEST_EQUALS(animation.GetDuration(), 1.0f, TEST_LOCATION);
+
+ animation.SetDuration(2.0f);
+ DALI_TEST_EQUALS(animation.GetDuration(), 2.0f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliAnimationSetLooping(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(10.0f, 10.0f, 10.0f);
+ animation.MoveTo(actor, targetPosition, AlphaFunctions::Linear);
+
+ // Start the animation
+ animation.SetLooping(true);
+ DALI_TEST_CHECK(animation.IsLooping());
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+
+ // Loop 5 times
+ float intervalSeconds = 0.25f;
+ float progress = 0.0f;
+ for (int iterations = 0; iterations < 5;)
+ {
+ application.Render(static_cast<unsigned int>(durationSeconds*intervalSeconds*1000.0f));
+
+ progress += intervalSeconds;
+ DALI_TEST_EQUALS( targetPosition*progress, actor.GetCurrentPosition(), 0.001f, TEST_LOCATION );
+
+ if (progress >= 1.0f)
+ {
+ progress = progress - 1.0f;
+ ++iterations;
+ }
+ }
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ animation.SetLooping(false);
+ DALI_TEST_CHECK(!animation.IsLooping());
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*1000.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( targetPosition, actor.GetCurrentPosition(), TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( targetPosition, actor.GetCurrentPosition(), TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( targetPosition, actor.GetCurrentPosition(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationIsLooping(void)
+{
+ TestApplication application;
+
+ Animation animation = Animation::New(1.0f);
+ DALI_TEST_CHECK(!animation.IsLooping());
+
+ animation.SetLooping(true);
+ DALI_TEST_CHECK(animation.IsLooping());
+ END_TEST;
+}
+
+int UtcDaliAnimationSetEndAction(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ DALI_TEST_CHECK(animation.GetEndAction() == Animation::Bake);
+
+ Vector3 targetPosition(10.0f, 10.0f, 10.0f);
+ animation.MoveTo(actor, targetPosition, AlphaFunctions::Linear);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*1000.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( targetPosition, actor.GetCurrentPosition(), TEST_LOCATION );
+
+ // Go back to the start
+ actor.SetPosition(Vector3::ZERO);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( Vector3::ZERO, actor.GetCurrentPosition(), TEST_LOCATION );
+
+ // Animate again, but don't bake this time
+ finishCheck.Reset();
+ animation.SetEndAction(Animation::Discard);
+ DALI_TEST_CHECK(animation.GetEndAction() == Animation::Discard);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*1000.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( targetPosition, actor.GetCurrentPosition(), TEST_LOCATION );
+
+ // The position should be discarded in the next frame
+ application.Render(0);
+ DALI_TEST_EQUALS( Vector3::ZERO/*discarded*/, actor.GetCurrentPosition(), TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( Vector3::ZERO, actor.GetCurrentPosition(), TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( Vector3::ZERO, actor.GetCurrentPosition(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationGetEndAction(void)
+{
+ TestApplication application;
+
+ Animation animation = Animation::New(1.0f);
+ DALI_TEST_CHECK(animation.GetEndAction() == Animation::Bake);
+
+ animation.SetEndAction(Animation::Discard);
+ DALI_TEST_CHECK(animation.GetEndAction() == Animation::Discard);
+ END_TEST;
+}
+
+int UtcDaliAnimationGetDestroyAction(void)
+{
+ TestApplication application;
+ Animation animation = Animation::New(1.0f);
+ DALI_TEST_CHECK(animation.GetDestroyAction() == Animation::Bake); // default!
+
+ animation.SetDestroyAction(Animation::Discard);
+ DALI_TEST_CHECK(animation.GetDestroyAction() == Animation::Discard);
+
+ END_TEST;
+}
+
+int UtcDaliAnimationSetDefaultAlphaFunction(void)
+{
+ TestApplication application;
+
+ Animation animation = Animation::New(1.0f);
+ AlphaFunction func = animation.GetDefaultAlphaFunction();
+ DALI_TEST_EQUALS(func(0.1f), AlphaFunctions::Linear(0.1f), TEST_LOCATION);
+
+ animation.SetDefaultAlphaFunction(AlphaFunctions::EaseIn);
+ AlphaFunction func2 = animation.GetDefaultAlphaFunction();
+ DALI_TEST_CHECK(func2(0.1f) < AlphaFunctions::Linear(0.1f)); // less progress when easing-in
+ END_TEST;
+}
+
+int UtcDaliAnimationGetDefaultAlphaFunction(void)
+{
+ TestApplication application;
+
+ Animation animation = Animation::New(1.0f);
+ AlphaFunction func = animation.GetDefaultAlphaFunction();
+
+ // Test that the default is linear
+ DALI_TEST_EQUALS(func(0.1f), AlphaFunctions::Linear(0.1f), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliAnimationPlay(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(100.0f, 100.0f, 100.0f);
+ animation.MoveTo(actor, targetPosition, AlphaFunctions::Linear);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 20% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), (targetPosition * 0.2f), TEST_LOCATION );
+
+ animation.Play(); // Test that calling play has no effect, when animation is already playing
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 40% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), (targetPosition * 0.4f), TEST_LOCATION );
+
+ animation.Play(); // Test that calling play has no effect, when animation is already playing
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 60% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), (targetPosition * 0.6f), TEST_LOCATION );
+
+ animation.Play(); // Test that calling play has no effect, when animation is already playing
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 80% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), (targetPosition * 0.8f), TEST_LOCATION );
+
+ animation.Play(); // Test that calling play has no effect, when animation is already playing
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( targetPosition, actor.GetCurrentPosition(), TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( targetPosition, actor.GetCurrentPosition(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationPlayOffStage(void)
+{
+ // Test that an animation can be played, when the actor is off-stage.
+ // When the actor is added to the stage, it should appear at the current position
+ // i.e. where it would have been anyway, if on-stage from the beginning.
+
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 basePosition(Vector3::ZERO);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), basePosition, TEST_LOCATION );
+ // Not added to the stage!
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(100.0f, 100.0f, 100.0f);
+ animation.MoveTo(actor, targetPosition, AlphaFunctions::Linear);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 20% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), Vector3::ZERO/*off-stage*/, TEST_LOCATION );
+
+ // Add to the stage
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 40% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ Vector3 expectedPosition(basePosition + (targetPosition - basePosition)*0.4f);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), expectedPosition/*on-stage*/, TEST_LOCATION );
+
+ // Remove from the stage
+ Stage::GetCurrent().Remove(actor);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 60% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), Vector3::ZERO/*back to start position*/, TEST_LOCATION );
+
+ // Add to the stage
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 80% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ expectedPosition = Vector3(basePosition + (targetPosition - basePosition)*0.8f);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), expectedPosition, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( targetPosition, actor.GetCurrentPosition(), TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( targetPosition, actor.GetCurrentPosition(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationPlayDiscardHandle(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(100.0f, 100.0f, 100.0f);
+ animation.MoveTo(actor, targetPosition, AlphaFunctions::Linear);
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ // Start the animation
+ animation.Play();
+
+ // This is a test of the "Fire and Forget" behaviour
+ // Discard the animation handle!
+ animation.Reset();
+ DALI_TEST_CHECK( !animation );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 20% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), (targetPosition * 0.2f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 40% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), (targetPosition * 0.4f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 60% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), (targetPosition * 0.6f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 80% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), (targetPosition * 0.8f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( targetPosition, actor.GetCurrentPosition(), TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( targetPosition, actor.GetCurrentPosition(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationPlayStopDiscardHandle(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(100.0f, 100.0f, 100.0f);
+ animation.MoveTo(actor, targetPosition, AlphaFunctions::Linear);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 20% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), (targetPosition * 0.2f), TEST_LOCATION );
+
+ // This is a test of the "Fire and Forget" behaviour
+ // Stop the animation, and Discard the animation handle!
+ animation.Stop();
+ animation.Reset();
+ DALI_TEST_CHECK( !animation );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 40% progress */);
+
+ // We expect the animation to finish at 20% progress
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ finishCheck.Reset();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), (targetPosition * 0.2f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 60% progress */);
+
+ // Check that nothing has changed
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), (targetPosition * 0.2f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 80% progress */);
+
+ // Check that nothing has changed
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), (targetPosition * 0.2f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 100% progress */);
+
+ // Check that nothing has changed
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), (targetPosition * 0.2f), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationPause(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(100.0f, 100.0f, 100.0f);
+ animation.MoveTo(actor, targetPosition, AlphaFunctions::Linear);
+
+ Vector3 fiftyPercentProgress(targetPosition * 0.5f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), fiftyPercentProgress, TEST_LOCATION );
+
+ // Pause the animation
+ animation.Pause();
+ application.SendNotification();
+
+ // Loop 5 times
+ for (int i=0; i<5; ++i)
+ {
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f));
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), fiftyPercentProgress/* Still 50% progress when paused */, TEST_LOCATION );
+ }
+
+ // Keep going
+ animation.Play();
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*490.0f)/*slightly less than the animation duration*/);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*10.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( targetPosition, actor.GetCurrentPosition(), TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( targetPosition, actor.GetCurrentPosition(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationStop(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(100.0f, 100.0f, 100.0f);
+ animation.MoveTo(actor, targetPosition, AlphaFunctions::Linear);
+
+ Vector3 fiftyPercentProgress(targetPosition * 0.5f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), fiftyPercentProgress, TEST_LOCATION );
+
+ // Stop the animation
+ animation.Stop();
+ application.SendNotification();
+
+ // Loop 5 times
+ for (int i=0; i<5; ++i)
+ {
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f));
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), fiftyPercentProgress/* Still 50% progress when stopped */, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimationStopSetPosition(void)
+{
+ // Test that Animation::Stop & Actor::SetPosition can be used in conjunction
+ // i.e. to check that the animation does not interfere with the position set.
+
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(100.0f, 100.0f, 100.0f);
+ animation.MoveTo(actor, targetPosition, AlphaFunctions::Linear);
+
+ Vector3 fiftyPercentProgress(targetPosition * 0.5f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), fiftyPercentProgress, TEST_LOCATION );
+
+ // Stop the animation
+ animation.Stop();
+ Vector3 positionSet(2.0f, 3.0f, 4.0f);
+ actor.SetPosition(positionSet);
+ application.SendNotification();
+
+ // Loop 5 times
+ for (int i=0; i<5; ++i)
+ {
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f));
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), positionSet/*Animation should not interfere with this*/, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimationClear(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(100.0f, 100.0f, 100.0f);
+ animation.MoveTo(actor, targetPosition, AlphaFunctions::Linear);
+
+ Vector3 fiftyPercentProgress(targetPosition * 0.5f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), fiftyPercentProgress, TEST_LOCATION );
+
+ // Clear the animation
+ animation.Clear();
+ application.SendNotification();
+
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We don't expect the animation to finish now
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), fiftyPercentProgress/* Still 50% progress since the animator was destroyed */, TEST_LOCATION );
+
+ // Restart as a scale animation; this should not move the actor's position
+ finishCheck.Reset();
+ actor.SetPosition(Vector3::ZERO);
+ Vector3 targetScale(3.0f, 3.0f, 3.0f);
+ animation.ScaleTo(actor, targetScale, AlphaFunctions::Linear);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), Vector3::ZERO/*Check move-animator was destroyed*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), Vector3(2.0f, 2.0f, 2.0f), TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), Vector3::ZERO/*Check move-animator was destroyed*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), targetScale, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationSignalFinish(void)
+{
+ TestApplication application;
+
+ // Start the empty animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*1000.0f) + 1u/*beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByBoolean(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a boolean property
+ bool startValue(false);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ // Build the animation
+ float durationSeconds(2.0f);
+ Animation animation = Animation::New(durationSeconds);
+ const bool relativeValue(true);
+ const bool finalValue( false || relativeValue );
+ animation.AnimateBy(Property(actor, index), relativeValue);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+
+ // Repeat with relative value "false" - this should be an NOOP
+ animation = Animation::New(durationSeconds);
+ bool noOpValue(false);
+ animation.AnimateBy(Property(actor, index), noOpValue);
+
+ // Start the animation
+ animation.Play();
+
+ finishCheck.Reset();
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByBooleanAlphaFunction(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a boolean property
+ bool startValue(false);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ // Build the animation
+ float durationSeconds(2.0f);
+ Animation animation = Animation::New(durationSeconds);
+ bool relativeValue(true);
+ bool finalValue( false || relativeValue );
+ animation.AnimateBy(Property(actor, index), relativeValue, AlphaFunctions::EaseIn);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+
+ // Repeat with relative value "false" - this should be an NOOP
+ animation = Animation::New(durationSeconds);
+ bool noOpValue(false);
+ animation.AnimateBy(Property(actor, index), noOpValue, AlphaFunctions::EaseIn);
+
+ // Start the animation
+ animation.Play();
+
+ finishCheck.Reset();
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByBooleanTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a boolean property
+ bool startValue(false);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ // Build the animation
+ float durationSeconds(2.0f);
+ Animation animation = Animation::New(durationSeconds);
+ bool relativeValue(true);
+ bool finalValue( false || relativeValue );
+ float animatorDurationSeconds(durationSeconds * 0.5f);
+ animation.AnimateBy( Property(actor, index),
+ relativeValue,
+ TimePeriod( animatorDurationSeconds ) );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(animatorDurationSeconds*950.0f)/* 95% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(animatorDurationSeconds*50.0f) + 1u/*just beyond the animator duration*/);
+
+ // We didn't expect the animation to finish yet...
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // ...however we should have reached the final value
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(animatorDurationSeconds*1000.0f)/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByBooleanAlphaFunctionTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a boolean property
+ bool startValue(false);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ // Build the animation
+ float durationSeconds(2.0f);
+ Animation animation = Animation::New(durationSeconds);
+ bool relativeValue(true);
+ bool finalValue( false || relativeValue );
+ float animatorDurationSeconds(durationSeconds * 0.5f);
+ animation.AnimateBy( Property(actor, index),
+ relativeValue,
+ AlphaFunctions::EaseInOut,
+ TimePeriod( animatorDurationSeconds ) );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(animatorDurationSeconds*950.0f)/* 95% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(animatorDurationSeconds*50.0f) + 1u/*just beyond the animator duration*/);
+
+ // We didn't expect the animation to finish yet...
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // ...however we should have reached the final value
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(animatorDurationSeconds*1000.0f)/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByFloat(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a float property
+ float startValue(10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(2.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetValue(50.0f);
+ float relativeValue(targetValue - startValue);
+ animation.AnimateBy(Property(actor, index), relativeValue);
+
+ float ninetyFivePercentProgress(startValue + relativeValue*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), ninetyFivePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), targetValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), targetValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByFloatAlphaFunction(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a float property
+ float startValue(10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetValue(90.0f);
+ float relativeValue(targetValue - startValue);
+ animation.AnimateBy(Property(actor, index), relativeValue, AlphaFunctions::EaseOut);
+
+ float ninetyFivePercentProgress(startValue + relativeValue*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The position should have moved more, than with a linear alpha function
+ float current(actor.GetProperty<float>(index));
+ DALI_TEST_CHECK( current > ninetyFivePercentProgress );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), targetValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), targetValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByFloatTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a float property
+ float startValue(10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetValue(30.0f);
+ float relativeValue(targetValue - startValue);
+ float delay = 0.5f;
+ animation.AnimateBy(Property(actor, index),
+ relativeValue,
+ TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% animation progress, 50% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue+(relativeValue*0.5f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), targetValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), targetValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByFloatAlphaFunctionTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a float property
+ float startValue(10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetValue(30.0f);
+ float relativeValue(targetValue - startValue);
+ float delay = 0.5f;
+ animation.AnimateBy(Property(actor, index),
+ relativeValue,
+ AlphaFunctions::Linear,
+ TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% animation progress, 50% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue+(relativeValue*0.5f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), targetValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), targetValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByVector2(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector2 property
+ Vector2 startValue(10.0f, 10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(2.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector2 targetValue(60.0f, 60.0f);
+ Vector2 relativeValue(targetValue - startValue);
+ animation.AnimateBy(Property(actor, index), relativeValue);
+
+ Vector2 ninetyFivePercentProgress(startValue + relativeValue*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), ninetyFivePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), targetValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), targetValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByVector2AlphaFunction(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector2 property
+ Vector2 startValue(100.0f, 100.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector2 targetValue(20.0f, 20.0f);
+ Vector2 relativeValue(targetValue - startValue);
+ animation.AnimateBy(Property(actor, index), relativeValue, AlphaFunctions::EaseOut);
+
+ Vector2 ninetyFivePercentProgress(startValue + relativeValue*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The position should have moved more, than with a linear alpha function
+ Vector2 current(actor.GetProperty<Vector2>(index));
+ DALI_TEST_CHECK( current.x < ninetyFivePercentProgress.x );
+ DALI_TEST_CHECK( current.y < ninetyFivePercentProgress.y );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), targetValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), targetValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByVector2TimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector2 property
+ Vector2 startValue(10.0f, 10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector2 targetValue(30.0f, 30.0f);
+ Vector2 relativeValue(targetValue - startValue);
+ float delay = 0.5f;
+ animation.AnimateBy(Property(actor, index),
+ relativeValue,
+ TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% animation progress, 50% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue+(relativeValue*0.5f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), targetValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), targetValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByVector2AlphaFunctionTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector2 property
+ Vector2 startValue(5.0f, 5.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector2 targetValue(10.0f, 10.0f);
+ Vector2 relativeValue(targetValue - startValue);
+ float delay = 0.5f;
+ animation.AnimateBy(Property(actor, index),
+ relativeValue,
+ AlphaFunctions::Linear,
+ TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% animation progress, 50% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue+(relativeValue*0.5f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), targetValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), targetValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByVector3(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector3 property
+ Vector3 startValue(10.0f, 10.0f, 10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(2.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetValue(60.0f, 60.0f, 60.0f);
+ Vector3 relativeValue(targetValue - startValue);
+ animation.AnimateBy(Property(actor, index), relativeValue);
+
+ Vector3 ninetyFivePercentProgress(startValue + relativeValue*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), ninetyFivePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), targetValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), targetValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByVector3AlphaFunction(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector3 property
+ Vector3 startValue(100.0f, 100.0f, 100.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetValue(20.0f, 20.0f, 20.0f);
+ Vector3 relativeValue(targetValue - startValue);
+ animation.AnimateBy(Property(actor, index), relativeValue, AlphaFunctions::EaseOut);
+
+ Vector3 ninetyFivePercentProgress(startValue + relativeValue*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The position should have moved more, than with a linear alpha function
+ Vector3 current(actor.GetProperty<Vector3>(index));
+ DALI_TEST_CHECK( current.x < ninetyFivePercentProgress.x );
+ DALI_TEST_CHECK( current.y < ninetyFivePercentProgress.y );
+ DALI_TEST_CHECK( current.z < ninetyFivePercentProgress.z );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), targetValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), targetValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByVector3TimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector3 property
+ Vector3 startValue(10.0f, 10.0f, 10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetValue(30.0f, 30.0f, 30.0f);
+ Vector3 relativeValue(targetValue - startValue);
+ float delay = 0.5f;
+ animation.AnimateBy(Property(actor, index),
+ relativeValue,
+ TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% animation progress, 50% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue+(relativeValue*0.5f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), targetValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), targetValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByVector3AlphaFunctionTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector3 property
+ Vector3 startValue(5.0f, 5.0f, 5.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetValue(10.0f, 10.0f, 10.0f);
+ Vector3 relativeValue(targetValue - startValue);
+ float delay = 0.5f;
+ animation.AnimateBy(Property(actor, index),
+ relativeValue,
+ AlphaFunctions::Linear,
+ TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% animation progress, 50% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue+(relativeValue*0.5f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), targetValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), targetValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByVector4(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector4 property
+ Vector4 startValue(10.0f, 10.0f, 10.0f, 10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(2.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector4 targetValue(60.0f, 60.0f, 60.0f, 60.0f);
+ Vector4 relativeValue(targetValue - startValue);
+ animation.AnimateBy(Property(actor, index), relativeValue);
+
+ Vector4 ninetyFivePercentProgress(startValue + relativeValue*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), ninetyFivePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), targetValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), targetValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByVector4AlphaFunction(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector4 property
+ Vector4 startValue(100.0f, 100.0f, 100.0f, 100.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector4 targetValue(20.0f, 20.0f, 20.0f, 20.0f);
+ Vector4 relativeValue(targetValue - startValue);
+ animation.AnimateBy(Property(actor, index), relativeValue, AlphaFunctions::EaseOut);
+
+ Vector4 ninetyFivePercentProgress(startValue + relativeValue*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The position should have moved more, than with a linear alpha function
+ Vector4 current(actor.GetProperty<Vector4>(index));
+ DALI_TEST_CHECK( current.x < ninetyFivePercentProgress.x );
+ DALI_TEST_CHECK( current.y < ninetyFivePercentProgress.y );
+ DALI_TEST_CHECK( current.z < ninetyFivePercentProgress.z );
+ DALI_TEST_CHECK( current.w < ninetyFivePercentProgress.w );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), targetValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), targetValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByVector4TimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector4 property
+ Vector4 startValue(10.0f, 10.0f, 10.0f, 10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector4 targetValue(30.0f, 30.0f, 30.0f, 30.0f);
+ Vector4 relativeValue(targetValue - startValue);
+ float delay = 0.5f;
+ animation.AnimateBy(Property(actor, index),
+ relativeValue,
+ TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% animation progress, 50% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue+(relativeValue*0.5f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), targetValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), targetValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByVector4AlphaFunctionTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector4 property
+ Vector4 startValue(5.0f, 5.0f, 5.0f, 5.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector4 targetValue(10.0f, 10.0f, 10.0f, 10.0f);
+ Vector4 relativeValue(targetValue - startValue);
+ float delay = 0.5f;
+ animation.AnimateBy(Property(actor, index),
+ relativeValue,
+ AlphaFunctions::Linear,
+ TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% animation progress, 50% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue+(relativeValue*0.5f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), targetValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), targetValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByActorPosition(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 startPosition(10.0f, 10.0f, 10.0f);
+ actor.SetPosition(startPosition);
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), startPosition, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(20.0f, 20.0f, 20.0f);
+ Vector3 relativePosition(targetPosition - startPosition);
+ animation.AnimateBy(Property(actor, Actor::POSITION), relativePosition);
+
+ Vector3 ninetyFivePercentProgress(startPosition + relativePosition*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), ninetyFivePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByActorPositionAlphaFunction(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 startPosition(10.0f, 10.0f, 10.0f);
+ actor.SetPosition(startPosition);
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), startPosition, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(20.0f, 20.0f, 20.0f);
+ Vector3 relativePosition(targetPosition - startPosition);
+ animation.AnimateBy(Property(actor, Actor::POSITION), relativePosition, AlphaFunctions::EaseOut);
+
+ Vector3 ninetyFivePercentProgress(startPosition + relativePosition*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The position should have moved more, than with a linear alpha function
+ Vector3 current(actor.GetCurrentPosition());
+ DALI_TEST_CHECK( current.x > ninetyFivePercentProgress.x );
+ DALI_TEST_CHECK( current.y > ninetyFivePercentProgress.y );
+ DALI_TEST_CHECK( current.z > ninetyFivePercentProgress.z );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByActorPositionTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 startPosition(10.0f, 10.0f, 10.0f);
+ actor.SetPosition(startPosition);
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), startPosition, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(20.0f, 20.0f, 20.0f);
+ Vector3 relativePosition(targetPosition - startPosition);
+ float delay = 0.5f;
+ animation.AnimateBy(Property(actor, Actor::POSITION),
+ relativePosition,
+ TimePeriod(delay, durationSeconds - delay));
+
+ Vector3 ninetyFivePercentProgress(startPosition + relativePosition*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), startPosition, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateByActorPositionAlphaFunctionTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 startPosition(10.0f, 10.0f, 10.0f);
+ actor.SetPosition(startPosition);
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), startPosition, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(20.0f, 20.0f, 20.0f);
+ Vector3 relativePosition(targetPosition - startPosition);
+ float delay = 0.5f;
+ animation.AnimateBy(Property(actor, Actor::POSITION),
+ relativePosition,
+ AlphaFunctions::Linear,
+ TimePeriod(delay, durationSeconds - delay));
+
+ Vector3 ninetyFivePercentProgress(startPosition + relativePosition*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), startPosition, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToBoolean(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a boolean property
+ const bool startValue(false);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ // Build the animation
+ float durationSeconds(2.0f);
+ Animation animation = Animation::New(durationSeconds);
+ const bool targetValue( !startValue );
+ animation.AnimateTo(Property(actor, index), targetValue);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == targetValue );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == targetValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == targetValue );
+
+ // Repeat with target value "false"
+ animation = Animation::New(durationSeconds);
+ const bool finalValue( !targetValue );
+ animation.AnimateTo(Property(actor, index), finalValue);
+
+ // Start the animation
+ animation.Play();
+
+ finishCheck.Reset();
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == targetValue );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToBooleanAlphaFunction(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a boolean property
+ const bool startValue(false);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ // Build the animation
+ float durationSeconds(2.0f);
+ Animation animation = Animation::New(durationSeconds);
+ const bool targetValue( !startValue );
+ animation.AnimateTo(Property(actor, "test-property"), targetValue, AlphaFunctions::EaseOut);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == targetValue );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == targetValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == targetValue );
+
+ // Repeat with target value "false"
+ animation = Animation::New(durationSeconds);
+ const bool finalValue( !targetValue );
+ animation.AnimateTo(Property(actor, index), finalValue, AlphaFunctions::EaseOut);
+
+ // Start the animation
+ animation.Play();
+
+ finishCheck.Reset();
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == targetValue );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToBooleanTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a boolean property
+ bool startValue(false);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ // Build the animation
+ float durationSeconds(2.0f);
+ Animation animation = Animation::New(durationSeconds);
+ bool finalValue( !startValue );
+ float animatorDurationSeconds(durationSeconds * 0.5f);
+ animation.AnimateTo( Property(actor, index),
+ finalValue,
+ TimePeriod( animatorDurationSeconds ) );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(animatorDurationSeconds*950.0f)/* 95% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(animatorDurationSeconds*50.0f) + 1u/*just beyond the animator duration*/);
+
+ // We didn't expect the animation to finish yet...
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // ...however we should have reached the final value
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(animatorDurationSeconds*1000.0f)/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToBooleanAlphaFunctionTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a boolean property
+ bool startValue(false);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ // Build the animation
+ float durationSeconds(2.0f);
+ Animation animation = Animation::New(durationSeconds);
+ bool finalValue( !startValue );
+ float animatorDurationSeconds(durationSeconds * 0.5f);
+ animation.AnimateTo( Property(actor, index),
+ finalValue,
+ AlphaFunctions::Linear,
+ TimePeriod( animatorDurationSeconds ) );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(animatorDurationSeconds*950.0f)/* 95% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(animatorDurationSeconds*50.0f) + 1u/*just beyond the animator duration*/);
+
+ // We didn't expect the animation to finish yet...
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // ...however we should have reached the final value
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(animatorDurationSeconds*1000.0f)/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == finalValue );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToFloat(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a float property
+ float startValue(10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(2.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetValue(50.0f);
+ float relativeValue(targetValue - startValue);
+ animation.AnimateTo(Property(actor, "test-property"), targetValue);
+
+ float ninetyFivePercentProgress(startValue + relativeValue*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), ninetyFivePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToFloatAlphaFunction(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a float property
+ float startValue(10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetValue(90.0f);
+ float relativeValue(targetValue - startValue);
+ animation.AnimateTo(Property(actor, index), targetValue, AlphaFunctions::EaseOut);
+
+ float ninetyFivePercentProgress(startValue + relativeValue*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The position should have moved more, than with a linear alpha function
+ float current(actor.GetProperty<float>(index));
+ DALI_TEST_CHECK( current > ninetyFivePercentProgress );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToFloatTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a float property
+ float startValue(10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetValue(30.0f);
+ float relativeValue(targetValue - startValue);
+ float delay = 0.5f;
+ animation.AnimateTo(Property(actor, index),
+ targetValue,
+ TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% animation progress, 50% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue+(relativeValue*0.5f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToFloatAlphaFunctionTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a float property
+ float startValue(10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetValue(30.0f);
+ float relativeValue(targetValue - startValue);
+ float delay = 0.5f;
+ animation.AnimateTo(Property(actor, index),
+ targetValue,
+ AlphaFunctions::Linear,
+ TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% animation progress, 50% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue+(relativeValue*0.5f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToVector2(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector2 property
+ Vector2 startValue(-50.0f, -50.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(2.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector2 targetValue(50.0f, 50.0f);
+ Vector2 relativeValue(targetValue - startValue);
+ animation.AnimateTo(Property(actor, index), targetValue);
+
+ Vector2 ninetyFivePercentProgress(startValue + relativeValue*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), ninetyFivePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToVector2AlphaFunction(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector2 property
+ Vector2 startValue(1000.0f, 1000.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector2 targetValue(9000.0f, 9000.0f);
+ Vector2 relativeValue(targetValue - startValue);
+ animation.AnimateTo(Property(actor, "test-property"), targetValue, AlphaFunctions::EaseOut);
+
+ Vector2 ninetyFivePercentProgress(startValue + relativeValue*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The position should have moved more, than with a linear alpha function
+ Vector2 current(actor.GetProperty<Vector2>(index));
+ DALI_TEST_CHECK( current.x > ninetyFivePercentProgress.x );
+ DALI_TEST_CHECK( current.y > ninetyFivePercentProgress.y );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToVector2TimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector2 property
+ Vector2 startValue(10.0f, 10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector2 targetValue(-10.0f, 20.0f);
+ Vector2 relativeValue(targetValue - startValue);
+ float delay = 0.5f;
+ animation.AnimateTo(Property(actor, index),
+ targetValue,
+ TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% animation progress, 50% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue+(relativeValue*0.5f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToVector2AlphaFunctionTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector2 property
+ Vector2 startValue(10.0f, 10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector2 targetValue(30.0f, 30.0f);
+ Vector2 relativeValue(targetValue - startValue);
+ float delay = 0.5f;
+ animation.AnimateTo(Property(actor, index),
+ targetValue,
+ AlphaFunctions::Linear,
+ TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% animation progress, 50% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue+(relativeValue*0.5f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToVector3(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector3 property
+ Vector3 startValue(-50.0f, -50.0f, -50.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(2.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetValue(50.0f, 50.0f, 50.0f);
+ Vector3 relativeValue(targetValue - startValue);
+ animation.AnimateTo(Property(actor, index), targetValue);
+
+ Vector3 ninetyFivePercentProgress(startValue + relativeValue*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), ninetyFivePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToVector3AlphaFunction(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector3 property
+ Vector3 startValue(1000.0f, 1000.0f, 1000.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetValue(9000.0f, 9000.0f, 9000.0f);
+ Vector3 relativeValue(targetValue - startValue);
+ animation.AnimateTo(Property(actor, index), targetValue, AlphaFunctions::EaseOut);
+
+ Vector3 ninetyFivePercentProgress(startValue + relativeValue*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The position should have moved more, than with a linear alpha function
+ Vector3 current(actor.GetProperty<Vector3>(index));
+ DALI_TEST_CHECK( current.x > ninetyFivePercentProgress.x );
+ DALI_TEST_CHECK( current.y > ninetyFivePercentProgress.y );
+ DALI_TEST_CHECK( current.z > ninetyFivePercentProgress.z );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToVector3TimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector3 property
+ Vector3 startValue(10.0f, 10.0f, 10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetValue(-10.0f, 20.0f, 100.0f);
+ Vector3 relativeValue(targetValue - startValue);
+ float delay = 0.5f;
+ animation.AnimateTo(Property(actor, index),
+ targetValue,
+ TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% animation progress, 50% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue+(relativeValue*0.5f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToVector3AlphaFunctionTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector3 property
+ Vector3 startValue(10.0f, 10.0f, 10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetValue(30.0f, 30.0f, 30.0f);
+ Vector3 relativeValue(targetValue - startValue);
+ float delay = 0.5f;
+ animation.AnimateTo(Property(actor, "test-property"),
+ targetValue,
+ AlphaFunctions::Linear,
+ TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% animation progress, 50% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue+(relativeValue*0.5f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToVector3Component(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector3 property
+ Vector3 startValue(10.0f, 10.0f, 10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetValue(30.0f, 30.0f, 10.0f);
+ Vector3 relativeValue(targetValue - startValue);
+ float delay = 0.5f;
+ animation.AnimateTo(Property(actor, "test-property", 0),
+ 30.0f,
+ AlphaFunctions::Linear,
+ TimePeriod(delay, durationSeconds - delay));
+ animation.AnimateTo(Property(actor, index, 1),
+ 30.0f,
+ AlphaFunctions::Linear,
+ TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% animation progress, 50% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue+(relativeValue*0.5f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToVector4(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector4 property
+ Vector4 startValue(-50.0f, -40.0f, -30.0f, -20.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(2.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector4 targetValue(50.0f, 50.0f, 50.0f, 50.0f);
+ Vector4 relativeValue(targetValue - startValue);
+ animation.AnimateTo(Property(actor, index), targetValue);
+
+ Vector4 ninetyFivePercentProgress(startValue + relativeValue*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), ninetyFivePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToVector4AlphaFunction(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector4 property
+ Vector4 startValue(1000.0f, 1000.0f, 1000.0f, 1000.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector4 targetValue(9000.0f, 9000.0f, 9000.0f, 9000.0f);
+ Vector4 relativeValue(targetValue - startValue);
+ animation.AnimateTo(Property(actor, index), targetValue, AlphaFunctions::EaseOut);
+
+ Vector4 ninetyFivePercentProgress(startValue + relativeValue*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The position should have moved more, than with a linear alpha function
+ Vector4 current(actor.GetProperty<Vector4>(index));
+ DALI_TEST_CHECK( current.x > ninetyFivePercentProgress.x );
+ DALI_TEST_CHECK( current.y > ninetyFivePercentProgress.y );
+ DALI_TEST_CHECK( current.z > ninetyFivePercentProgress.z );
+ DALI_TEST_CHECK( current.w > ninetyFivePercentProgress.w );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToVector4TimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector4 property
+ Vector4 startValue(10.0f, 10.0f, 10.0f, 10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, VECTOR4_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector4 targetValue(-10.0f, 20.0f, 100.0f, 100.0f);
+ Vector4 relativeValue(targetValue - startValue);
+ float delay = 0.5f;
+ animation.AnimateTo(Property(actor, index),
+ targetValue,
+ TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, VECTOR4_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% animation progress, 50% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue+(relativeValue*0.5f), VECTOR4_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), targetValue, VECTOR4_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToVector4AlphaFunctionTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector4 property
+ Vector4 startValue(10.0f, 10.0f, 10.0f, 10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector4 targetValue(30.0f, 30.0f, 30.0f, 30.0f);
+ Vector4 relativeValue(targetValue - startValue);
+ float delay = 0.5f;
+ animation.AnimateTo(Property(actor, index),
+ targetValue,
+ AlphaFunctions::Linear,
+ TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% animation progress, 50% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue+(relativeValue*0.5f), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), targetValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorParentOrigin(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentParentOrigin(), ParentOrigin::TOP_LEFT, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetParentOrigin(ParentOrigin::BOTTOM_RIGHT);
+
+ try
+ {
+ animation.AnimateTo( Property(actor, Actor::PARENT_ORIGIN), targetParentOrigin );
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "IsPropertyAnimatable(index)", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorParentOriginX(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(0.0f);
+ DALI_TEST_EQUALS( actor.GetCurrentParentOrigin().x, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::PARENT_ORIGIN_X), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetX(1.0f);
+
+ try
+ {
+ animation.AnimateTo( Property(actor, Actor::PARENT_ORIGIN_X), targetX );
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "IsPropertyAnimatable(index)", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorParentOriginY(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(0.0f);
+ DALI_TEST_EQUALS( actor.GetCurrentParentOrigin().y, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::PARENT_ORIGIN_Y), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetY(1.0f);
+
+ try
+ {
+ animation.AnimateTo( Property(actor, Actor::PARENT_ORIGIN_Y), targetY );
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "IsPropertyAnimatable(index)", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorParentOriginZ(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(0.5f);
+ DALI_TEST_EQUALS( actor.GetCurrentParentOrigin().z, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::PARENT_ORIGIN_Z), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetZ(1.0f);
+
+ try
+ {
+ animation.AnimateTo( Property(actor, Actor::PARENT_ORIGIN_Z), targetZ );
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "IsPropertyAnimatable(index)", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorAnchorPoint(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentAnchorPoint(), AnchorPoint::CENTER, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetAnchorPoint(AnchorPoint::TOP_LEFT);
+
+ try
+ {
+ animation.AnimateTo( Property(actor, Actor::ANCHOR_POINT), targetAnchorPoint);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "IsPropertyAnimatable(index)", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorAnchorPointX(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(0.5f);
+ DALI_TEST_EQUALS( actor.GetCurrentAnchorPoint().x, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::ANCHOR_POINT_X), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetX(1.0f);
+
+ try
+ {
+ animation.AnimateTo( Property(actor, Actor::ANCHOR_POINT_X), targetX );
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "IsPropertyAnimatable(index)", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorAnchorPointY(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(0.5f);
+ DALI_TEST_EQUALS( actor.GetCurrentAnchorPoint().y, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::ANCHOR_POINT_Y), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetY(0.0f);
+
+ try
+ {
+ animation.AnimateTo( Property(actor, Actor::ANCHOR_POINT_Y), targetY );
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "IsPropertyAnimatable(index)", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorAnchorPointZ(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(0.5f);
+ DALI_TEST_EQUALS( actor.GetCurrentAnchorPoint().z, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::ANCHOR_POINT_Z), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetZ(100.0f);
+
+ try
+ {
+ animation.AnimateTo( Property(actor, Actor::ANCHOR_POINT_Z), targetZ );
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "IsPropertyAnimatable(index)", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorSize(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetSize(100.0f, 100.0f, 100.0f);
+ animation.AnimateTo( Property(actor, Actor::SIZE), targetSize );
+
+ Vector3 ninetyNinePercentProgress(targetSize * 0.99f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*990.0f)/* 99% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), ninetyNinePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*10.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), targetSize, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetSize(Vector3::ZERO);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ // Repeat with a different (ease-in) alpha function
+ animation = Animation::New(durationSeconds);
+ animation.AnimateTo( Property(actor, Actor::SIZE), targetSize, AlphaFunctions::EaseIn);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*990.0f)/* 99% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The size should have travelled less, than with a linear alpha function
+ Vector3 current(actor.GetCurrentSize());
+ DALI_TEST_CHECK( current.x > 0.0f );
+ DALI_TEST_CHECK( current.y > 0.0f );
+ DALI_TEST_CHECK( current.z > 0.0f );
+ DALI_TEST_CHECK( current.x < ninetyNinePercentProgress.x );
+ DALI_TEST_CHECK( current.y < ninetyNinePercentProgress.y );
+ DALI_TEST_CHECK( current.z < ninetyNinePercentProgress.z );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*10.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), targetSize, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetSize(Vector3::ZERO);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ // Repeat with a delay
+ float delay = 0.5f;
+ animation = Animation::New(durationSeconds);
+ animation.AnimateTo( Property(actor, Actor::SIZE), targetSize, AlphaFunctions::Linear, TimePeriod(delay, durationSeconds - delay));
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), targetSize, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorSizeWidth(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(0.0f);
+ DALI_TEST_EQUALS( actor.GetCurrentSize().width, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SIZE_WIDTH), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetWidth(10.0f);
+ animation.AnimateTo( Property(actor, Actor::SIZE_WIDTH), targetWidth );
+
+ float fiftyPercentProgress(startValue + (targetWidth - startValue)*0.5f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize().width, fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SIZE_WIDTH), fiftyPercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize().width, targetWidth, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SIZE_WIDTH), targetWidth, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorSizeHeight(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(0.0f);
+ DALI_TEST_EQUALS( actor.GetCurrentSize().height, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SIZE_HEIGHT), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetHeight(-10.0f);
+ animation.AnimateTo( Property(actor, Actor::SIZE_HEIGHT), targetHeight );
+
+ float fiftyPercentProgress(startValue + (targetHeight - startValue)*0.5f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize().height, fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SIZE_HEIGHT), fiftyPercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize().height, targetHeight, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SIZE_HEIGHT), targetHeight, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorSizeDepth(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(0.0f);
+ DALI_TEST_EQUALS( actor.GetCurrentSize().depth, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SIZE_DEPTH), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetDepth(-10.0f);
+ animation.AnimateTo( Property(actor, Actor::SIZE_DEPTH), targetDepth );
+
+ float fiftyPercentProgress(startValue + (targetDepth - startValue)*0.5f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize().depth, fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SIZE_DEPTH), fiftyPercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize().depth, targetDepth, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SIZE_DEPTH), targetDepth, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorPosition(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), Vector3::ZERO, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(200.0f, 200.0f, 200.0f);
+ animation.AnimateTo(Property(actor, Actor::POSITION), targetPosition);
+
+ Vector3 seventyFivePercentProgress(targetPosition * 0.75f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*750.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), seventyFivePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorPositionX(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(0.0f);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition().x, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_X), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Y), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Z), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetX(1.0f);
+ animation.AnimateTo( Property(actor, Actor::POSITION_X), targetX );
+
+ float fiftyPercentProgress(startValue + (targetX - startValue)*0.5f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition().x, fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_X), fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Y), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Z), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition().x, targetX, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_X), targetX, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Y), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Z), startValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorPositionY(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(0.0f);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition().y, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_X), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Y), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Z), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetY(10.0f);
+ animation.AnimateTo( Property(actor, Actor::POSITION_Y), targetY );
+
+ float fiftyPercentProgress(startValue + (targetY - startValue)*0.5f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition().y, fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_X), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Y), fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Z), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition().y, targetY, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_X), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Y), targetY, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Z), startValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorPositionZ(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(0.0f);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition().z, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_X), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Y), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Z), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetZ(-5.0f);
+ animation.AnimateTo( Property(actor, Actor::POSITION_Z), targetZ );
+
+ float fiftyPercentProgress(startValue + (targetZ - startValue)*0.5f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition().z, fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_X), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Y), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Z), fiftyPercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition().z, targetZ, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_X), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Y), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::POSITION_Z), targetZ, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorPositionAlphaFunction(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), Vector3::ZERO, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(200.0f, 200.0f, 200.0f);
+ animation.AnimateTo(Property(actor, Actor::POSITION), targetPosition, AlphaFunctions::EaseIn);
+
+ Vector3 seventyFivePercentProgress(targetPosition * 0.75f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*750.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The position should have moved less, than with a linear alpha function
+ Vector3 current(actor.GetCurrentPosition());
+ DALI_TEST_CHECK( current.x > Vector3::ZERO.x );
+ DALI_TEST_CHECK( current.y > Vector3::ZERO.y );
+ DALI_TEST_CHECK( current.z > Vector3::ZERO.z );
+ DALI_TEST_CHECK( current.x < seventyFivePercentProgress.x );
+ DALI_TEST_CHECK( current.y < seventyFivePercentProgress.y );
+ DALI_TEST_CHECK( current.z < seventyFivePercentProgress.z );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorPositionTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), Vector3::ZERO, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(200.0f, 200.0f, 200.0f);
+ float delay = 0.5f;
+ animation.AnimateTo( Property(actor, Actor::POSITION),
+ targetPosition,
+ TimePeriod( delay, durationSeconds - delay ) );
+
+ Vector3 seventyFivePercentProgress(targetPosition * 0.75f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), Vector3::ZERO, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f*0.75)/* 7/8 animation progress, 3/4 animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), seventyFivePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f*0.25) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorPositionAlphaFunctionTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), Vector3::ZERO, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(200.0f, 200.0f, 200.0f);
+ float delay = 0.5f;
+ animation.AnimateTo( Property(actor, Actor::POSITION),
+ targetPosition,
+ AlphaFunctions::Linear,
+ TimePeriod( delay, durationSeconds - delay ) );
+
+ Vector3 seventyFivePercentProgress(targetPosition * 0.75f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), Vector3::ZERO, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f*0.75)/* 7/8 animation progress, 3/4 animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), seventyFivePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f*0.25) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorRotationAngleAxis(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree targetRotationDegrees(90.0f);
+ Radian targetRotationRadians(targetRotationDegrees);
+ animation.AnimateTo( Property(actor, Actor::ROTATION), AngleAxis(targetRotationRadians, Vector3::YAXIS) );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * 0.25f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * 0.5f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * 0.75f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorRotationQuaternion(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree targetRotationDegrees(90.0f);
+ Radian targetRotationRadians(targetRotationDegrees);
+ Quaternion targetRotation(targetRotationRadians, Vector3::YAXIS);
+ animation.AnimateTo( Property(actor, Actor::ROTATION), targetRotation );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * 0.25f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * 0.5f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * 0.75f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorRotationAlphaFunction(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree targetRotationDegrees(90.0f);
+ Radian targetRotationRadians(targetRotationDegrees);
+ animation.AnimateTo( Property(actor, Actor::ROTATION), AngleAxis(targetRotationDegrees, Vector3::YAXIS), AlphaFunctions::EaseIn);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(0.25f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(0.5f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(0.75f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorRotationTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree targetRotationDegrees(90.0f);
+ Radian targetRotationRadians(targetRotationDegrees);
+ float delay(0.1f);
+ animation.AnimateTo( Property(actor, Actor::ROTATION), AngleAxis(targetRotationDegrees, Vector3::YAXIS), TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ float progress = max(0.0f, 0.25f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * progress, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ progress = max(0.0f, 0.5f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * progress, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ progress = max(0.0f, 0.75f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * progress, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorRotationAlphaFunctionTimePeriod(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree targetRotationDegrees(90.0f);
+ Radian targetRotationRadians(targetRotationDegrees);
+ float delay(0.1f);
+ animation.AnimateTo( Property(actor, Actor::ROTATION), AngleAxis(targetRotationDegrees, Vector3::YAXIS), AlphaFunctions::EaseIn, TimePeriod(delay, durationSeconds - delay));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ float progress = max(0.0f, 0.25f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ progress = max(0.0f, 0.5f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ progress = max(0.0f, 0.75f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorScale(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), Vector3::ONE, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetScale(2.0f, 2.0f, 2.0f);
+ animation.AnimateTo( Property(actor, Actor::SCALE), targetScale );
+
+ Vector3 ninetyNinePercentProgress(Vector3::ONE + (targetScale - Vector3::ONE)*0.99f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*990.0f)/* 99% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), ninetyNinePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*10.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), targetScale, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetScale(Vector3::ONE);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), Vector3::ONE, TEST_LOCATION );
+
+ // Repeat with a different (ease-in) alpha function
+ animation = Animation::New(durationSeconds);
+ animation.AnimateTo( Property(actor, Actor::SCALE), targetScale, AlphaFunctions::EaseIn);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*990.0f)/* 99% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The scale should have grown less, than with a linear alpha function
+ Vector3 current(actor.GetCurrentScale());
+ DALI_TEST_CHECK( current.x > 1.0f );
+ DALI_TEST_CHECK( current.y > 1.0f );
+ DALI_TEST_CHECK( current.z > 1.0f );
+ DALI_TEST_CHECK( current.x < ninetyNinePercentProgress.x );
+ DALI_TEST_CHECK( current.y < ninetyNinePercentProgress.y );
+ DALI_TEST_CHECK( current.z < ninetyNinePercentProgress.z );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*10.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), targetScale, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetScale(Vector3::ONE);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), Vector3::ONE, TEST_LOCATION );
+
+ // Repeat with a delay
+ float delay = 0.5f;
+ animation = Animation::New(durationSeconds);
+ animation.AnimateTo( Property(actor, Actor::SCALE), targetScale, AlphaFunctions::Linear, TimePeriod(delay, durationSeconds - delay));
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), Vector3::ONE, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), targetScale, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorScaleX(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(1.0f);
+ DALI_TEST_EQUALS( actor.GetCurrentScale().x, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_X), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Y), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Z), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetX(10.0f);
+ animation.AnimateTo( Property(actor, Actor::SCALE_X), targetX );
+
+ float fiftyPercentProgress(startValue + (targetX - startValue)*0.5f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale().x, fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_X), fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Y), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Z), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale().x, targetX, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_X), targetX, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Y), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Z), startValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorScaleY(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(1.0f);
+ DALI_TEST_EQUALS( actor.GetCurrentScale().y, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_X), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Y), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Z), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetY(1000.0f);
+ animation.AnimateTo( Property(actor, Actor::SCALE_Y), targetY );
+
+ float fiftyPercentProgress(startValue + (targetY - startValue)*0.5f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale().y, fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_X), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Y), fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Z), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale().y, targetY, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_X), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Y), targetY, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Z), startValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorScaleZ(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(1.0f);
+ DALI_TEST_EQUALS( actor.GetCurrentScale().z, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_X), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Y), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Z), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetZ(-1000.0f);
+ animation.AnimateTo( Property(actor, Actor::SCALE_Z), targetZ );
+
+ float fiftyPercentProgress(startValue + (targetZ - startValue)*0.5f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale().z, fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_X), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Y), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Z), fiftyPercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale().z, targetZ, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_X), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Y), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::SCALE_Z), targetZ, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorColor(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), Color::WHITE, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector4 targetColor(Color::RED);
+ animation.AnimateTo( Property(actor, Actor::COLOR), targetColor );
+
+ Vector4 tenPercentProgress(Vector4(1.0f, 0.9f, 0.9f, 1.0f));
+ Vector4 twentyPercentProgress(Vector4(1.0f, 0.8f, 0.8f, 1.0f));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*100.0f)/* 10% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), tenPercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*900.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), targetColor, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetColor(Color::WHITE);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), Color::WHITE, TEST_LOCATION );
+
+ // Repeat with a different (ease-in) alpha function
+ animation = Animation::New(durationSeconds);
+ animation.AnimateTo( Property(actor, Actor::COLOR), targetColor, AlphaFunctions::EaseIn);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*100.0f)/* 10% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The color should have changed less, than with a linear alpha function
+ Vector4 current(actor.GetCurrentColor());
+ DALI_TEST_CHECK( current.x == 1.0f ); // doesn't change
+ DALI_TEST_CHECK( current.y < 1.0f );
+ DALI_TEST_CHECK( current.y > tenPercentProgress.y );
+ DALI_TEST_CHECK( current.z < 1.0f );
+ DALI_TEST_CHECK( current.z > tenPercentProgress.z );
+ DALI_TEST_CHECK( current.w == 1.0f ); // doesn't change
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*900.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), targetColor, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetColor(Color::WHITE);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), Color::WHITE, TEST_LOCATION );
+
+ // Repeat with a shorter animator duration
+ float animatorDuration = 0.5f;
+ animation = Animation::New(durationSeconds);
+ animation.AnimateTo( Property(actor, Actor::COLOR), targetColor, AlphaFunctions::Linear, TimePeriod(animatorDuration));
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*100.0f)/* 10% animation progress, 20% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), twentyPercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*400.0f)/* 50% animation progress, 100% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), targetColor, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), targetColor, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorColorRed(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(1.0f);
+ DALI_TEST_EQUALS( actor.GetCurrentColor().r, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetRed(0.5f);
+ animation.AnimateTo( Property(actor, Actor::COLOR_RED), targetRed );
+
+ float fiftyPercentProgress(startValue + (targetRed - startValue)*0.5f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor().r, fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor().r, targetRed, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), targetRed, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), startValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorColorGreen(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(1.0f);
+ DALI_TEST_EQUALS( actor.GetCurrentColor().g, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetGreen(0.5f);
+ animation.AnimateTo( Property(actor, Actor::COLOR_GREEN), targetGreen );
+
+ float fiftyPercentProgress(startValue + (targetGreen - startValue)*0.5f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor().g, fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor().g, targetGreen, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), targetGreen, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), startValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorColorBlue(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(1.0f);
+ DALI_TEST_EQUALS( actor.GetCurrentColor().b, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetBlue(0.5f);
+ animation.AnimateTo( Property(actor, Actor::COLOR_BLUE), targetBlue );
+
+ float fiftyPercentProgress(startValue + (targetBlue - startValue)*0.5f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor().b, fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor().b, targetBlue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), targetBlue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), startValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateToActorColorAlpha(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ float startValue(1.0f);
+ DALI_TEST_EQUALS( actor.GetCurrentColor().a, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetAlpha(0.5f);
+ animation.AnimateTo( Property(actor, Actor::COLOR_ALPHA), targetAlpha );
+
+ float fiftyPercentProgress(startValue + (targetAlpha - startValue)*0.5f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor().a, fiftyPercentProgress, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), fiftyPercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor().a, targetAlpha, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), targetAlpha, TEST_LOCATION );
+ END_TEST;
+}
+
+
+
+int UtcDaliAnimationKeyFrames01(void)
+{
+ TestApplication application;
+
+ KeyFrames keyFrames = KeyFrames::New();
+ DALI_TEST_EQUALS(keyFrames.GetType(), Property::NONE, TEST_LOCATION);
+
+ keyFrames.Add(0.0f, 0.1f);
+ keyFrames.Add(0.2f, 0.5f);
+ keyFrames.Add(0.4f, 0.0f);
+ keyFrames.Add(0.6f, 1.0f);
+ keyFrames.Add(0.8f, 0.7f);
+ keyFrames.Add(1.0f, 0.9f);
+
+ DALI_TEST_EQUALS(keyFrames.GetType(), Property::FLOAT, TEST_LOCATION);
+
+ try
+ {
+ keyFrames.Add(1.9f, false);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "mType == value.GetType()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimationKeyFrames02(void)
+{
+ TestApplication application;
+
+ KeyFrames keyFrames = KeyFrames::New();
+ DALI_TEST_EQUALS(keyFrames.GetType(), Property::NONE, TEST_LOCATION);
+
+ keyFrames.Add(0.0f, true);
+ keyFrames.Add(0.2f, false);
+ keyFrames.Add(0.4f, false);
+ keyFrames.Add(0.6f, true);
+ keyFrames.Add(0.8f, true);
+ keyFrames.Add(1.0f, false);
+
+ DALI_TEST_EQUALS(keyFrames.GetType(), Property::BOOLEAN, TEST_LOCATION);
+
+ try
+ {
+ keyFrames.Add(0.7f, Vector3(1.0f, 1.0f, 1.0f));
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "mType == value.GetType()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+int UtcDaliAnimationKeyFrames03(void)
+{
+ TestApplication application;
+
+ KeyFrames keyFrames = KeyFrames::New();
+ DALI_TEST_EQUALS(keyFrames.GetType(), Property::NONE, TEST_LOCATION);
+
+ keyFrames.Add(0.0f, Vector2(0.0f, 0.0f));
+ keyFrames.Add(0.2f, Vector2(1.0f, 1.0f));
+ keyFrames.Add(0.4f, Vector2(2.0f, 2.0f));
+ keyFrames.Add(0.6f, Vector2(3.0f, 5.0f));
+ keyFrames.Add(0.8f, Vector2(4.0f, 3.0f));
+ keyFrames.Add(1.0f, Vector2(6.0f, 2.0f));
+
+ DALI_TEST_EQUALS(keyFrames.GetType(), Property::VECTOR2, TEST_LOCATION);
+
+ try
+ {
+ keyFrames.Add(0.7f, Vector3(1.0f, 1.0f, 1.0f));
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "mType == value.GetType()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+int UtcDaliAnimationKeyFrames04(void)
+{
+ TestApplication application;
+
+ KeyFrames keyFrames = KeyFrames::New();
+ DALI_TEST_EQUALS(keyFrames.GetType(), Property::NONE, TEST_LOCATION);
+
+ keyFrames.Add(0.0f, Vector3(0.0f, 4.0f, 0.0f));
+ keyFrames.Add(0.2f, Vector3(1.0f, 3.0f, 1.0f));
+ keyFrames.Add(0.4f, Vector3(2.0f, 2.0f, 2.0f));
+ keyFrames.Add(0.6f, Vector3(3.0f, 2.0f, 5.0f));
+ keyFrames.Add(0.8f, Vector3(4.0f, 4.0f, 3.0f));
+ keyFrames.Add(1.0f, Vector3(6.0f, 8.0f, 2.0f));
+
+ DALI_TEST_EQUALS(keyFrames.GetType(), Property::VECTOR3, TEST_LOCATION);
+
+ try
+ {
+ keyFrames.Add(0.7f, 1.0f);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "mType == value.GetType()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliAnimationKeyFrames05(void)
+{
+ TestApplication application;
+
+ KeyFrames keyFrames = KeyFrames::New();
+ DALI_TEST_EQUALS(keyFrames.GetType(), Property::NONE, TEST_LOCATION);
+
+ keyFrames.Add(0.0f, Vector4(0.0f, 0.0f, 0.0f, 0.0f));
+ keyFrames.Add(0.2f, Vector4(1.0f, 1.0f, 1.0f, 1.0f));
+ keyFrames.Add(0.4f, Vector4(2.0f, 2.0f, 2.0f, 2.0f));
+ keyFrames.Add(0.6f, Vector4(3.0f, 5.0f, 3.0f, 5.0f));
+ keyFrames.Add(0.8f, Vector4(4.0f, 3.0f, 4.0f, 3.0f));
+ keyFrames.Add(1.0f, Vector4(6.0f, 2.0f, 6.0f, 2.0f));
+
+ DALI_TEST_EQUALS(keyFrames.GetType(), Property::VECTOR4, TEST_LOCATION);
+
+ try
+ {
+ keyFrames.Add(0.7f, Quaternion(1.717f, Vector3::XAXIS));
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "mType == value.GetType()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+int UtcDaliAnimationKeyFrames06(void)
+{
+ TestApplication application;
+
+ KeyFrames keyFrames = KeyFrames::New();
+ DALI_TEST_EQUALS(keyFrames.GetType(), Property::NONE, TEST_LOCATION);
+
+ keyFrames.Add(0.0f, Quaternion(1.717f, Vector3::XAXIS));
+ keyFrames.Add(0.2f, Quaternion(2.0f, Vector3::XAXIS));
+ keyFrames.Add(0.4f, Quaternion(3.0f, Vector3::ZAXIS));
+ keyFrames.Add(0.6f, Quaternion(4.0f, Vector3(1.0f, 1.0f, 1.0f)));
+ keyFrames.Add(0.8f, AngleAxis(Degree(90), Vector3::XAXIS));
+ keyFrames.Add(1.0f, Quaternion(3.0f, Vector3::YAXIS));
+
+ DALI_TEST_EQUALS(keyFrames.GetType(), Property::ROTATION, TEST_LOCATION);
+
+ try
+ {
+ keyFrames.Add(0.7f, 1.1f);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "mType == value.GetType()", TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+
+
+
+int UtcDaliAnimationAnimateBetweenActorColorAlpha(void)
+{
+ TestApplication application;
+
+ float startValue(1.0f);
+ Actor actor = Actor::New();
+ actor.SetColor(Vector4(startValue, startValue, startValue, startValue));
+ Stage::GetCurrent().Add(actor);
+
+ DALI_TEST_EQUALS( actor.GetCurrentColor().a, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+
+ KeyFrames keyFrames = KeyFrames::New();
+ keyFrames.Add(0.0f, 0.1f);
+ keyFrames.Add(0.2f, 0.5f);
+ keyFrames.Add(0.4f, 0.0f);
+ keyFrames.Add(0.6f, 1.0f);
+ keyFrames.Add(0.8f, 0.7f);
+ keyFrames.Add(1.0f, 0.9f);
+
+ animation.AnimateBetween( Property(actor, Actor::COLOR_ALPHA), keyFrames );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ application.SendNotification();
+ application.Render(0);
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor().a, 0.1f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*100.0f)/* 10% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.3f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetCurrentColor().a, 0.3f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*200.0f)/* 30% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.25f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetCurrentColor().a, 0.25f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*100.0f)/* 40% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.0f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetCurrentColor().a, 0.0f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*400.0f)/* 80% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.7f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetCurrentColor().a, 0.7f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*100.0f)/* 90% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.8f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetCurrentColor().a, 0.8f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*100.0f)+1/* 100% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.9f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetCurrentColor().a, 0.9f, 0.01f, TEST_LOCATION );
+
+ // We did expect the animation to finish
+
+ finishCheck.CheckSignalReceived();
+ END_TEST;
+}
+
+
+int UtcDaliAnimationAnimateBetweenActorColor(void)
+{
+ TestApplication application;
+
+ float startValue(1.0f);
+ Actor actor = Actor::New();
+ actor.SetColor(Vector4(startValue, startValue, startValue, startValue));
+ Stage::GetCurrent().Add(actor);
+
+ DALI_TEST_EQUALS( actor.GetCurrentColor().a, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+
+ KeyFrames keyFrames = KeyFrames::New();
+ keyFrames.Add(0.0f, Vector4(0.1f, 0.2f, 0.3f, 0.4f));
+ keyFrames.Add(0.5f, Vector4(0.9f, 0.8f, 0.7f, 0.6f));
+ keyFrames.Add(1.0f, Vector4(1.0f, 1.0f, 1.0f, 1.0f));
+
+ animation.AnimateBetween( Property(actor, Actor::COLOR), keyFrames );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ application.SendNotification();
+ application.Render(0);
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 0.1f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 0.2f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 0.3f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.4f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 0.5f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 0.5f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 0.5f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.5f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 0.9f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 0.8f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 0.7f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.6f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 0.95f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 0.90f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 0.85f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.80f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)+1/* 100% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 1.0f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 1.0f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 1.0f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 1.0f, 0.01f, TEST_LOCATION );
+
+ // We did expect the animation to finish
+
+ finishCheck.CheckSignalReceived();
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateBetweenActorVisible01(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ AngleAxis aa(Degree(90), Vector3::XAXIS);
+ actor.SetRotation(aa.angle, aa.axis);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( actor.IsVisible(), true, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+
+ KeyFrames keyFrames = KeyFrames::New();
+ keyFrames.Add(0.0f, false);
+ keyFrames.Add(0.2f, true);
+ keyFrames.Add(0.4f, true);
+ keyFrames.Add(0.8f, false);
+ keyFrames.Add(1.0f, true);
+
+ animation.AnimateBetween( Property(actor, Actor::VISIBLE), keyFrames );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ application.SendNotification();
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f));
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)+1);
+ application.SendNotification();
+
+ DALI_TEST_EQUALS( actor.IsVisible(), true, TEST_LOCATION);
+ finishCheck.CheckSignalReceived();
+ END_TEST;
+}
+
+#if 0
+// Valid test case, but no fix in dali-core yet.
+//int UtcDaliAnimationAnimateBetweenActorRotation01(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ AngleAxis aa(Degree(90), Vector3::XAXIS);
+ actor.SetRotation(aa.angle, aa.axis);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(0);
+ Quaternion start(Radian(aa.angle), aa.axis);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), start, 0.001f, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+
+ KeyFrames keyFrames = KeyFrames::New();
+ keyFrames.Add(0.0f, AngleAxis(Degree(60), Vector3::ZAXIS));
+
+ animation.AnimateBetween( Property(actor, Actor::ROTATION), keyFrames );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ application.SendNotification();
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f));
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)+1);
+ application.SendNotification();
+
+ Quaternion check = Quaternion::FromAxisAngle(Vector4::ZAXIS, Radian(Degree(60)));
+ // THIS CHECK IS CURRENTLY FAILING!!!!
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), check, 0.001f, TEST_LOCATION );
+ finishCheck.CheckSignalReceived();
+ END_TEST;
+}
+#endif
+
+int UtcDaliAnimationAnimateBetweenActorRotation02(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ AngleAxis aa(Degree(90), Vector3::XAXIS);
+ actor.SetRotation(aa.angle, aa.axis);
+ application.SendNotification();
+ application.Render(0);
+ Stage::GetCurrent().Add(actor);
+
+ Quaternion start(Radian(aa.angle), aa.axis);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), start, 0.001f, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+
+ KeyFrames keyFrames = KeyFrames::New();
+ keyFrames.Add(0.0f, AngleAxis(Degree(60), Vector3::XAXIS));
+ keyFrames.Add(0.5f, AngleAxis(Degree(120), Vector3::XAXIS));
+ keyFrames.Add(1.0f, AngleAxis(Degree(120), Vector3::YAXIS));
+
+ animation.AnimateBetween( Property(actor, Actor::ROTATION), keyFrames );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ application.SendNotification();
+ application.Render(0);
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ Quaternion check(Radian(Degree(60)), Vector3::XAXIS);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), check, 0.001f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+ application.SendNotification();
+ check = Quaternion::FromAxisAngle(Vector4::XAXIS, Radian(Degree(90)));
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), check, 0.001f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+ application.SendNotification();
+ check = Quaternion::FromAxisAngle(Vector4::XAXIS, Radian(Degree(120)));
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), check, 0.001f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+ application.SendNotification();
+ check = Quaternion::FromAxisAngle(Vector4(0.5f, 0.5f, 0.0f, 0.0f), Radian(Degree(101.5)));
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), check, 0.001f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)+1/* 100% progress */);
+ application.SendNotification();
+ check = Quaternion::FromAxisAngle(Vector4::YAXIS, Radian(Degree(120)));
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), check, 0.001f, TEST_LOCATION );
+
+ // We did expect the animation to finish
+
+ finishCheck.CheckSignalReceived();
+ END_TEST;
+}
+
+int UtcDaliAnimationMoveByFloat3(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 startPosition(10.0f, 10.0f, 10.0f);
+ actor.SetPosition(startPosition);
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), startPosition, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(20.0f, 20.0f, 20.0f);
+ Vector3 relativePosition(targetPosition - startPosition);
+ animation.MoveBy(actor, relativePosition.x, relativePosition.y, relativePosition.z);
+
+ Vector3 ninetyFivePercentProgress(startPosition + relativePosition*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), ninetyFivePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationMoveByVector3Alpha(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 startPosition(10.0f, 10.0f, 10.0f);
+ actor.SetPosition(startPosition);
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), startPosition, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(20.0f, 20.0f, 20.0f);
+ Vector3 relativePosition(targetPosition - startPosition);
+ animation.MoveBy(actor, relativePosition, AlphaFunctions::EaseOut);
+
+ Vector3 ninetyFivePercentProgress(startPosition + relativePosition*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*950.0f)/* 95% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The position should have moved more, than with a linear alpha function
+ Vector3 current(actor.GetCurrentPosition());
+ DALI_TEST_CHECK( current.x > ninetyFivePercentProgress.x );
+ DALI_TEST_CHECK( current.y > ninetyFivePercentProgress.y );
+ DALI_TEST_CHECK( current.z > ninetyFivePercentProgress.z );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*50.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationMoveByVector3AlphaFloat2(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 startPosition(10.0f, 10.0f, 10.0f);
+ actor.SetPosition(startPosition);
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), startPosition, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(20.0f, 20.0f, 20.0f);
+ Vector3 relativePosition(targetPosition - startPosition);
+ float delay = 0.5f;
+ animation.MoveBy(actor, relativePosition, AlphaFunctions::Linear, delay, durationSeconds - delay);
+
+ Vector3 ninetyFivePercentProgress(startPosition + relativePosition*0.95f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), startPosition, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationMoveToFloat3(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), Vector3::ZERO, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(200.0f, 200.0f, 200.0f);
+ animation.MoveTo(actor, targetPosition.x, targetPosition.y, targetPosition.z);
+
+ Vector3 seventyFivePercentProgress(targetPosition * 0.75f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*750.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), seventyFivePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationMoveToVector3Alpha(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), Vector3::ZERO, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(200.0f, 200.0f, 200.0f);
+ animation.MoveTo(actor, targetPosition, AlphaFunctions::EaseIn);
+
+ Vector3 seventyFivePercentProgress(targetPosition * 0.75f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*750.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The position should have moved less, than with a linear alpha function
+ Vector3 current(actor.GetCurrentPosition());
+ DALI_TEST_CHECK( current.x > Vector3::ZERO.x );
+ DALI_TEST_CHECK( current.y > Vector3::ZERO.y );
+ DALI_TEST_CHECK( current.z > Vector3::ZERO.z );
+ DALI_TEST_CHECK( current.x < seventyFivePercentProgress.x );
+ DALI_TEST_CHECK( current.y < seventyFivePercentProgress.y );
+ DALI_TEST_CHECK( current.z < seventyFivePercentProgress.z );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationMoveToVector3AlphaFloat2(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), Vector3::ZERO, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(200.0f, 200.0f, 200.0f);
+ float delay = 0.5f;
+ animation.MoveTo(actor, targetPosition, AlphaFunctions::Linear, delay, durationSeconds - delay);
+
+ Vector3 seventyFivePercentProgress(targetPosition * 0.75f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), Vector3::ZERO, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f*0.75)/* 7/8 animation progress, 3/4 animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), seventyFivePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f*0.25) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationMove(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 initialPosition(Vector3::ZERO);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), initialPosition, TEST_LOCATION );
+ Stage::GetCurrent().Add(actor);
+
+ // Build the animation
+ float durationSeconds(10.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(200.0f, 200.0f, 200.0f);
+ BounceFunc func(0.0f, 0.0f, -100.0f);
+ animation.Move(actor, func, AlphaFunctions::Linear, 0.0f, durationSeconds);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), func(0.25f, initialPosition), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), func(0.5f, initialPosition), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), func(0.75f, initialPosition), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), initialPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationRotateByDegreeVector3(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree relativeRotationDegrees(360.0f);
+ Radian relativeRotationRadians(relativeRotationDegrees);
+ animation.RotateBy(actor, relativeRotationDegrees/*Degree version*/, Vector3::YAXIS);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * 0.25f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * 0.5f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * 0.75f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationRotateByRadianVector3(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree relativeRotationDegrees(360.0f);
+ Radian relativeRotationRadians(relativeRotationDegrees);
+ animation.RotateBy(actor, relativeRotationRadians/*Radian version*/, Vector3::YAXIS);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * 0.25f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * 0.5f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * 0.75f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationRotateByDegreeVector3Alpha(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree relativeRotationDegrees(360.0f);
+ Radian relativeRotationRadians(relativeRotationDegrees);
+ animation.RotateBy(actor, relativeRotationDegrees/*Degree version*/, Vector3::YAXIS, AlphaFunctions::EaseIn);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * AlphaFunctions::EaseIn(0.25f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * AlphaFunctions::EaseIn(0.5f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * AlphaFunctions::EaseIn(0.75f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationRotateByRadianVector3Alpha(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree relativeRotationDegrees(360.0f);
+ Radian relativeRotationRadians(relativeRotationDegrees);
+ animation.RotateBy(actor, relativeRotationRadians/*Radian version*/, Vector3::YAXIS, AlphaFunctions::EaseIn);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * AlphaFunctions::EaseIn(0.25f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * AlphaFunctions::EaseIn(0.5f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * AlphaFunctions::EaseIn(0.75f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationRotateByDegreeVector3AlphaFloat2(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree relativeRotationDegrees(360.0f);
+ Radian relativeRotationRadians(relativeRotationDegrees);
+ float delay = 0.3f;
+ animation.RotateBy(actor, relativeRotationDegrees/*Degree version*/, Vector3::YAXIS, AlphaFunctions::EaseIn, delay, durationSeconds - delay);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ float progress = max(0.0f, 0.25f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ progress = max(0.0f, 0.5f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ progress = max(0.0f, 0.75f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+
+int UtcDaliAnimationRotateByRadianVector3AlphaFloat2(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree relativeRotationDegrees(360.0f);
+ Radian relativeRotationRadians(relativeRotationDegrees);
+ float delay = 0.3f;
+ animation.RotateBy(actor, relativeRotationRadians/*Radian version*/, Vector3::YAXIS, AlphaFunctions::EaseIn, delay, durationSeconds - delay);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ float progress = max(0.0f, 0.25f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ progress = max(0.0f, 0.5f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ progress = max(0.0f, 0.75f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(relativeRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationRotateToDegreeVector3(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree targetRotationDegrees(90.0f);
+ Radian targetRotationRadians(targetRotationDegrees);
+ animation.RotateTo(actor, targetRotationDegrees/*Degree version*/, Vector3::YAXIS);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * 0.25f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * 0.5f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * 0.75f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationRotateToRadianVector3(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree targetRotationDegrees(90.0f);
+ Radian targetRotationRadians(targetRotationDegrees);
+ animation.RotateTo(actor, targetRotationRadians/*Radian version*/, Vector3::YAXIS);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * 0.25f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * 0.5f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * 0.75f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationRotateToQuaternion(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree targetRotationDegrees(90.0f);
+ Radian targetRotationRadians(targetRotationDegrees);
+ Quaternion targetRotation(targetRotationRadians, Vector3::YAXIS);
+ animation.RotateTo(actor, targetRotation/*Quaternion version*/);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * 0.25f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * 0.5f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * 0.75f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationRotateToDegreeVector3Alpha(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree targetRotationDegrees(90.0f);
+ Radian targetRotationRadians(targetRotationDegrees);
+ animation.RotateTo(actor, targetRotationDegrees/*Degree version*/, Vector3::YAXIS, AlphaFunctions::EaseIn);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(0.25f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(0.5f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(0.75f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationRotateToRadianVector3Alpha(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree targetRotationDegrees(90.0f);
+ Radian targetRotationRadians(targetRotationDegrees);
+ animation.RotateTo(actor, targetRotationRadians/*Radian version*/, Vector3::YAXIS, AlphaFunctions::EaseIn);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(0.25f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(0.5f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(0.75f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationRotateToQuaternionAlpha(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree targetRotationDegrees(90.0f);
+ Radian targetRotationRadians(targetRotationDegrees);
+ Quaternion targetRotation(targetRotationRadians, Vector3::YAXIS);
+ animation.RotateTo(actor, targetRotation/*Quaternion version*/, AlphaFunctions::EaseIn);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(0.25f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(0.5f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(0.75f), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationRotateToDegreeVector3AlphaFloat2(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree targetRotationDegrees(90.0f);
+ Radian targetRotationRadians(targetRotationDegrees);
+ float delay(0.1f);
+ animation.RotateTo(actor, targetRotationDegrees/*Degree version*/, Vector3::YAXIS, AlphaFunctions::EaseIn, delay, durationSeconds - delay);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ float progress = max(0.0f, 0.25f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ progress = max(0.0f, 0.5f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ progress = max(0.0f, 0.75f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationRotateToRadianVector3AlphaFloat2(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree targetRotationDegrees(90.0f);
+ Radian targetRotationRadians(targetRotationDegrees);
+ float delay(0.1f);
+ animation.RotateTo(actor, targetRotationRadians/*Radian version*/, Vector3::YAXIS, AlphaFunctions::EaseIn, delay, durationSeconds - delay);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ float progress = max(0.0f, 0.25f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ progress = max(0.0f, 0.5f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ progress = max(0.0f, 0.75f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationRotateToQuaternionAlphaFloat2(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Degree targetRotationDegrees(90.0f);
+ Radian targetRotationRadians(targetRotationDegrees);
+ float delay(0.1f);
+ Quaternion targetRotation(targetRotationRadians, Vector3::YAXIS);
+ animation.RotateTo(actor, targetRotation/*Quaternion version*/, AlphaFunctions::EaseIn, delay, durationSeconds - delay);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ float progress = max(0.0f, 0.25f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ progress = max(0.0f, 0.5f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ progress = max(0.0f, 0.75f - delay) / (1.0f - delay);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians * AlphaFunctions::EaseIn(progress), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(targetRotationRadians, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationRotate(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Quaternion initialRotation(0.0f, Vector3::YAXIS);
+ actor.SetRotation(initialRotation);
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), initialRotation, ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ TumbleFunc func(Vector3::YAXIS);
+ animation.Rotate(actor, func, AlphaFunctions::Linear, 0.0f, durationSeconds);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), func(0.25f, initialRotation), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), func(0.5f, initialRotation), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), func(0.75f, initialRotation), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), func(1.0f, initialRotation), ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationScaleBy(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), Vector3::ONE, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetScale(2.0f, 2.0f, 2.0f);
+ Vector3 relativeScale(targetScale - Vector3::ONE);
+ animation.ScaleBy(actor, relativeScale.x, relativeScale.y, relativeScale.z);
+
+ Vector3 ninetyNinePercentProgress(Vector3::ONE + relativeScale*0.99f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*990.0f)/* 99% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), ninetyNinePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*10.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), targetScale, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetScale(Vector3::ONE);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), Vector3::ONE, TEST_LOCATION );
+
+ // Repeat with a different (ease-in) alpha function
+ animation = Animation::New(durationSeconds);
+ animation.ScaleBy(actor, relativeScale, AlphaFunctions::EaseIn);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*990.0f)/* 99% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The scale should have grown less, than with a linear alpha function
+ Vector3 current(actor.GetCurrentScale());
+ DALI_TEST_CHECK( current.x > 1.0f );
+ DALI_TEST_CHECK( current.y > 1.0f );
+ DALI_TEST_CHECK( current.z > 1.0f );
+ DALI_TEST_CHECK( current.x < ninetyNinePercentProgress.x );
+ DALI_TEST_CHECK( current.y < ninetyNinePercentProgress.y );
+ DALI_TEST_CHECK( current.z < ninetyNinePercentProgress.z );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*10.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), targetScale, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetScale(Vector3::ONE);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), Vector3::ONE, TEST_LOCATION );
+
+ // Repeat with a delay
+ float delay = 0.5f;
+ animation = Animation::New(durationSeconds);
+ animation.ScaleBy(actor, relativeScale, AlphaFunctions::Linear, delay, durationSeconds - delay);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), Vector3::ONE, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), targetScale, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationScaleTo(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), Vector3::ONE, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetScale(2.0f, 2.0f, 2.0f);
+ animation.ScaleTo(actor, targetScale.x, targetScale.y, targetScale.z);
+
+ Vector3 ninetyNinePercentProgress(Vector3::ONE + (targetScale - Vector3::ONE)*0.99f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*990.0f)/* 99% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), ninetyNinePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*10.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), targetScale, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetScale(Vector3::ONE);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), Vector3::ONE, TEST_LOCATION );
+
+ // Repeat with a different (ease-in) alpha function
+ animation = Animation::New(durationSeconds);
+ animation.ScaleTo(actor, targetScale, AlphaFunctions::EaseIn);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*990.0f)/* 99% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The scale should have grown less, than with a linear alpha function
+ Vector3 current(actor.GetCurrentScale());
+ DALI_TEST_CHECK( current.x > 1.0f );
+ DALI_TEST_CHECK( current.y > 1.0f );
+ DALI_TEST_CHECK( current.z > 1.0f );
+ DALI_TEST_CHECK( current.x < ninetyNinePercentProgress.x );
+ DALI_TEST_CHECK( current.y < ninetyNinePercentProgress.y );
+ DALI_TEST_CHECK( current.z < ninetyNinePercentProgress.z );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*10.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), targetScale, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetScale(Vector3::ONE);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), Vector3::ONE, TEST_LOCATION );
+
+ // Repeat with a delay
+ float delay = 0.5f;
+ animation = Animation::New(durationSeconds);
+ animation.ScaleTo(actor, targetScale, AlphaFunctions::Linear, delay, durationSeconds - delay);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), Vector3::ONE, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), targetScale, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationShow(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetVisible(false);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( !actor.IsVisible() );
+ Stage::GetCurrent().Add(actor);
+
+ // Start the animation
+ float durationSeconds(10.0f);
+ Animation animation = Animation::New(durationSeconds);
+ animation.Show(actor, durationSeconds*0.5f);
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*490.0f));
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_CHECK( !actor.IsVisible() );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*10.0f)/*Should be shown now*/);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_CHECK( actor.IsVisible() );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_CHECK( actor.IsVisible() );
+ END_TEST;
+}
+
+int UtcDaliAnimationHide(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ DALI_TEST_CHECK( actor.IsVisible() );
+ Stage::GetCurrent().Add(actor);
+
+ // Start the animation
+ float durationSeconds(10.0f);
+ Animation animation = Animation::New(durationSeconds);
+ animation.Hide(actor, durationSeconds*0.5f);
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*490.0f));
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_CHECK( actor.IsVisible() );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*10.0f)/*Should be hidden now*/);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_CHECK( !actor.IsVisible() );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_CHECK( !actor.IsVisible() );
+ END_TEST;
+}
+
+int UtcDaliAnimationShowHideAtEnd(void)
+{
+ // Test that show/hide delay can be the same as animation duration
+ // i.e. to show/hide at the end of the animation
+
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ DALI_TEST_CHECK( actor.IsVisible() );
+ Stage::GetCurrent().Add(actor);
+
+ // Start Hide animation
+ float durationSeconds(10.0f);
+ Animation animation = Animation::New(durationSeconds);
+ animation.Hide(actor, durationSeconds/*Hide at end*/);
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*1000.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_CHECK( !actor.IsVisible() );
+
+ // Start Show animation
+ animation = Animation::New(durationSeconds);
+ animation.Show(actor, durationSeconds/*Show at end*/);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*1000.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_CHECK( actor.IsVisible() );
+ END_TEST;
+}
+
+int UtcDaliAnimationOpacityBy(void)
+{
+ TestApplication application;
+ Actor actor = Actor::New();
+ float startingOpacity(0.5f);
+ actor.SetOpacity(startingOpacity);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentOpacity(), startingOpacity, TEST_LOCATION );
+ Stage::GetCurrent().Add(actor);
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float relativeOpacity(-0.5f); // target of zero
+ animation.OpacityBy(actor, relativeOpacity);
+
+ float seventyFivePercentProgress((1.0f - 0.75f) * startingOpacity);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*750.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentOpacity(), seventyFivePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentOpacity(), startingOpacity+relativeOpacity, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetOpacity(startingOpacity);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentOpacity(), startingOpacity, TEST_LOCATION );
+
+ // Repeat with a different (ease-in) alpha function
+ animation = Animation::New(durationSeconds);
+ animation.OpacityBy(actor, relativeOpacity, AlphaFunctions::EaseIn);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*750.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The opacity should reduce less, than with a linear alpha function
+ float current(actor.GetCurrentOpacity());
+ DALI_TEST_CHECK( current < 1.0f );
+ DALI_TEST_CHECK( current > seventyFivePercentProgress );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentOpacity(), startingOpacity+relativeOpacity, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetOpacity(startingOpacity);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentOpacity(), startingOpacity, TEST_LOCATION );
+
+ // Repeat with a delay
+ float delay = 0.5f;
+ animation = Animation::New(durationSeconds);
+ animation.OpacityBy(actor, relativeOpacity, AlphaFunctions::Linear, delay, durationSeconds - delay);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentOpacity(), startingOpacity, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f*0.75)/* 7/8 animation progress, 3/4 animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentOpacity(), seventyFivePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f*0.25) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentOpacity(), startingOpacity+relativeOpacity, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationOpacityTo(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentOpacity(), 1.0f, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetOpacity(0.0f);
+ animation.OpacityTo(actor, targetOpacity);
+
+ float ninetyNinePercentProgress(0.01f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*990.0f)/* 99% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentOpacity(), ninetyNinePercentProgress, 0.001f, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*10.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentOpacity(), targetOpacity, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetOpacity(1.0f);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentOpacity(), 1.0f, TEST_LOCATION );
+
+ // Repeat with a different (ease-in) alpha function
+ animation = Animation::New(durationSeconds);
+ animation.OpacityTo(actor, targetOpacity, AlphaFunctions::EaseIn);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*990.0f)/* 99% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The opacity should reduce less, than with a linear alpha function
+ float current(actor.GetCurrentOpacity());
+ DALI_TEST_CHECK( current < 1.0f );
+ DALI_TEST_CHECK( current > ninetyNinePercentProgress );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*10.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentOpacity(), targetOpacity, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetOpacity(1.0f);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentOpacity(), 1.0f, TEST_LOCATION );
+
+ // Repeat with a delay
+ float delay = 0.5f;
+ animation = Animation::New(durationSeconds);
+ animation.OpacityTo(actor, targetOpacity, AlphaFunctions::Linear, delay, durationSeconds - delay);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentOpacity(), 1.0f, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentOpacity(), targetOpacity, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationColorBy(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetColor(Color::BLACK);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), Color::BLACK, TEST_LOCATION );
+ Stage::GetCurrent().Add(actor);
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector4 targetColor(Color::GREEN);
+ Vector4 relativeColor(Color::GREEN); // Note the alpha is automatically clamped <= 1.0f in world color
+ animation.ColorBy(actor, relativeColor);
+
+ Vector4 tenPercentProgress(Vector4(0.0f, 0.1f, 0.0f, 1.0f));
+ Vector4 twentyPercentProgress(Vector4(0.0f, 0.2f, 0.0f, 1.0f));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*100.0f)/* 10% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentWorldColor(), tenPercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*900.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentWorldColor(), targetColor, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetColor(Color::BLACK);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentWorldColor(), Color::BLACK, TEST_LOCATION );
+
+ // Repeat with a different (ease-in) alpha function
+ animation = Animation::New(durationSeconds);
+ animation.ColorBy(actor, relativeColor, AlphaFunctions::EaseIn);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*100.0f)/* 10% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The color should have changed less, than with a linear alpha function
+ Vector4 current(actor.GetCurrentWorldColor());
+ DALI_TEST_CHECK( current.x == 0.0f ); // doesn't change
+ DALI_TEST_CHECK( current.y > 0.0f );
+ DALI_TEST_CHECK( current.y < tenPercentProgress.y );
+ DALI_TEST_CHECK( current.z == 0.0f ); // doesn't change
+ DALI_TEST_CHECK( current.w == 1.0f ); // doesn't change
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*900.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentWorldColor(), targetColor, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetColor(Color::BLACK);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentWorldColor(), Color::BLACK, TEST_LOCATION );
+
+ // Repeat with a shorter animator duration
+ float animatorDuration = 0.5f;
+ animation = Animation::New(durationSeconds);
+ animation.ColorBy(actor, relativeColor, AlphaFunctions::Linear, 0, animatorDuration);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*100.0f)/* 10% animation progress, 20% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentWorldColor(), twentyPercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*400.0f)/* 50% animation progress, 100% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentWorldColor(), targetColor, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentWorldColor(), targetColor, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationColorTo(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), Color::WHITE, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector4 targetColor(Color::RED);
+ animation.ColorTo(actor, targetColor);
+
+ Vector4 tenPercentProgress(Vector4(1.0f, 0.9f, 0.9f, 1.0f));
+ Vector4 twentyPercentProgress(Vector4(1.0f, 0.8f, 0.8f, 1.0f));
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*100.0f)/* 10% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), tenPercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*900.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), targetColor, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetColor(Color::WHITE);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), Color::WHITE, TEST_LOCATION );
+
+ // Repeat with a different (ease-in) alpha function
+ animation = Animation::New(durationSeconds);
+ animation.ColorTo(actor, targetColor, AlphaFunctions::EaseIn);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*100.0f)/* 10% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The color should have changed less, than with a linear alpha function
+ Vector4 current(actor.GetCurrentColor());
+ DALI_TEST_CHECK( current.x == 1.0f ); // doesn't change
+ DALI_TEST_CHECK( current.y < 1.0f );
+ DALI_TEST_CHECK( current.y > tenPercentProgress.y );
+ DALI_TEST_CHECK( current.z < 1.0f );
+ DALI_TEST_CHECK( current.z > tenPercentProgress.z );
+ DALI_TEST_CHECK( current.w == 1.0f ); // doesn't change
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*900.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), targetColor, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetColor(Color::WHITE);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), Color::WHITE, TEST_LOCATION );
+
+ // Repeat with a shorter animator duration
+ float animatorDuration = 0.5f;
+ animation = Animation::New(durationSeconds);
+ animation.ColorTo(actor, targetColor, AlphaFunctions::Linear, 0, animatorDuration);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*100.0f)/* 10% animation progress, 20% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), twentyPercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*400.0f)/* 50% animation progress, 100% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), targetColor, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), targetColor, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationResize(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetSize(100.0f, 100.0f, 100.0f);
+ animation.Resize(actor, targetSize);
+
+ Vector3 ninetyNinePercentProgress(targetSize * 0.99f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*990.0f)/* 99% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), ninetyNinePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*10.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), targetSize, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetSize(Vector3::ZERO);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ // Repeat with a different (ease-in) alpha function
+ animation = Animation::New(durationSeconds);
+ animation.Resize(actor, targetSize, AlphaFunctions::EaseIn);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*990.0f)/* 99% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The size should have travelled less, than with a linear alpha function
+ Vector3 current(actor.GetCurrentSize());
+ DALI_TEST_CHECK( current.x > 0.0f );
+ DALI_TEST_CHECK( current.y > 0.0f );
+ DALI_TEST_CHECK( current.z > 0.0f );
+ DALI_TEST_CHECK( current.x < ninetyNinePercentProgress.x );
+ DALI_TEST_CHECK( current.y < ninetyNinePercentProgress.y );
+ DALI_TEST_CHECK( current.z < ninetyNinePercentProgress.z );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*10.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), targetSize, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetSize(Vector3::ZERO);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ // Repeat with a delay
+ float delay = 0.5f;
+ animation = Animation::New(durationSeconds);
+ animation.Resize(actor, targetSize, AlphaFunctions::Linear, delay, durationSeconds - delay);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), targetSize, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateBool(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ DALI_TEST_EQUALS( actor.IsVisible(), true, TEST_LOCATION );
+ Stage::GetCurrent().Add(actor);
+
+ // Build the animation
+ float durationSeconds(10.0f);
+ Animation animation = Animation::New(durationSeconds);
+ animation.Animate<bool>( Property(actor, Actor::VISIBLE), ReturnFalseAfterProgressOne, TimePeriod(durationSeconds*0.25f/*delay*/, durationSeconds*0.1f) );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // Should still be visible
+ DALI_TEST_EQUALS( actor.IsVisible(), true, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // Now animate functor should have hidden the actor
+ DALI_TEST_EQUALS( actor.IsVisible(), false, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.IsVisible(), false, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateFloat(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ // Register a float property
+ float startValue(10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(10.0f);
+ Animation animation = Animation::New(durationSeconds);
+ float targetPosition(0.0f);
+ AnimateFloatTestFunctor func( 100, targetPosition );
+ animation.Animate<float>( Property(actor, index), func );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), 75.0f, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), 50.0f, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), 25.0f, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), targetPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateVector2(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ // Register a Vector2 property
+ Vector2 startValue(10.0f, 10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(10.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector2 targetPosition(0.0f, 0.0f);
+ AnimateVector2TestFunctor func( Vector2(100,100), targetPosition );
+ animation.Animate<Vector2>( Property(actor, index), func );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), Vector2(75,75), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), Vector2(50,50), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), Vector2(25,25), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), targetPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateVector3(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 initialPosition(Vector3::ZERO);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), initialPosition, TEST_LOCATION );
+ Stage::GetCurrent().Add(actor);
+
+ // Build the animation
+ float durationSeconds(10.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(200.0f, 200.0f, 200.0f);
+ BounceFunc func(0.0f, 0.0f, -100.0f);
+ animation.Animate<Vector3>( Property(actor, Actor::POSITION), func, AlphaFunctions::Linear, durationSeconds );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), func(0.25f, initialPosition), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), func(0.5f, initialPosition), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), func(0.75f, initialPosition), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), initialPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateVector4(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ // Register a Vector4 property
+ Vector4 startValue(10.0f, 10.0f, 10.0f, 10.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(10.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector4 targetPosition(200,400,0,-1000);
+ AnimateVector4TestFunctor func( Vector4(1000,1000,1000,1000), targetPosition );
+ animation.Animate<Vector4>( Property(actor, index), func );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), Vector4(800,850,750,500), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), Vector4(600,700,500,0), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), Vector4(400,550,250,-500), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), targetPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateQuaternion(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetRotation(Quaternion(0.0f, Vector3::YAXIS));
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+
+ Degree sourceRotationDegrees(90.0f);
+ Radian sourceRotationRadians(sourceRotationDegrees);
+ Quaternion sourceRotation(sourceRotationRadians, Vector3::YAXIS);
+
+ Degree targetRotationDegrees(150.0f);
+ Radian targetRotationRadians(targetRotationDegrees);
+ Quaternion targetRotation(targetRotationRadians, Vector3::YAXIS);
+
+ AnimateQuaternionTestFunctor func( sourceRotation, targetRotation );
+ animation.Animate<Quaternion>( Property(actor, Actor::ROTATION), func );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(Radian(Degree(105)), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(Radian(Degree(120)), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), Quaternion(Radian(Degree(135)), Vector3::YAXIS), ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentRotation(), targetRotation, ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliKeyFramesCreateDestroy(void)
+{
+ tet_infoline("Testing Dali::Animation::UtcDaliKeyFramesCreateDestroy()");
+
+ KeyFrames* keyFrames = new KeyFrames;
+ delete keyFrames;
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
+
+int UtcDaliKeyFramesDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Animation::KeyFramesDownCast()");
+
+ KeyFrames keyFrames = KeyFrames::New();
+ BaseHandle object(keyFrames);
+
+ KeyFrames keyFrames2 = KeyFrames::DownCast(object);
+ DALI_TEST_CHECK(keyFrames2);
+
+ KeyFrames keyFrames3 = DownCast< KeyFrames >(object);
+ DALI_TEST_CHECK(keyFrames3);
+
+ BaseHandle unInitializedObject;
+ KeyFrames keyFrames4 = KeyFrames::DownCast(unInitializedObject);
+ DALI_TEST_CHECK(!keyFrames4);
+
+ KeyFrames keyFrames5 = DownCast< KeyFrames >(unInitializedObject);
+ DALI_TEST_CHECK(!keyFrames5);
+ END_TEST;
+}
+
+int UtcDaliAnimationResizeByXY(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetSize(100.0f, 100.0f, 100.0f);
+ animation.Resize(actor, targetSize);
+
+ Vector3 ninetyNinePercentProgress(targetSize * 0.99f);
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*990.0f)/* 99% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), ninetyNinePercentProgress, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*10.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), targetSize, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetSize(Vector3::ZERO);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ // Repeat with a different (ease-in) alpha function
+ animation = Animation::New(durationSeconds);
+ animation.Resize(actor, targetSize.x, targetSize.y, AlphaFunctions::EaseIn);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*990.0f)/* 99% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+
+ // The size should have travelled less, than with a linear alpha function
+ Vector3 current(actor.GetCurrentSize());
+ DALI_TEST_CHECK( current.x > 0.0f );
+ DALI_TEST_CHECK( current.y > 0.0f );
+ DALI_TEST_CHECK( current.z > 0.0f );
+ DALI_TEST_CHECK( current.x < ninetyNinePercentProgress.x );
+ DALI_TEST_CHECK( current.y < ninetyNinePercentProgress.y );
+ DALI_TEST_CHECK( current.z < ninetyNinePercentProgress.z );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*10.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), targetSize, TEST_LOCATION );
+
+ // Reset everything
+ finishCheck.Reset();
+ actor.SetSize(Vector3::ZERO);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ // Repeat with a delay
+ float delay = 0.5f;
+ animation = Animation::New(durationSeconds);
+ animation.Resize(actor, targetSize.x, targetSize.y, AlphaFunctions::Linear, delay, durationSeconds - delay);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ animation.Play();
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f)/* 50% animation progress, 0% animator progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*500.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), targetSize, TEST_LOCATION );
+ END_TEST;
+}
+
+
+int UtcDaliAnimationAnimateBetweenActorColorTimePeriod(void)
+{
+ TestApplication application;
+
+ float startValue(1.0f);
+ Actor actor = Actor::New();
+ actor.SetColor(Vector4(startValue, startValue, startValue, startValue));
+ Stage::GetCurrent().Add(actor);
+
+ DALI_TEST_EQUALS( actor.GetCurrentColor().a, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+
+ KeyFrames keyFrames = KeyFrames::New();
+ keyFrames.Add(0.0f, Vector4(0.1f, 0.2f, 0.3f, 0.4f));
+ keyFrames.Add(0.5f, Vector4(0.9f, 0.8f, 0.7f, 0.6f));
+ keyFrames.Add(1.0f, Vector4(1.0f, 1.0f, 1.0f, 1.0f));
+
+ animation.AnimateBetween( Property(actor, Actor::COLOR), keyFrames, TimePeriod( 1.0f) );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ application.SendNotification();
+ application.Render(0);
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 0.1f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 0.2f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 0.3f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.4f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 0.5f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 0.5f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 0.5f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.5f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 0.9f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 0.8f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 0.7f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.6f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 0.95f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 0.90f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 0.85f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.80f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)+1/* 100% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 1.0f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 1.0f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 1.0f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 1.0f, 0.01f, TEST_LOCATION );
+
+ // We did expect the animation to finish
+
+ finishCheck.CheckSignalReceived();
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateBetweenActorColorFunction(void)
+{
+ TestApplication application;
+
+ float startValue(1.0f);
+ Actor actor = Actor::New();
+ actor.SetColor(Vector4(startValue, startValue, startValue, startValue));
+ Stage::GetCurrent().Add(actor);
+
+ DALI_TEST_EQUALS( actor.GetCurrentColor().a, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+
+ KeyFrames keyFrames = KeyFrames::New();
+ keyFrames.Add(0.0f, Vector4(0.1f, 0.2f, 0.3f, 0.4f));
+ keyFrames.Add(0.5f, Vector4(0.9f, 0.8f, 0.7f, 0.6f));
+ keyFrames.Add(1.0f, Vector4(1.0f, 1.0f, 1.0f, 1.0f));
+
+ animation.AnimateBetween( Property(actor, Actor::COLOR), keyFrames, AlphaFunctions::Linear );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ application.SendNotification();
+ application.Render(0);
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 0.1f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 0.2f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 0.3f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.4f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 0.5f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 0.5f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 0.5f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.5f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 0.9f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 0.8f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 0.7f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.6f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 0.95f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 0.90f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 0.85f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.80f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)+1/* 100% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 1.0f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 1.0f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 1.0f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 1.0f, 0.01f, TEST_LOCATION );
+
+ // We did expect the animation to finish
+
+ finishCheck.CheckSignalReceived();
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateBetweenActorColorFunctionTimePeriod(void)
+{
+ TestApplication application;
+
+ float startValue(1.0f);
+ Actor actor = Actor::New();
+ actor.SetColor(Vector4(startValue, startValue, startValue, startValue));
+ Stage::GetCurrent().Add(actor);
+
+ DALI_TEST_EQUALS( actor.GetCurrentColor().a, startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), startValue, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), startValue, TEST_LOCATION );
+
+ // Build the animation
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+
+ KeyFrames keyFrames = KeyFrames::New();
+ keyFrames.Add(0.0f, Vector4(0.1f, 0.2f, 0.3f, 0.4f));
+ keyFrames.Add(0.5f, Vector4(0.9f, 0.8f, 0.7f, 0.6f));
+ keyFrames.Add(1.0f, Vector4(1.0f, 1.0f, 1.0f, 1.0f));
+
+ animation.AnimateBetween( Property(actor, Actor::COLOR), keyFrames, AlphaFunctions::Linear, TimePeriod( 1.0f) );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+ application.SendNotification();
+ application.Render(0);
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 0.1f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 0.2f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 0.3f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.4f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 0.5f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 0.5f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 0.5f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.5f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 0.9f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 0.8f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 0.7f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.6f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 0.95f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 0.90f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 0.85f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 0.80f, 0.01f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)+1/* 100% progress */);
+ application.SendNotification();
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_RED), 1.0f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_GREEN), 1.0f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_BLUE), 1.0f, 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(Actor::COLOR_ALPHA), 1.0f, 0.01f, TEST_LOCATION );
+
+ // We did expect the animation to finish
+
+ finishCheck.CheckSignalReceived();
+ END_TEST;
+}
+
+int UtcDaliAnimationAnimateVector3Func(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Vector3 initialPosition(Vector3::ZERO);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), initialPosition, TEST_LOCATION );
+ Stage::GetCurrent().Add(actor);
+
+ // Build the animation
+ float durationSeconds(10.0f);
+ Animation animation = Animation::New(durationSeconds);
+ Vector3 targetPosition(200.0f, 200.0f, 200.0f);
+ BounceFunc func(0.0f, 0.0f, -100.0f);
+ animation.Animate<Vector3>( Property(actor, Actor::POSITION), func, AlphaFunctions::Linear );
+
+ // Start the animation
+ animation.Play();
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), func(0.25f, initialPosition), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), func(0.5f, initialPosition), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+
+ // We didn't expect the animation to finish yet
+ application.SendNotification();
+ finishCheck.CheckSignalNotReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), func(0.75f, initialPosition), TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f) + 1u/*just beyond the animation duration*/);
+
+ // We did expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), initialPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnimationCreateDestroy(void)
+{
+ TestApplication application;
+ Animation* animation = new Animation;
+ DALI_TEST_CHECK( animation );
+ delete animation;
+ END_TEST;
+}
--- /dev/null
+///
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <stdlib.h>
+
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+// Temp include
+#include <dali/public-api/object/any.h>
+
+using namespace Dali;
+
+void utc_dali_any_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_any_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+int UtcDaliAnyConstructors(void)
+{
+ TestApplication application;
+
+ tet_infoline("Test Any constructors.");
+
+ // Test default constructor.
+ Any value;
+
+ DALI_TEST_CHECK( typeid( void ) == value.GetType() );
+
+ // Test constructor Any( const Type& )
+ Any value1 = 4u;
+
+ // Test constructor Any( const Any& )
+ Any value2 = value1;
+
+ // Test constructor Any( const Any& ) with a non initialized Any
+ Any value3 = value;
+
+ DALI_TEST_CHECK( typeid( unsigned int ) == value1.GetType() );
+ DALI_TEST_CHECK( typeid( unsigned int ) == value2.GetType() );
+ DALI_TEST_CHECK( typeid( void ) == value3.GetType() );
+
+ unsigned int uiValue1 = 0u;
+ unsigned int uiValue2 = 0u;
+ value1.Get( uiValue1 );
+ value2.Get( uiValue2 );
+
+ DALI_TEST_EQUALS( uiValue1, uiValue2, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnyAssignmentOperators(void)
+{
+ TestApplication application;
+
+ tet_infoline("Test assignment operators.");
+
+ float fValue = 0.f;
+
+ Any value1;
+
+ value1 = 4.f; // Test operator=( const Type& ) when current object is not initialized.
+
+ value1.Get( fValue );
+
+ DALI_TEST_EQUALS( fValue, 4.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
+
+ Any value2 = 0.f;
+
+ value2 = 9.f; // Test operator=( const Type& ).
+
+ value2.Get( fValue );
+
+ DALI_TEST_EQUALS( fValue, 9.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
+
+ Any value3 = 5.f;
+
+ value1 = value3; // Test operator=( const Any& ).
+
+ value1.Get( fValue );
+
+ DALI_TEST_EQUALS( fValue, 5.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
+
+ Any value4;
+
+ value4 = value3; // Test operator=( const Any& ) when current object is not initialized.
+
+ value4.Get( fValue );
+
+ DALI_TEST_EQUALS( fValue, 5.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
+
+ // Test assign a value to value3 doesn't modify value1.
+ value3 = 3.f;
+
+ value1.Get( fValue );
+
+ DALI_TEST_EQUALS( fValue, 5.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
+
+ value3.Get( fValue );
+
+ DALI_TEST_EQUALS( fValue, 3.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
+
+ // Test the branch when copying the same object.
+ Any value5 = 3.f;
+ Any& value6( value5 );
+
+ value6 = value5;
+
+ value6.Get( fValue );
+ DALI_TEST_EQUALS( fValue, 3.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnyNegativeAssignmentOperators(void)
+{
+ TestApplication application;
+
+ tet_infoline("Test assignment operators.");
+
+ Any value1 = 4.f;
+ Any value2 = 5u;
+
+ bool assert = false;
+
+ try
+ {
+ value1 = value2; // Test operator=( const Any& );
+ }
+ catch( Dali::DaliException& e )
+ {
+ tet_printf( "Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str() );
+ assert = true;
+ }
+
+ if( assert )
+ {
+ tet_result( TET_PASS );
+ }
+ else
+ {
+ tet_result( TET_FAIL );
+ }
+ END_TEST;
+}
+
+int UtcDaliAnyGetType(void)
+{
+ TestApplication application;
+
+ tet_infoline("Test GetType().");
+
+ Any value;
+
+ DALI_TEST_CHECK( typeid( void ) == value.GetType() );
+
+ value = 5.f;
+
+ DALI_TEST_CHECK( typeid( float ) == value.GetType() );
+ END_TEST;
+}
+
+int UtcDaliAnyGet(void)
+{
+ TestApplication application;
+
+ tet_infoline("Test Get().");
+
+ Any value1( 5.f );
+
+ float fValue = value1.Get<float>();
+
+ DALI_TEST_EQUALS( fValue, 5.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
+
+ fValue = 0.f;
+ value1.Get( fValue );
+ DALI_TEST_EQUALS( fValue, 5.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliAnyNegativeGet(void)
+{
+ TestApplication application;
+ tet_infoline("Test Get().");
+
+ Any value1;
+ Any value2( 5.f );
+
+ bool assert1 = false;
+ bool assert2 = false;
+
+ unsigned int uiValue = 0u;
+
+ try
+ {
+ uiValue = value1.Get< unsigned int >();
+ }
+
+ catch( Dali::DaliException& e )
+ {
+ tet_printf( "Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str() );
+ assert1 = true;
+ }
+
+ try
+ {
+ uiValue = value2.Get< unsigned int >();
+ }
+
+ catch( Dali::DaliException& e )
+ {
+ tet_printf( "Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str() );
+ assert2 = true;
+ }
+
+ if( assert1 && assert2 )
+ {
+ tet_result( TET_PASS );
+ }
+ else
+ {
+ tet_result( TET_FAIL );
+ }
+ uiValue++; // supresss warning from unused variable
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/integration-api/events/touch-event-integ.h>
+
+#include "dali-test-suite-utils/dali-test-suite-utils.h"
+
+using namespace Dali;
+
+
+void utc_base_handle_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+// Called after each test
+void utc_base_handle_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+// Functor to test whether an animation finish signal is emitted
+struct AnimationFinishCheck
+{
+ AnimationFinishCheck(bool& signalReceived)
+ : mSignalReceived(signalReceived)
+ {
+ }
+
+ void operator()(Animation& animation)
+ {
+ mSignalReceived = true;
+ }
+
+ void Reset()
+ {
+ mSignalReceived = false;
+ }
+
+ void CheckSignalReceived()
+ {
+ if (!mSignalReceived)
+ {
+ tet_printf("Expected Finish signal was not received\n");
+ tet_result(TET_FAIL);
+ }
+ else
+ {
+ tet_result(TET_PASS);
+ }
+ }
+
+ bool& mSignalReceived; // owned by individual tests
+};
+
+BaseHandle ImplicitCopyConstructor(BaseHandle passedByValue)
+{
+ // object + copy + passedByValue, ref count == 3
+ DALI_TEST_CHECK(passedByValue);
+ if (passedByValue)
+ {
+ DALI_TEST_EQUALS(3, passedByValue.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+ }
+
+ return passedByValue;
+}
+
+static bool gTouchCallBackCalled;
+
+struct TestCallback
+{
+ void operator()()
+ {
+ gTouchCallBackCalled = true;
+ }
+};
+
+} // anon namespace
+
+int UtcDaliBaseHandleConstructorVoid(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::BaseHandle::BaseHandle()");
+
+ BaseHandle object;
+
+ DALI_TEST_CHECK(!object);
+ END_TEST;
+}
+
+
+int UtcDaliBaseHandleCopyConstructor(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::BaseHandle::BaseHandle(const BaseHandle&)");
+
+ // Initialize an object, ref count == 1
+ BaseHandle object = Actor::New();
+
+ DALI_TEST_EQUALS(1, object.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+
+ // Copy the object, ref count == 2
+ BaseHandle copy(object);
+ DALI_TEST_CHECK(copy);
+ if (copy)
+ {
+ DALI_TEST_EQUALS(2, copy.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+ }
+
+ {
+ // Pass by value, and return another copy, ref count == 3
+ BaseHandle anotherCopy = ImplicitCopyConstructor(copy);
+
+ DALI_TEST_CHECK(anotherCopy);
+ if (anotherCopy)
+ {
+ DALI_TEST_EQUALS(3, anotherCopy.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+ }
+ }
+
+ // anotherCopy out of scope, ref count == 2
+ DALI_TEST_CHECK(copy);
+ if (copy)
+ {
+ DALI_TEST_EQUALS(2, copy.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliBaseHandleAssignmentOperator(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::BaseHandle::operator=");
+
+ BaseHandle object = Actor::New();
+
+ DALI_TEST_CHECK(object);
+ if (object)
+ {
+ DALI_TEST_EQUALS(1, object.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+ }
+
+ BaseHandle copy = object;
+
+ DALI_TEST_CHECK(copy);
+ if (copy)
+ {
+ DALI_TEST_EQUALS(2, copy.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliBaseHandleGetBaseObject(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::BaseHandle::GetBaseObject()");
+
+ BaseHandle object = Actor::New();
+
+ BaseObject& handle = object.GetBaseObject();
+
+ DALI_TEST_EQUALS(1, handle.ReferenceCount(), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliBaseHandleReset(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::BaseHandle::Reset()");
+
+ // Initialize an object, ref count == 1
+ BaseHandle object = Actor::New();
+
+ DALI_TEST_EQUALS(1, object.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+
+ object.Reset();
+
+ DALI_TEST_CHECK(!object);
+ END_TEST;
+}
+
+int UtcDaliBaseHandleEqualityOperator01(void)
+{
+ TestApplication application;
+ tet_infoline("Positive Test Dali::BaseHandle::operator==");
+
+ BaseHandle object = Actor::New();
+
+ DALI_TEST_CHECK(object);
+
+ BaseHandle theSameBaseHandle = object;
+
+ DALI_TEST_CHECK(object == theSameBaseHandle);
+ END_TEST;
+}
+
+int UtcDaliBaseHandleEqualityOperator02(void)
+{
+ TestApplication application;
+ tet_infoline("Negative Test Dali::BaseHandle::operator==");
+
+ BaseHandle object = Actor::New();
+
+ DALI_TEST_CHECK(object);
+
+ BaseHandle aDifferentBaseHandle = Actor::New();
+
+ DALI_TEST_CHECK(!(object == aDifferentBaseHandle));
+ END_TEST;
+}
+
+int UtcDaliBaseHandleInequalityOperator01(void)
+{
+ TestApplication application;
+ tet_infoline("Positive Test Dali::BaseHandle::operator!=");
+
+ BaseHandle object = Actor::New();
+
+ DALI_TEST_CHECK(object);
+
+ BaseHandle aDifferentBaseHandle = Actor::New();
+
+ DALI_TEST_CHECK(object != aDifferentBaseHandle);
+ END_TEST;
+}
+
+int UtcDaliBaseHandleInequalityOperator02(void)
+{
+ TestApplication application;
+ tet_infoline("Negative Test Dali::BaseHandle::operator!=");
+
+ BaseHandle object = Actor::New();
+
+ DALI_TEST_CHECK(object);
+
+ BaseHandle theSameBaseHandle = object;
+
+ DALI_TEST_CHECK(!(object != theSameBaseHandle));
+ END_TEST;
+}
+
+int UtcDaliBaseHandleStlVector(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::BaseHandle compatibility with std::vector");
+
+ const int TargetVectorSize(5);
+
+ std::vector<Actor> myVector;
+
+ for (int i=0; i<TargetVectorSize; ++i)
+ {
+ Actor actor = Actor::New();
+
+ std::stringstream stream;
+ stream << "Actor " << i+1;
+ actor.SetName(stream.str());
+
+ myVector.push_back(actor);
+ }
+
+ DALI_TEST_EQUALS(TargetVectorSize, static_cast<int>(myVector.size()), TEST_LOCATION);
+
+ DALI_TEST_CHECK(myVector[0].GetName() == "Actor 1");
+ DALI_TEST_CHECK(myVector[1].GetName() == "Actor 2");
+ DALI_TEST_CHECK(myVector[2].GetName() == "Actor 3");
+ DALI_TEST_CHECK(myVector[3].GetName() == "Actor 4");
+ DALI_TEST_CHECK(myVector[4].GetName() == "Actor 5");
+ END_TEST;
+}
+
+int UtcDaliBaseHandleDoAction(void)
+{
+ TestApplication application;
+ tet_infoline("Positive Test Dali::BaseHandle::UtcDaliBaseHandleDoAction");
+
+ Actor actor = Actor::New();
+ BaseHandle actorObject = actor;
+
+ DALI_TEST_CHECK(actorObject);
+
+ // Check that an invalid command is not performed
+ std::vector<Property::Value> attributes;
+ DALI_TEST_CHECK(actorObject.DoAction("invalidCommand", attributes) == false);
+
+ // Check that the actor is visible
+ actor.SetVisible(true);
+ DALI_TEST_CHECK(actor.IsVisible() == true);
+
+ // Check the actor performed an action to hide itself
+ DALI_TEST_CHECK(actorObject.DoAction("hide", attributes) == true);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ // Check that the actor is now invisible
+ DALI_TEST_CHECK(actor.IsVisible() == false);
+
+ // Check the actor performed an action to show itself
+ DALI_TEST_CHECK(actorObject.DoAction("show", attributes) == true);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ // Check that the actor is now visible
+ DALI_TEST_CHECK(actor.IsVisible() == true);
+
+ Stage::GetCurrent().Add(actor);
+
+ // Build an animation with initial duration of 1 second
+ float durationSeconds(1.0f);
+ Animation animation = Animation::New(durationSeconds);
+ BaseHandle animationObject = animation;
+
+ DALI_TEST_CHECK(animationObject);
+
+ // Check the current animation duration is 1 second
+ DALI_TEST_EQUALS(animation.GetDuration(), durationSeconds, TEST_LOCATION);
+
+ Vector3 targetPosition(100.0f, 100.0f, 100.0f);
+ animation.MoveTo(actor, targetPosition, AlphaFunctions::Linear);
+
+ // Set the new duration to be 2 seconds
+ float newDurationSeconds(2.0f);
+ Property::Value newDurationSecondsValue = Property::Value( newDurationSeconds );
+ attributes.push_back(newDurationSecondsValue);
+
+ // Check the animation performed an action to play itself with the specified duration of 2 seconds
+ animationObject.DoAction("play", attributes);
+
+ bool signalReceived(false);
+ AnimationFinishCheck finishCheck(signalReceived);
+ animation.FinishedSignal().Connect(&application, finishCheck);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(newDurationSeconds * 1000.0f) + 1u/*just beyond the animation duration*/);
+
+ // We expect the animation to finish
+ application.SendNotification();
+ finishCheck.CheckSignalReceived();
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+
+ // Check the new animation duration is 2 seconds
+ DALI_TEST_EQUALS(animation.GetDuration(), newDurationSeconds, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliBaseHandleConnectSignal(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::BaseHandle::ConnectSignal");
+
+ gTouchCallBackCalled = false;
+
+ // get the root layer
+ Actor actor = Actor::New();
+ actor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+ actor.SetParentOrigin( ParentOrigin::TOP_LEFT );
+ actor.SetPosition( 240, 400 );
+ actor.SetSize( 100, 100 );
+
+ Stage::GetCurrent().Add( actor );
+
+ DALI_TEST_CHECK( gTouchCallBackCalled == false );
+
+ // connect to its touch signal
+ actor.ConnectSignal( &application, "touched", TestCallback() );
+
+ application.SendNotification();
+ application.Render(1000);
+ application.SendNotification();
+ application.Render(1000);
+
+ // simulate a touch event
+ Dali::TouchPoint point( 0, TouchPoint::Down, 240, 400 );
+ Dali::Integration::TouchEvent event;
+ event.AddPoint( point );
+ application.ProcessEvent( event );
+
+ application.SendNotification();
+ application.Render(1000);
+ application.SendNotification();
+ application.Render(1000);
+
+ DALI_TEST_CHECK( application.GetConnectionCount() > 0 );
+ DALI_TEST_CHECK( gTouchCallBackCalled == true );
+
+ gTouchCallBackCalled = false;
+ application.DisconnectAll();
+
+ // simulate another touch event
+ application.ProcessEvent( event );
+
+ DALI_TEST_CHECK( gTouchCallBackCalled == false );
+ END_TEST;
+}
+
+int UtcDaliBaseHandleGetTypeName(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::BaseHandle::GetTypeName");
+
+ // get the root layer
+ Actor actor = Actor::New();
+
+ std::string typeName = actor.GetTypeName();
+
+ DALI_TEST_CHECK( typeName.size() );
+ DALI_TEST_CHECK( typeName == std::string("Actor") );
+ END_TEST;
+}
+
+int UtcDaliBaseHandleGetObjectPtr(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::BaseHandle::GetObjectPtr");
+
+ // get the root layer
+ Actor actor = Actor::New();
+
+ Dali::RefObject* p = actor.GetObjectPtr();
+
+ DALI_TEST_CHECK( p != NULL );
+ END_TEST;
+}
+
+int UtcDaliBaseHandleBooleanCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::BaseHandle::BooleanType");
+
+ // get the root layer
+ BaseHandle handle = Actor::New();
+
+ DALI_TEST_CHECK( static_cast<BaseHandle::BooleanType>( handle ) );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <algorithm>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using std::max;
+using namespace Dali;
+
+void utc_dali_bitmap_image_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_bitmap_image_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+int UtcDaliBitmapImageNew01(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliBitmapImageNew01 - BitmapImage::New(unsigned int, unsigned int, Pixel::Format)");
+
+ // invoke default handle constructor
+ BitmapImage image;
+
+ // initialise handle
+ image = BitmapImage::New(16, 16);
+ application.SendNotification();
+ application.Render(16);
+ application.Render(16);
+ application.SendNotification();
+
+ ImageAttributes attributes = image.GetAttributes();
+
+ DALI_TEST_CHECK( attributes.GetWidth() == 16);
+ END_TEST;
+}
+
+int UtcDaliBitmapImageNew02(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliBitmapImageNew02 - BitmapImage::New(PixelBuffer*, unsigned int, unsigned int, Pixel::Format, unsigned int)");
+
+ PixelBuffer* buffer = new PixelBuffer[16 * 16];
+ BitmapImage image = BitmapImage::New(buffer, 16, 16, Pixel::A8);
+ application.SendNotification();
+ application.Render(16);
+ application.Render(16);
+ application.SendNotification();
+
+ Dali::ImageAttributes attributes = image.GetAttributes();
+
+ DALI_TEST_CHECK( attributes.GetWidth() == 16);
+
+ delete [] buffer;
+ END_TEST;
+}
+
+int UtcDaliBitmapImageNewWithPolicy01(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliBitmapImageNewWithPolicy01 - BitmapImage::New(unsigned int, unsigned int, Pixel::Format, LoadPolicy, ReleasePolicy)");
+
+ // Force texture id's
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+
+ // invoke default handle constructor
+ BitmapImage image;
+
+ // initialise handle
+ image = BitmapImage::New(16, 16, Pixel::A8, Image::OnDemand, Image::Unused);
+ application.SendNotification();
+ application.Render(16);
+ application.Render(16);
+ application.SendNotification();
+
+ ImageAttributes attributes = image.GetAttributes();
+ DALI_TEST_CHECK( attributes.GetWidth() == 16);
+ /// @todo: how to test OnDemand? - resource id would be 0 if buffer only allocated on first call to ::GetBuffer()
+
+ ImageActor actor = ImageActor::New(image);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+ // testing ReleasePolicy::Unused
+ // fake loading image
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
+
+ // discard texture when actor comes off stage
+ Stage::GetCurrent().Remove(actor);
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ DALI_TEST_CHECK ( application.GetGlAbstraction().CheckTextureDeleted(23) );
+ END_TEST;
+}
+
+int UtcDaliBitmapImageNewWithPolicy02(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliBitmapImageNewWithPolicy02 - BitmapImage::New(PixelBuffer*, unsigned int, unsigned int, Pixel::Format, unsigned int, ReleasePolicy)");
+
+ // Force texture id's
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+
+ PixelBuffer* buffer = new PixelBuffer[16 * 16];
+ BitmapImage image = BitmapImage::New(buffer, 16, 16, Pixel::A8, 16, Image::Unused);
+ application.SendNotification();
+ application.Render(16);
+ application.Render(16);
+ application.SendNotification();
+
+ ImageAttributes attributes = image.GetAttributes();
+ DALI_TEST_CHECK( attributes.GetWidth() == 16);
+ /// @todo: how to test OnDemand? - resource id would be 0 if buffer only allocated on first call to ::GetBuffer()
+
+ ImageActor actor = ImageActor::New(image);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+ // testing ReleasePolicy::Unused
+ // fake loading image
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
+
+ // discard texture when actor comes off stage
+ Stage::GetCurrent().Remove(actor);
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ DALI_TEST_CHECK ( application.GetGlAbstraction().CheckTextureDeleted(23) );
+ END_TEST;
+}
+
+int UtcDaliBitmapImageDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::BitmapImage::DownCast()");
+
+ BitmapImage bitmap = BitmapImage::New(1, 1, Dali::Pixel::BGRA8888);
+ ImageActor imageActor = ImageActor::New(bitmap);
+ application.SendNotification();
+ application.Render(16);
+ application.Render(16);
+ application.SendNotification();
+
+ Image image = imageActor.GetImage();
+ BitmapImage bitmapImage = BitmapImage::DownCast( image );
+
+ DALI_TEST_CHECK(bitmapImage);
+ END_TEST;
+}
+
+int UtcDaliBitmapImageDownCast2(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::BitmapImage::DownCast()");
+
+ Image image = Image::New("IncorrectImageName");
+ ImageActor imageActor = ImageActor::New(image);
+ application.SendNotification();
+ application.Render(16);
+ application.Render(16);
+ application.SendNotification();
+
+ Image image1 = imageActor.GetImage();
+
+ BitmapImage bitmapImage = BitmapImage::DownCast( image1 );
+ DALI_TEST_CHECK(!bitmapImage);
+
+ Actor unInitialzedActor;
+ bitmapImage = BitmapImage::DownCast( unInitialzedActor );
+ DALI_TEST_CHECK(!bitmapImage);
+ END_TEST;
+}
+
+int UtcDaliBitmapImageWHITE(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliBitmapImageWHITE - BitmapImage::WHITE()");
+
+ BitmapImage image = BitmapImage::WHITE(); // creates a 1x1 RGBA white pixel
+ application.SendNotification();
+ application.Render(16);
+ application.Render(16);
+ application.SendNotification();
+
+ Dali::ImageAttributes attributes = image.GetAttributes();
+ PixelBuffer* buffer = image.GetBuffer();
+
+ DALI_TEST_CHECK( attributes.GetWidth() == 1 && // 1 pixel wide
+ buffer != NULL && // valid buffer
+ *buffer == 0xff); // r component is 255
+ END_TEST;
+}
+
+int UtcDaliBitmapImageGetBuffer(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliBitmapImageGetBuffer");
+
+ BitmapImage image = BitmapImage::WHITE(); // creates a 1x1 RGBA white pixel
+
+ PixelBuffer* buffer = image.GetBuffer();
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ ImageAttributes attributes = image.GetAttributes();
+ DALI_TEST_CHECK( attributes.GetWidth() == 1 && // 1 pixel wide
+ buffer != NULL && // valid buffer
+ *((unsigned int*)buffer) == 0xffffffff); // all component are 255
+ END_TEST;
+}
+
+int UtcDaliBitmapImageGetBufferSize(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliBitmapImageGetBufferSize");
+
+ BitmapImage image = BitmapImage::WHITE(); // creates a 1x1 RGBA white pixel
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ Dali::ImageAttributes attributes = image.GetAttributes();
+ PixelBuffer* buffer = image.GetBuffer();
+ unsigned int bufferSize = image.GetBufferSize();
+ unsigned int pixelSize = Pixel::GetBytesPerPixel(attributes.GetPixelFormat());
+
+ DALI_TEST_CHECK( attributes.GetWidth() == 1 && // 1 pixel wide
+ buffer != NULL && // valid buffer
+ bufferSize == pixelSize); // r component is 255
+ END_TEST;
+}
+
+int UtcDaliBitmapImageGetBufferStride(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliBitmapImageGetBufferStride");
+
+ BitmapImage image = BitmapImage::WHITE(); // creates a 1x1 RGBA white pixel
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ Dali::ImageAttributes attributes = image.GetAttributes();
+ unsigned int pixelSize = Pixel::GetBytesPerPixel(attributes.GetPixelFormat());
+ unsigned int bufferStride = image.GetBufferStride();
+ DALI_TEST_CHECK( bufferStride == pixelSize );
+ DALI_TEST_CHECK( !image.IsDataExternal() );
+
+ PixelBuffer* buffer = new PixelBuffer[20 * 16];
+ image = BitmapImage::New(buffer, 16, 16, Pixel::A8, 20);
+ application.SendNotification();
+ application.Render(16);
+ application.Render(16);
+ application.SendNotification();
+
+ bufferStride = image.GetBufferStride();
+
+ DALI_TEST_CHECK( bufferStride == 20);
+ DALI_TEST_CHECK( image.IsDataExternal() );
+
+ delete [] buffer;
+ END_TEST;
+}
+
+
+int UtcDaliBitmapImageIsDataExternal(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliBitmapImageIsDataExternal - BitmapImage::IsDataExternal()");
+
+ PixelBuffer* buffer = new PixelBuffer[16 * 16];
+ BitmapImage image = BitmapImage::New(buffer, 16, 16, Pixel::A8);
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ DALI_TEST_CHECK( image.IsDataExternal() );
+ END_TEST;
+}
+
+namespace
+{
+
+static bool SignalReceived;
+static void ImageUploaded(Image image)
+{
+ tet_infoline("Received image uploaded signal");
+ SignalReceived = true;
+}
+}
+
+int UtcDaliBitmapImageUpdate01(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliBitmapImageUpdate01 - single empty rect");
+
+ PixelBuffer* buffer = new PixelBuffer[16 * 16];
+
+ BitmapImage image = BitmapImage::New(buffer, 16, 16, Pixel::A8);
+ ImageActor actor = ImageActor::New(image);
+ Stage::GetCurrent().Add(actor);
+ actor.SetVisible(true);
+
+ SignalReceived = false;
+ image.UploadedSignal().Connect( ImageUploaded );
+
+ std::vector<GLuint> ids;
+ ids.push_back(200);
+ ids.push_back(201);
+ ids.push_back(202);
+ application.GetGlAbstraction().SetNextTextureIds(ids);
+
+ // Allow actor to be staged and rendered
+ application.SendNotification();
+ application.Render(0);
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK( image.IsDataExternal() );
+ application.GetGlAbstraction().EnableTextureCallTrace(true);
+
+ image.Update();//(RectArea()); // notify Core that the image has been updated
+ application.SendNotification();
+ application.Render(16);
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+
+ const TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
+ DALI_TEST_EQUALS( callStack.TestMethodAndParams(0, "TexSubImage2D", "0, 0, 16, 16"), true, TEST_LOCATION);
+
+ DALI_TEST_CHECK( SignalReceived == true );
+ SignalReceived = false;
+ END_TEST;
+}
+
+int UtcDaliBitmapImageUpdate02(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliBitmapImageUpdate02 - Multiple rects");
+
+ PixelBuffer* buffer = new PixelBuffer[16 * 16];
+ BitmapImage image = BitmapImage::New(buffer, 16, 16, Pixel::A8);
+ ImageActor actor = ImageActor::New(image);
+ Stage::GetCurrent().Add(actor);
+ actor.SetVisible(true);
+
+ SignalReceived = false;
+ image.UploadedSignal().Connect( ImageUploaded );
+
+ std::vector<GLuint> ids;
+ ids.push_back(200);
+ ids.push_back(201);
+ ids.push_back(202);
+ application.GetGlAbstraction().SetNextTextureIds(ids);
+
+ application.SendNotification();
+ application.Render(0);
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK( image.IsDataExternal() );
+ application.GetGlAbstraction().EnableTextureCallTrace(true);
+
+ image.Update(RectArea(9,9,5,5)); // notify Core that the image has been updated
+
+ application.SendNotification();
+ application.Render(16);
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+
+ const TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
+ DALI_TEST_EQUALS( callStack.TestMethodAndParams(0, "TexSubImage2D", "9, 9, 5, 1"), true, TEST_LOCATION);
+ DALI_TEST_EQUALS( callStack.TestMethodAndParams(1, "TexSubImage2D", "9, 10, 5, 1"), true, TEST_LOCATION);
+ DALI_TEST_EQUALS( callStack.TestMethodAndParams(2, "TexSubImage2D", "9, 11, 5, 1"), true, TEST_LOCATION);
+ DALI_TEST_EQUALS( callStack.TestMethodAndParams(3, "TexSubImage2D", "9, 12, 5, 1"), true, TEST_LOCATION);
+ DALI_TEST_EQUALS( callStack.TestMethodAndParams(4, "TexSubImage2D", "9, 13, 5, 1"), true, TEST_LOCATION);
+
+ DALI_TEST_CHECK( SignalReceived == true );
+ SignalReceived = false;
+ END_TEST;
+}
+
+int UtcDaliBitmapImageUploadedSignal01(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliBitmapImageUploadedSignal - Test that Uploaded signal is sent when image is staged");
+
+ PixelBuffer* buffer = new PixelBuffer[16 * 16];
+ BitmapImage image = BitmapImage::New(buffer, 16, 16, Pixel::A8);
+ SignalReceived = false;
+ image.UploadedSignal().Connect( ImageUploaded );
+
+ application.SendNotification();
+ application.Render(16);
+ application.Render(16);
+ application.SendNotification();
+
+ Dali::ImageActor imageActor = ImageActor::New(image);
+ Stage::GetCurrent().Add(imageActor);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK( SignalReceived == true );
+ END_TEST;
+}
+
+int UtcDaliBitmapImageUploadedSignal02(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliBitmapImageUploadedSignal - Test that Uploaded signal is sent after Update");
+
+ PixelBuffer* buffer = new PixelBuffer[16 * 16];
+ BitmapImage image = BitmapImage::New(buffer, 16, 16, Pixel::A8);
+ SignalReceived = false;
+ //ScopedConnection connection =
+ image.UploadedSignal().Connect( ImageUploaded );
+
+ application.SendNotification();
+ application.Render(16);
+ application.Render(16);
+ application.SendNotification();
+
+ Dali::ImageActor imageActor = ImageActor::New(image);
+ Stage::GetCurrent().Add(imageActor);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ DALI_TEST_CHECK( SignalReceived == true );
+ SignalReceived = false;
+
+ image.Update(RectArea()); // notify Core that the whole image has been updated
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ DALI_TEST_CHECK( SignalReceived == true );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+
+#include "dali-test-suite-utils/dali-test-suite-utils.h"
+
+using namespace Dali;
+
+void camera_actor_test_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void camera_actor_test_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+namespace
+{
+const float FLOAT_EPSILON = 0.001f;
+const float TEST_ASPECT_RATIO = 0.123f;
+const float TEST_FIELD_OF_VIEW = Radian(Degree(40.0f));
+const float TEST_NEAR_PLANE_DISTANCE = 0.23f;
+const float TEST_FAR_PLANE_DISTANCE = 0.973f;
+
+const std::string SHADER_LIGHT_CAMERA_PROJECTION_MATRIX_PROPERTY_NAME( "uLightCameraProjectionMatrix" );
+const std::string SHADER_LIGHT_CAMERA_VIEW_MATRIX_PROPERTY_NAME( "uLightCameraViewMatrix" );
+const char* const RENDER_SHADOW_VERTEX_SOURCE =
+ " uniform mediump mat4 uLightCameraProjectionMatrix;\n"
+ " uniform mediump mat4 uLightCameraViewMatrix;\n"
+ "\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = uProjection * uModelView * vec4(aPosition,1.0);\n"
+ " vec4 textureCoords = uLightCameraProjectionMatrix * uLightCameraViewMatrix * uModelMatrix * vec4(aPosition,1.0);\n"
+ " vTexCoord = 0.5 + 0.5 * (textureCoords.xy/textureCoords.w);\n"
+ "}\n";
+
+const char* const RENDER_SHADOW_FRAGMENT_SOURCE =
+ "uniform lowp vec4 uShadowColor;\n"
+ "void main()\n"
+ "{\n"
+ " lowp float alpha;\n"
+ " alpha = texture2D(sTexture, vec2(vTexCoord.x, vTexCoord.y)).a;\n"
+ " gl_FragColor = vec4(uShadowColor.rgb, uShadowColor.a * alpha);\n"
+ "}\n";
+
+
+} // anon namespace
+
+
+int UtcDaliCameraActorConstructorVoid(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor::CameraActor()");
+
+ CameraActor actor;
+
+ DALI_TEST_CHECK(!actor);
+ END_TEST;
+}
+
+int UtcDaliCameraActorNew(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor::New()");
+
+ CameraActor actor = CameraActor::New();
+
+ DALI_TEST_CHECK(actor);
+
+ actor = NULL;
+
+ DALI_TEST_CHECK(!actor);
+ END_TEST;
+}
+
+int UtcDaliCameraActorDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor::DownCast()");
+
+ CameraActor camera = CameraActor::New();
+ Actor anActor = Actor::New();
+ anActor.Add( camera );
+
+ Actor child = anActor.GetChildAt(0);
+ CameraActor cameraActor = CameraActor::DownCast( child );
+ DALI_TEST_CHECK( cameraActor );
+
+ cameraActor = NULL;
+ DALI_TEST_CHECK( !cameraActor );
+
+ cameraActor = DownCast< CameraActor >( child );
+ DALI_TEST_CHECK( cameraActor );
+ END_TEST;
+}
+
+int UtcDaliCameraActorDownCast2(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor::DownCast()");
+
+ Actor actor1 = Actor::New();
+ Actor anActor = Actor::New();
+ anActor.Add(actor1);
+
+ Actor child = anActor.GetChildAt(0);
+ CameraActor cameraActor = CameraActor::DownCast( child );
+ DALI_TEST_CHECK( !cameraActor );
+
+ Actor unInitialzedActor;
+ cameraActor = CameraActor::DownCast( unInitialzedActor );
+ DALI_TEST_CHECK( !cameraActor );
+
+ cameraActor = DownCast< CameraActor >( unInitialzedActor );
+ DALI_TEST_CHECK( !cameraActor );
+ END_TEST;
+}
+
+
+int UtcDaliCameraActorSetCameraOffStage(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor::SetCamera()");
+
+ CameraActor actor = CameraActor::New();
+
+ actor.SetType(Camera::FREE_LOOK);
+ actor.SetFieldOfView(TEST_FIELD_OF_VIEW);
+ actor.SetAspectRatio(TEST_ASPECT_RATIO);
+ actor.SetNearClippingPlane(TEST_NEAR_PLANE_DISTANCE);
+ actor.SetFarClippingPlane(TEST_FAR_PLANE_DISTANCE);
+ actor.SetProjectionMode(Camera::PERSPECTIVE_PROJECTION);
+
+ actor.SetInvertYAxis(false);
+
+ DALI_TEST_EQUALS(TEST_ASPECT_RATIO, actor.GetAspectRatio(), FLOAT_EPSILON, TEST_LOCATION);
+ DALI_TEST_EQUALS(TEST_FIELD_OF_VIEW, actor.GetFieldOfView(), FLOAT_EPSILON, TEST_LOCATION);
+ DALI_TEST_EQUALS(TEST_NEAR_PLANE_DISTANCE, actor.GetNearClippingPlane(), FLOAT_EPSILON, TEST_LOCATION);
+ DALI_TEST_EQUALS(TEST_FAR_PLANE_DISTANCE, actor.GetFarClippingPlane(), FLOAT_EPSILON, TEST_LOCATION);
+ DALI_TEST_EQUALS(Camera::PERSPECTIVE_PROJECTION, actor.GetProjectionMode(), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, actor.GetInvertYAxis(), TEST_LOCATION);
+
+ float value;
+ std::string sValue;
+ actor.GetProperty(CameraActor::ASPECT_RATIO).Get(value);
+ DALI_TEST_EQUALS(TEST_ASPECT_RATIO, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(value);
+ DALI_TEST_EQUALS(TEST_FIELD_OF_VIEW, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(TEST_NEAR_PLANE_DISTANCE, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(TEST_FAR_PLANE_DISTANCE, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::PROJECTION_MODE).Get(sValue);
+ DALI_TEST_EQUALS("PERSPECTIVE_PROJECTION", sValue, TEST_LOCATION);
+ bool bValue;
+ actor.GetProperty(CameraActor::INVERT_Y_AXIS).Get(bValue);
+ DALI_TEST_EQUALS(false, bValue, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliCameraActorSetCameraOnStage(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor::SetCamera()");
+
+ CameraActor actor = CameraActor::New();
+ Stage::GetCurrent().Add(actor);
+ application.Render(0);
+ application.SendNotification();
+
+ actor.SetType(Camera::LOOK_AT_TARGET);
+ actor.SetFieldOfView(TEST_FIELD_OF_VIEW);
+ actor.SetAspectRatio(TEST_ASPECT_RATIO);
+ actor.SetNearClippingPlane(TEST_NEAR_PLANE_DISTANCE);
+ actor.SetFarClippingPlane(TEST_FAR_PLANE_DISTANCE);
+ actor.SetInvertYAxis(false);
+
+ DALI_TEST_EQUALS(false, actor.GetInvertYAxis(), TEST_LOCATION);
+
+ // Will need 2 frames to ensure both buffers are set to same values:
+ application.Render();
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+
+ DALI_TEST_EQUALS(TEST_ASPECT_RATIO, actor.GetAspectRatio(), FLOAT_EPSILON, TEST_LOCATION);
+ DALI_TEST_EQUALS(TEST_FIELD_OF_VIEW, actor.GetFieldOfView(), FLOAT_EPSILON, TEST_LOCATION);
+ DALI_TEST_EQUALS(TEST_NEAR_PLANE_DISTANCE, actor.GetNearClippingPlane(), FLOAT_EPSILON, TEST_LOCATION);
+ DALI_TEST_EQUALS(TEST_FAR_PLANE_DISTANCE, actor.GetFarClippingPlane(), FLOAT_EPSILON, TEST_LOCATION);
+ DALI_TEST_EQUALS(false, actor.GetInvertYAxis(), TEST_LOCATION);
+
+ std::string sValue;
+ actor.GetProperty(CameraActor::TYPE).Get(sValue);
+ DALI_TEST_EQUALS(sValue, "LOOK_AT_TARGET", TEST_LOCATION);
+
+ float value;
+ actor.GetProperty(CameraActor::ASPECT_RATIO).Get(value);
+ DALI_TEST_EQUALS(TEST_ASPECT_RATIO, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(value);
+ DALI_TEST_EQUALS(TEST_FIELD_OF_VIEW, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(TEST_NEAR_PLANE_DISTANCE, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(TEST_FAR_PLANE_DISTANCE, value, FLOAT_EPSILON, TEST_LOCATION);
+
+ bool bValue;
+ actor.GetProperty(CameraActor::INVERT_Y_AXIS).Get(bValue);
+ DALI_TEST_EQUALS(false, bValue, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliCameraActorGetCamera(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor::GetCamera()");
+
+ CameraActor actor = CameraActor::New();
+
+ actor.SetAspectRatio(TEST_ASPECT_RATIO);
+
+ DALI_TEST_EQUALS(actor.GetAspectRatio(), TEST_ASPECT_RATIO, FLOAT_EPSILON, TEST_LOCATION);
+
+ actor.SetProperty(CameraActor::TYPE, "FREE_LOOK");
+ actor.SetProperty(CameraActor::ASPECT_RATIO, TEST_ASPECT_RATIO);
+ actor.SetProperty(CameraActor::FIELD_OF_VIEW, TEST_FIELD_OF_VIEW);
+ actor.SetProperty(CameraActor::NEAR_PLANE_DISTANCE, TEST_NEAR_PLANE_DISTANCE);
+ actor.SetProperty(CameraActor::FAR_PLANE_DISTANCE, TEST_FAR_PLANE_DISTANCE);
+
+ DALI_TEST_EQUALS(Camera::FREE_LOOK, actor.GetType(), TEST_LOCATION);
+ DALI_TEST_EQUALS(TEST_ASPECT_RATIO, actor.GetAspectRatio(), FLOAT_EPSILON, TEST_LOCATION);
+ DALI_TEST_EQUALS(TEST_FIELD_OF_VIEW, actor.GetFieldOfView(), FLOAT_EPSILON, TEST_LOCATION);
+ DALI_TEST_EQUALS(TEST_NEAR_PLANE_DISTANCE, actor.GetNearClippingPlane(), FLOAT_EPSILON, TEST_LOCATION);
+ DALI_TEST_EQUALS(TEST_FAR_PLANE_DISTANCE, actor.GetFarClippingPlane(), FLOAT_EPSILON, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliCameraActorDefaultProperties(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor DefaultProperties");
+
+ CameraActor actor = CameraActor::New();
+
+ actor.SetAspectRatio(TEST_ASPECT_RATIO);
+ Stage::GetCurrent().Add(actor);
+ application.Render(0);
+ application.SendNotification();
+ bool bValue;
+ actor.GetProperty(CameraActor::INVERT_Y_AXIS).Get(bValue);
+ DALI_TEST_EQUALS(false, bValue, TEST_LOCATION);
+
+ std::vector<Property::Index> indices ;
+ indices.push_back(CameraActor::TYPE);
+ indices.push_back(CameraActor::PROJECTION_MODE);
+ indices.push_back(CameraActor::FIELD_OF_VIEW );
+ indices.push_back(CameraActor::ASPECT_RATIO );
+ indices.push_back(CameraActor::NEAR_PLANE_DISTANCE );
+ indices.push_back(CameraActor::FAR_PLANE_DISTANCE );
+ indices.push_back(CameraActor::LEFT_PLANE_DISTANCE );
+ indices.push_back(CameraActor::RIGHT_PLANE_DISTANCE );
+ indices.push_back(CameraActor::TOP_PLANE_DISTANCE );
+ indices.push_back(CameraActor::BOTTOM_PLANE_DISTANCE );
+ indices.push_back(CameraActor::TARGET_POSITION );
+ indices.push_back(CameraActor::PROJECTION_MATRIX );
+ indices.push_back(CameraActor::VIEW_MATRIX);
+ indices.push_back(CameraActor::INVERT_Y_AXIS );
+
+ DALI_TEST_CHECK(actor.GetPropertyCount() == ( Actor::New().GetPropertyCount() + indices.size() ) );
+
+ for(std::vector<Property::Index>::iterator iter = indices.begin(); iter != indices.end(); ++iter)
+ {
+ DALI_TEST_EQUALS( *iter, actor.GetPropertyIndex(actor.GetPropertyName(*iter)), TEST_LOCATION);
+ DALI_TEST_CHECK( ! actor.IsPropertyAnimatable(*iter) );
+
+ switch(*iter)
+ {
+ if ( ( *iter == CameraActor::PROJECTION_MATRIX ) ||
+ ( *iter == CameraActor::VIEW_MATRIX ) )
+ {
+ DALI_TEST_CHECK( ! actor.IsPropertyWritable(*iter) );
+ }
+ else
+ {
+ DALI_TEST_CHECK( actor.IsPropertyWritable(*iter) );
+ }
+ }
+
+ DALI_TEST_CHECK( actor.GetPropertyType(*iter) == actor.GetPropertyType(*iter) ); // just checking call succeeds
+ }
+
+ // set/get one of them
+ const float newAspect = TEST_ASPECT_RATIO * 2.f;
+
+ actor.SetProperty( CameraActor::ASPECT_RATIO, Property::Value(newAspect) );
+ application.Render();
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+
+ DALI_TEST_EQUALS(actor.GetAspectRatio(), newAspect, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliCameraActorSetTarget(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor Get/Set Target Position");
+
+ CameraActor actor = CameraActor::New();
+ DALI_TEST_EQUALS( actor.GetTargetPosition(), Vector3::ZERO, TEST_LOCATION );
+
+ Vector3 target( 10.0f, 20.0f, 30.0f);
+ actor.SetTargetPosition( target );
+
+ DALI_TEST_EQUALS( actor.GetTargetPosition(), target, TEST_LOCATION );
+
+ Vector3 value;
+ actor.GetProperty(CameraActor::TARGET_POSITION).Get(value);
+ DALI_TEST_EQUALS(target, value, FLOAT_EPSILON, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliCameraActorSetType01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor Get/Set Type");
+
+ CameraActor actor = CameraActor::New();
+ DALI_TEST_EQUALS( actor.GetType(), Dali::Camera::LOOK_AT_TARGET, TEST_LOCATION );
+
+ actor.SetType(Dali::Camera::FREE_LOOK);
+ DALI_TEST_EQUALS( actor.GetType(), Dali::Camera::FREE_LOOK, TEST_LOCATION );
+
+ std::string sValue;
+ actor.GetProperty(CameraActor::TYPE).Get(sValue);
+ std::string result("FREE_LOOK");
+ DALI_TEST_EQUALS(result, sValue, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliCameraActorSetType02(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor Get/Set Type");
+
+ CameraActor actor;
+
+ Dali::Camera::Type cameraType = Dali::Camera::FREE_LOOK ;
+ try
+ {
+ cameraType = actor.GetType();
+ }
+ catch ( Dali::DaliException& e )
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "camera", TEST_LOCATION);
+ }
+
+ const CameraActor aConstActor;
+
+ try
+ {
+ cameraType = aConstActor.GetType();
+ }
+ catch ( Dali::DaliException& e )
+ {
+ tet_printf("Assertion %s test at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "camera", TEST_LOCATION);
+ }
+
+ DALI_TEST_EQUALS((int)cameraType, (int)Dali::Camera::FREE_LOOK, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliCameraActorSetFieldOfView(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor Get/Set Field of view");
+
+ CameraActor defaultCamera = CameraActor::New( Size( TestApplication::DEFAULT_SURFACE_WIDTH, TestApplication::DEFAULT_SURFACE_HEIGHT ) );
+ const float defaultFov = defaultCamera.GetFieldOfView();
+
+ CameraActor actor = CameraActor::New();
+ DALI_TEST_EQUALS( actor.GetFieldOfView(), defaultFov, TEST_LOCATION );
+
+ float fov = Math::PI/3.0f;
+ actor.SetFieldOfView(fov);
+ DALI_TEST_EQUALS( actor.GetFieldOfView(), fov, TEST_LOCATION );
+
+ float value;
+ actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(value);
+ DALI_TEST_EQUALS(fov, value, FLOAT_EPSILON, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliCameraActorSetAspectRatio(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor Get/Set Aspect Ratio");
+
+ CameraActor actor = CameraActor::New();
+ DALI_TEST_EQUALS( actor.GetAspectRatio(), static_cast<float>( TestApplication::DEFAULT_SURFACE_WIDTH ) / static_cast<float>( TestApplication::DEFAULT_SURFACE_HEIGHT ), TEST_LOCATION );
+
+ float aspect = 16.0f/9.0f;
+ actor.SetAspectRatio(aspect);
+ DALI_TEST_EQUALS( actor.GetAspectRatio(), aspect, TEST_LOCATION );
+
+ float value;
+ actor.GetProperty(CameraActor::ASPECT_RATIO).Get(value);
+ DALI_TEST_EQUALS(aspect, value, FLOAT_EPSILON, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliCameraActorSetNearClippingPlane(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor Get/Set Near clipping plane");
+
+ CameraActor actor = CameraActor::New();
+ DALI_TEST_EQUALS( actor.GetNearClippingPlane(), 800.0f, TEST_LOCATION );
+
+ actor.SetNearClippingPlane(400.0f);
+ DALI_TEST_EQUALS( actor.GetNearClippingPlane(), 400.0f, TEST_LOCATION );
+
+ float value;
+ actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(400.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliCameraActorSetFarClippingPlane(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor Get/Set Far clipping plane");
+
+ CameraActor actor = CameraActor::New();
+ DALI_TEST_EQUALS( actor.GetFarClippingPlane(), 800.0f + (0xFFFF>>4), TEST_LOCATION );
+
+ actor.SetFarClippingPlane(4000.0f);
+ DALI_TEST_EQUALS( actor.GetFarClippingPlane(), 4000.0f, TEST_LOCATION );
+
+ float value;
+ actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(4000.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliCameraActorSetTargetPosition(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor Get/Set Target Position");
+
+ CameraActor actor = CameraActor::New();
+ DALI_TEST_EQUALS( actor.GetTargetPosition(), Vector3::ZERO, TEST_LOCATION );
+
+ Vector3 target( 10.0f, 20.0f, 30.0f);
+ actor.SetTargetPosition( target );
+
+ DALI_TEST_EQUALS( actor.GetTargetPosition(), target, TEST_LOCATION );
+
+ Vector3 value;
+ actor.GetProperty(CameraActor::TARGET_POSITION).Get(value);
+ DALI_TEST_EQUALS(target, value, FLOAT_EPSILON, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliCameraActorSetInvertYAxis(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor Get/Set InvertYAxis");
+
+ CameraActor actor = CameraActor::New();
+ DALI_TEST_EQUALS( actor.GetInvertYAxis(), false, TEST_LOCATION );
+
+ actor.SetInvertYAxis(true);
+
+ DALI_TEST_EQUALS( actor.GetInvertYAxis(), true, TEST_LOCATION );
+
+ bool bValue;
+ actor.GetProperty(CameraActor::INVERT_Y_AXIS).Get(bValue);
+ DALI_TEST_EQUALS(true, bValue, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliCameraActorModelView(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor Test view application");
+
+ BitmapImage image = CreateBitmapImage();
+
+ ImageActor actor = ImageActor::New( image );
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetPosition(20.0f, 30.0f, 40.0f);
+ actor.SetParentOrigin(ParentOrigin::CENTER);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(0);
+ application.Render();
+ application.SendNotification();
+
+ Matrix resultMatrix(true);
+ resultMatrix.SetTransformComponents( Vector3::ONE, Quaternion::IDENTITY, actor.GetCurrentPosition());
+
+ RenderTask task = Stage::GetCurrent().GetRenderTaskList().GetTask(0);
+ CameraActor cameraActor = task.GetCameraActor();
+
+ Matrix viewMatrix(false);
+ cameraActor.GetProperty(CameraActor::VIEW_MATRIX).Get( viewMatrix );
+ Matrix::Multiply(resultMatrix, resultMatrix, viewMatrix);
+
+ DALI_TEST_CHECK( application.GetGlAbstraction().CheckUniformValue( "uModelView", resultMatrix ) );
+ END_TEST;
+}
+
+int UtcDaliCameraActorSetPerspectiveProjection(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor::SetPerspectiveProjection( const Size& size )");
+
+ CameraActor actor = CameraActor::New();
+ actor.SetPerspectiveProjection( Size( 100.f, 150.f ) );
+
+ DALI_TEST_CHECK(actor);
+
+ float value;
+ actor.GetProperty(CameraActor::ASPECT_RATIO).Get(value);
+ DALI_TEST_EQUALS(0.666666f, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(value);
+ DALI_TEST_EQUALS(0.489957f, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(150.f, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(4245.f, value, FLOAT_EPSILON, TEST_LOCATION);
+
+ DALI_TEST_EQUALS((int)actor.GetProjectionMode(), (int)Dali::Camera::PERSPECTIVE_PROJECTION, TEST_LOCATION);
+
+ std::string stringValue;
+ actor.GetProperty(CameraActor::PROJECTION_MODE).Get(stringValue);
+ DALI_TEST_EQUALS(stringValue, "PERSPECTIVE_PROJECTION", TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliCameraActorSetOrthographicProjection01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor::SetOrthographicProjection01()");
+
+ CameraActor actor = CameraActor::New(Size(1080.0f, 1920.0f));
+ DALI_TEST_CHECK(actor);
+
+ Stage::GetCurrent().Add( actor );
+
+ actor.SetOrthographicProjection( Size( 1080.0f, 1920.0f ) );
+ application.SendNotification();
+ application.Render(0);
+ application.Render();
+ application.SendNotification();
+
+ float defaultAspectRatio;
+ float defaultFieldOfView;
+ float defaultNearPlaneDistance;
+ float defaultFarPlaneDistance;
+ actor.GetProperty(CameraActor::ASPECT_RATIO).Get(defaultAspectRatio);
+ actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(defaultFieldOfView);
+ actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(defaultNearPlaneDistance);
+ actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(defaultFarPlaneDistance);
+ Vector3 defaultPos = actor.GetCurrentPosition();
+
+ actor.SetOrthographicProjection( Size( 1080.0f, 1920.0f ) );
+
+ application.SendNotification();
+ application.Render(0);
+ application.Render();
+ application.SendNotification();
+
+ float value;
+ actor.GetProperty(CameraActor::ASPECT_RATIO).Get(value);
+ DALI_TEST_EQUALS(defaultAspectRatio, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(value);
+ DALI_TEST_EQUALS(defaultFieldOfView, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(defaultNearPlaneDistance, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(defaultFarPlaneDistance, value, FLOAT_EPSILON, TEST_LOCATION);
+
+ actor.GetProperty(CameraActor::LEFT_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(-540.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::RIGHT_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS( 540.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::TOP_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(960.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::BOTTOM_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(-960.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+
+ Vector3 pos = actor.GetCurrentPosition();
+ DALI_TEST_EQUALS(defaultPos.z, pos.z, 0.001f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS((int)actor.GetProjectionMode(), (int)Dali::Camera::ORTHOGRAPHIC_PROJECTION, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliCameraActorSetOrthographicProjection02(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor::SetOrthographicProjection02()");
+
+ CameraActor actor = CameraActor::New();
+ DALI_TEST_CHECK(actor);
+
+ float defaultAspectRatio;
+ float defaultFieldOfView;
+ float defaultNearPlaneDistance;
+ float defaultFarPlaneDistance;
+ actor.GetProperty(CameraActor::ASPECT_RATIO).Get(defaultAspectRatio);
+ actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(defaultFieldOfView);
+ actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(defaultNearPlaneDistance);
+ actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(defaultFarPlaneDistance);
+
+ actor.SetOrthographicProjection( -100.0f, 200.0f, -300.0f, 500.0f, 400.0f, 4000.0f );
+
+ float value;
+ actor.GetProperty(CameraActor::ASPECT_RATIO).Get(value);
+ DALI_TEST_EQUALS(defaultAspectRatio, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(value);
+ DALI_TEST_EQUALS(defaultFieldOfView, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(400.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(4000.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+
+ actor.GetProperty(CameraActor::LEFT_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(-100.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::RIGHT_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS( 200.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::TOP_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(-300.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::BOTTOM_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS( 500.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+
+ DALI_TEST_EQUALS((int)actor.GetProjectionMode(), (int)Dali::Camera::ORTHOGRAPHIC_PROJECTION, TEST_LOCATION);
+
+ END_TEST;
+}
+
+
+int UtcDaliCameraActorSetOrthographicProjection03(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor::SetOrthographicProjection03()");
+
+ CameraActor actor = CameraActor::New();
+ DALI_TEST_CHECK(actor);
+
+ float defaultAspectRatio;
+ float defaultFieldOfView;
+ float defaultNearPlaneDistance;
+ float defaultFarPlaneDistance;
+ actor.GetProperty(CameraActor::ASPECT_RATIO).Get(defaultAspectRatio);
+ actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(defaultFieldOfView);
+ actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(defaultNearPlaneDistance);
+ actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(defaultFarPlaneDistance);
+
+ actor.SetProjectionMode(Dali::Camera::ORTHOGRAPHIC_PROJECTION);
+
+ actor.SetProperty(CameraActor::LEFT_PLANE_DISTANCE, -100.0f);
+ actor.SetProperty(CameraActor::RIGHT_PLANE_DISTANCE, 200.0f);
+ actor.SetProperty(CameraActor::TOP_PLANE_DISTANCE, -300.0f);
+ actor.SetProperty(CameraActor::BOTTOM_PLANE_DISTANCE, 500.0f);
+ actor.SetNearClippingPlane( 400.0f );
+ actor.SetFarClippingPlane( 4000.0f );
+
+ float value;
+ actor.GetProperty(CameraActor::ASPECT_RATIO).Get(value);
+ DALI_TEST_EQUALS(defaultAspectRatio, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::FIELD_OF_VIEW).Get(value);
+ DALI_TEST_EQUALS(defaultFieldOfView, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::NEAR_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(400.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::FAR_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(4000.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+
+ actor.GetProperty(CameraActor::LEFT_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(-100.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::RIGHT_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS( 200.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::TOP_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS(-300.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+ actor.GetProperty(CameraActor::BOTTOM_PLANE_DISTANCE).Get(value);
+ DALI_TEST_EQUALS( 500.0f, value, FLOAT_EPSILON, TEST_LOCATION);
+
+ DALI_TEST_EQUALS((int)actor.GetProjectionMode(), (int)Dali::Camera::ORTHOGRAPHIC_PROJECTION, TEST_LOCATION);
+ std::string stringValue;
+ actor.GetProperty(CameraActor::PROJECTION_MODE).Get(stringValue);
+ DALI_TEST_EQUALS(stringValue, "ORTHOGRAPHIC_PROJECTION", TEST_LOCATION);
+ END_TEST;
+}
+
+
+
+int UtcDaliCameraActorReadProjectionMatrix(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CameraActor::ReadProjectionMatrix()");
+
+ CameraActor camera = Stage::GetCurrent().GetRenderTaskList().GetTask(0u).GetCameraActor();
+ application.SendNotification();
+ application.Render(0);
+ application.Render();
+ application.SendNotification();
+ Image image = CreateBitmapImage();
+ ImageActor imageActor = ImageActor::New( image );
+ imageActor.SetSize(100.0f, 100.0f);
+ Stage::GetCurrent().Add(imageActor);
+
+ Matrix projectionMatrix;
+ Matrix viewMatrix;
+
+ camera.GetProperty(CameraActor::CameraActor::PROJECTION_MATRIX).Get(projectionMatrix);
+ camera.GetProperty(CameraActor::CameraActor::VIEW_MATRIX).Get(viewMatrix);
+
+ ShaderEffect shaderEffect = ShaderEffect::New( RENDER_SHADOW_VERTEX_SOURCE, RENDER_SHADOW_FRAGMENT_SOURCE);
+ imageActor.SetShaderEffect(shaderEffect);
+
+ shaderEffect.SetUniform( SHADER_LIGHT_CAMERA_PROJECTION_MATRIX_PROPERTY_NAME, Matrix::IDENTITY );
+ shaderEffect.SetUniform( SHADER_LIGHT_CAMERA_VIEW_MATRIX_PROPERTY_NAME, Matrix::IDENTITY );
+
+ Property::Index projectionMatrixPropertyIndex = shaderEffect.GetPropertyIndex(SHADER_LIGHT_CAMERA_PROJECTION_MATRIX_PROPERTY_NAME);
+ Property::Index viewMatrixPropertyIndex = shaderEffect.GetPropertyIndex(SHADER_LIGHT_CAMERA_VIEW_MATRIX_PROPERTY_NAME);
+
+ Constraint projectionMatrixConstraint = Constraint::New<Dali::Matrix>( projectionMatrixPropertyIndex, Source( camera, CameraActor::PROJECTION_MATRIX ), EqualToConstraint());
+ Constraint viewMatrixConstraint = Constraint::New<Dali::Matrix>( viewMatrixPropertyIndex, Source( camera, CameraActor::VIEW_MATRIX ), EqualToConstraint());
+
+ shaderEffect.ApplyConstraint(projectionMatrixConstraint);
+ shaderEffect.ApplyConstraint(viewMatrixConstraint);
+
+ application.SendNotification();
+ application.Render();
+
+ // Test effects of Constraint.
+ DALI_TEST_CHECK(application.GetGlAbstraction().CheckUniformValue(SHADER_LIGHT_CAMERA_PROJECTION_MATRIX_PROPERTY_NAME.c_str(), projectionMatrix));
+
+ DALI_TEST_CHECK(application.GetGlAbstraction().CheckUniformValue(SHADER_LIGHT_CAMERA_VIEW_MATRIX_PROPERTY_NAME.c_str(), viewMatrix));
+ END_TEST;
+}
+
+int UtcDaliCameraActorAnimatedProperties(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Internal::CameraActor::GetSceneObjectAnimatableProperty()");
+
+ CameraActor camera = Stage::GetCurrent().GetRenderTaskList().GetTask(0u).GetCameraActor();
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ Stage::GetCurrent().Add(actor);
+
+ actor.ApplyConstraint(Constraint::New<Dali::Vector3>( Actor::POSITION, Source( camera, Actor::POSITION), EqualToConstraint()));
+
+ camera.SetPosition(100.0f, 200.0f, 300.0f);
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), Vector3(100.0f, 200.0f, 300.0f), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliCameraActorPropertyIndices(void)
+{
+ TestApplication application;
+ CameraActor camera = Stage::GetCurrent().GetRenderTaskList().GetTask(0u).GetCameraActor();
+
+ Actor basicActor = Actor::New();
+ Property::IndexContainer indices;
+ camera.GetPropertyIndices( indices );
+ DALI_TEST_CHECK( indices.size() > basicActor.GetPropertyCount() );
+ DALI_TEST_EQUALS( indices.size(), camera.GetPropertyCount(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliCameraActorCheckLookAtAndFreeLookViews01(void)
+{
+ TestApplication application;
+ Stage stage = Stage::GetCurrent();
+ Vector2 stageSize = stage.GetSize();
+
+ CameraActor freeLookCameraActor = CameraActor::New(stageSize);
+ freeLookCameraActor.SetParentOrigin(ParentOrigin::CENTER);
+ freeLookCameraActor.SetType(Camera::FREE_LOOK);
+
+ Vector3 targetPosition(30.0f, 240.0f, -256.0f);
+ Actor target = Actor::New();
+ target.SetParentOrigin(ParentOrigin::CENTER);
+ target.SetPosition(targetPosition);
+
+ Constraint cameraOrientationConstraint =
+ Constraint::New<Quaternion> ( Actor::ROTATION,
+ Source( target, Actor::WORLD_POSITION ),
+ Source( freeLookCameraActor, Actor::WORLD_POSITION ),
+ Source( target, Actor::WORLD_ROTATION ),
+ &LookAt );
+ freeLookCameraActor.ApplyConstraint( cameraOrientationConstraint );
+
+ CameraActor lookAtCameraActor = CameraActor::New(stageSize);
+ lookAtCameraActor.SetType(Camera::LOOK_AT_TARGET);
+ lookAtCameraActor.SetTargetPosition(targetPosition);
+ lookAtCameraActor.SetParentOrigin(ParentOrigin::CENTER);
+
+ stage.Add(target);
+ stage.Add(freeLookCameraActor);
+ stage.Add(lookAtCameraActor);
+
+ // Create an arbitrary vector
+ for( float x=-1.0f; x<=1.0f; x+=0.1f )
+ {
+ for( float y=-1.0f; y<1.0f; y+=0.1f )
+ {
+ for( float z=-1.0f; z<1.0f; z+=0.1f )
+ {
+ Vector3 position(x, y, z);
+ position.Normalize();
+ position *= 200.0f;
+
+ freeLookCameraActor.SetPosition(position);
+ lookAtCameraActor.SetPosition(position);
+
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+ Matrix freeLookViewMatrix;
+ Matrix lookAtViewMatrix;
+ freeLookCameraActor.GetProperty(CameraActor::CameraActor::VIEW_MATRIX).Get(freeLookViewMatrix);
+ lookAtCameraActor.GetProperty(CameraActor::CameraActor::VIEW_MATRIX).Get(lookAtViewMatrix);
+
+ DALI_TEST_EQUALS( freeLookViewMatrix, lookAtViewMatrix, 0.01, TEST_LOCATION );
+ }
+ }
+ }
+ END_TEST;
+}
+
+int UtcDaliCameraActorCheckLookAtAndFreeLookViews02(void)
+{
+ TestApplication application;
+ Stage stage = Stage::GetCurrent();
+ Vector2 stageSize = stage.GetSize();
+
+ CameraActor freeLookCameraActor = CameraActor::New(stageSize);
+ freeLookCameraActor.SetParentOrigin(ParentOrigin::CENTER);
+ freeLookCameraActor.SetType(Camera::FREE_LOOK);
+
+ Vector3 targetPosition(30.0f, 240.0f, -256.0f);
+ Actor target = Actor::New();
+ target.SetParentOrigin(ParentOrigin::CENTER);
+ target.SetPosition(targetPosition);
+
+ Constraint cameraOrientationConstraint =
+ Constraint::New<Quaternion> ( Actor::ROTATION,
+ Source( target, Actor::WORLD_POSITION ),
+ Source( freeLookCameraActor, Actor::WORLD_POSITION ),
+ Source( target, Actor::WORLD_ROTATION ),
+ &LookAt );
+ freeLookCameraActor.ApplyConstraint( cameraOrientationConstraint );
+
+ CameraActor lookAtCameraActor = CameraActor::New(stageSize);
+ lookAtCameraActor.SetType(Camera::LOOK_AT_TARGET);
+ lookAtCameraActor.SetTargetPosition(targetPosition);
+ lookAtCameraActor.SetParentOrigin(ParentOrigin::CENTER);
+
+ stage.Add(target);
+ stage.Add(freeLookCameraActor);
+ stage.Add(lookAtCameraActor);
+
+ // Create an arbitrary vector
+ for( float x=-1.0f; x<=1.0f; x+=0.1f )
+ {
+ for( float y=-1.0f; y<1.0f; y+=0.1f )
+ {
+ for( float z=-1.0f; z<1.0f; z+=0.1f )
+ {
+ Vector3 position(x, y, z);
+ position.Normalize();
+ position *= 200.0f;
+
+ freeLookCameraActor.SetPosition(position);
+ lookAtCameraActor.SetPosition(position);
+
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+ Matrix freeLookViewMatrix;
+ Matrix lookAtViewMatrix;
+ freeLookCameraActor.GetProperty(CameraActor::CameraActor::VIEW_MATRIX).Get(freeLookViewMatrix);
+ lookAtCameraActor.GetProperty(CameraActor::CameraActor::VIEW_MATRIX).Get(lookAtViewMatrix);
+
+ Matrix freeLookWorld = freeLookCameraActor.GetCurrentWorldMatrix();
+
+ Matrix freeLookTest(false);
+ Matrix::Multiply(freeLookTest, freeLookViewMatrix, freeLookWorld);
+ DALI_TEST_EQUALS( freeLookTest, Matrix::IDENTITY, 0.01f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS( freeLookViewMatrix, lookAtViewMatrix, 0.01, TEST_LOCATION );
+ }
+ }
+ }
+ END_TEST;
+}
+
+int UtcDaliCameraActorCheckLookAtAndFreeLookViews03(void)
+{
+ TestApplication application;
+ Stage stage = Stage::GetCurrent();
+ Vector2 stageSize = stage.GetSize();
+
+ Vector3 targetPosition(Vector3::ZERO);
+
+ CameraActor lookAtCameraActor = CameraActor::New(stageSize);
+ lookAtCameraActor.SetType(Camera::LOOK_AT_TARGET);
+ lookAtCameraActor.SetTargetPosition(targetPosition);
+ lookAtCameraActor.SetParentOrigin(ParentOrigin::CENTER);
+ stage.Add(lookAtCameraActor);
+
+ Vector3 cameraOffset( 0.f, 0.f, 100.f );
+
+ CameraActor freeLookCameraActor = CameraActor::New(stageSize);
+ freeLookCameraActor.SetType(Camera::FREE_LOOK);
+ freeLookCameraActor.SetParentOrigin(ParentOrigin::CENTER);
+
+ Quaternion cameraOrientation( Radian(Degree(180.f)), Vector3::YAXIS );
+ freeLookCameraActor.SetPosition(cameraOffset);
+ freeLookCameraActor.SetRotation(cameraOrientation);
+
+ Actor cameraAnchor = Actor::New();
+ cameraAnchor.Add(lookAtCameraActor);
+ stage.Add(cameraAnchor);
+
+
+ for( float angle = 1.f; angle <= 180.f; angle += 1.f )
+ {
+ Quaternion rotation(Radian(Degree(angle)), Vector3::YAXIS);
+
+ lookAtCameraActor.SetPosition( rotation.Rotate( cameraOffset ) );
+ cameraAnchor.SetRotation( rotation );
+
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+
+ Matrix freeLookViewMatrix;
+ freeLookCameraActor.GetProperty(CameraActor::CameraActor::VIEW_MATRIX).Get(freeLookViewMatrix);
+
+ Matrix freeLookWorld = freeLookCameraActor.GetCurrentWorldMatrix();
+
+ Matrix freeLookTest(false);
+ Matrix::Multiply( freeLookTest, freeLookViewMatrix, freeLookWorld);
+ DALI_TEST_EQUALS( freeLookTest, Matrix::IDENTITY, 0.01f, TEST_LOCATION);
+ }
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_character_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_character_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+int UtcDaliCharacterCopyConstructor(void)
+{
+ tet_infoline("UtcDaliCharacterCopyConstructor ");
+ TestApplication application;
+
+ Text text( std::string("12") );
+
+ Character c1 = text[0];
+ Character c2 = text[1];
+
+ Character c3( c1 );
+ Character c4 = c2;
+
+ DALI_TEST_CHECK( (c1==c3) && (c2==c4) );
+ END_TEST;
+}
+
+int UtcDaliCharacterComparissonOperators(void)
+{
+ tet_infoline("UtcDaliCharacterComparissonOperators ");
+ TestApplication application;
+
+ Text text( std::string("12") );
+
+ Character c1 = text[0];
+ Character c2 = text[1];
+
+ Character c3( c1 );
+ Character c4 = c2;
+
+ DALI_TEST_CHECK( (c1==c3) && (c2==c4) && (c1!=c2) && (c1!=c4) );
+ END_TEST;
+}
+
+int UtcDaliCharacterAssignmentOperator(void)
+{
+ tet_infoline("UtcDaliCharacterAssignmentOperator ");
+ TestApplication application;
+
+ Text text( std::string("12") );
+ Character c1 = text[0];
+ Character c2 = text[1];
+ c1 = c2; //assign
+ DALI_TEST_CHECK( c1 == c1);
+
+ // this should do nothing
+ c1 = c1;
+ DALI_TEST_CHECK( c1 == c2);
+
+ END_TEST;
+}
+
+int UtcDaliCharacterIsLeftToRight(void)
+{
+ tet_infoline("UtcDaliCharacterIsLeftToRight ");
+ TestApplication application;
+
+ Text text( std::string("12בא") );
+
+ Character c1 = text[0];
+ Character c2 = text[1];
+ Character c3 = text[2];
+ Character c4 = text[3];
+
+ DALI_TEST_CHECK( c1.GetCharacterDirection() != Character::RightToLeft &&
+ c2.GetCharacterDirection() != Character::RightToLeft &&
+ c3.GetCharacterDirection() == Character::RightToLeft &&
+ c4.GetCharacterDirection() == Character::RightToLeft );
+ END_TEST;
+}
+
+int UtcDaliGetCharacterDirection(void)
+{
+ tet_infoline("UtcDaliGetCharacterDirection ");
+ TestApplication application;
+
+ Text text( std::string("Aבא ") );
+
+ Character c1 = text[0];
+ Character c2 = text[1];
+ Character c3 = text[2];
+ Character c4 = text[3];
+
+ DALI_TEST_EQUALS( c1.GetCharacterDirection(), Character::LeftToRight, TEST_LOCATION );
+ DALI_TEST_EQUALS( c2.GetCharacterDirection(), Character::RightToLeft, TEST_LOCATION );
+ DALI_TEST_EQUALS( c3.GetCharacterDirection(), Character::RightToLeft, TEST_LOCATION );
+ DALI_TEST_EQUALS( c4.GetCharacterDirection(), Character::Neutral, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliCharacterIsWhiteSpace(void)
+{
+ tet_infoline("UtcDaliCharacterIsWhiteSpace ");
+ TestApplication application;
+
+ Text text( std::string("ab c\n\tdef") );
+
+ DALI_TEST_CHECK(!text[0].IsWhiteSpace()); // 'a'
+ DALI_TEST_CHECK(!text[1].IsWhiteSpace()); // 'b'
+ DALI_TEST_CHECK(text[2].IsWhiteSpace()); // ' '
+ DALI_TEST_CHECK(!text[3].IsWhiteSpace()); // 'c'
+ DALI_TEST_CHECK(text[4].IsWhiteSpace()); // '\n'
+ DALI_TEST_CHECK(text[5].IsWhiteSpace()); // '\t'
+ DALI_TEST_CHECK(!text[6].IsWhiteSpace()); // 'd'
+ DALI_TEST_CHECK(!text[7].IsWhiteSpace()); // 'e'
+ DALI_TEST_CHECK(!text[8].IsWhiteSpace()); // 'f'
+ END_TEST;
+}
+
+int UtcDaliCharacterIsNewLine(void)
+{
+ tet_infoline("UtcDaliCharacterIsWhiteSpace ");
+ TestApplication application;
+
+ Text text( std::string("ab c\n\tdef") );
+
+ DALI_TEST_CHECK(!text[0].IsNewLine()); // 'a'
+ DALI_TEST_CHECK(!text[1].IsNewLine()); // 'b'
+ DALI_TEST_CHECK(!text[2].IsNewLine()); // ' '
+ DALI_TEST_CHECK(!text[3].IsNewLine()); // 'c'
+ DALI_TEST_CHECK( text[4].IsNewLine()); // '\n'
+ DALI_TEST_CHECK(!text[5].IsNewLine()); // '\t'
+ DALI_TEST_CHECK(!text[6].IsNewLine()); // 'd'
+ DALI_TEST_CHECK(!text[7].IsNewLine()); // 'e'
+ DALI_TEST_CHECK(!text[8].IsNewLine()); // 'f'
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_constraint_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_constraint_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+namespace
+{
+
+struct EqualToQuaternion
+{
+ EqualToQuaternion()
+ {
+ }
+
+ Quaternion operator()( const Quaternion& current, const PropertyInput& property )
+ {
+ return property.GetQuaternion();
+ }
+};
+
+struct EqualToVector4
+{
+ EqualToVector4()
+ {
+ }
+
+ Vector4 operator()( const Vector4& current, const PropertyInput& property )
+ {
+ return property.GetVector4();
+ }
+};
+
+class PropertyInputAbstraction : public Dali::PropertyInput
+{
+public:
+ PropertyInputAbstraction(const bool& val) : mType(Dali::Property::BOOLEAN), mBoolData( val ) {}
+ PropertyInputAbstraction(const float& val) : mType(Dali::Property::FLOAT), mFloatData( val ) {}
+ PropertyInputAbstraction(const Vector2& val) : mType(Dali::Property::VECTOR2), mVector2Data( val ) {}
+ PropertyInputAbstraction(const Vector3& val) : mType(Dali::Property::VECTOR3), mVector3Data( val ) {}
+ PropertyInputAbstraction(const Vector4& val) : mType(Dali::Property::VECTOR4), mVector4Data( val ) {}
+ PropertyInputAbstraction(const Matrix3& val) : mType(Dali::Property::MATRIX3), mMatrix3Data( val ) {}
+ PropertyInputAbstraction(const Matrix& val) : mType(Dali::Property::MATRIX), mMatrixData( val ) {}
+ PropertyInputAbstraction(const Quaternion& val) : mType(Dali::Property::ROTATION), mQuaternionData( val ) {}
+
+ ~PropertyInputAbstraction() {}
+
+ Dali::Property::Type GetType() const { return mType; }
+
+ const bool& GetBoolean() const { return mBoolData; }
+
+ const float& GetFloat() const { return mFloatData; }
+
+ const Vector2& GetVector2() const { return mVector2Data; }
+ const Vector3& GetVector3() const { return mVector3Data; }
+ const Vector4& GetVector4() const { return mVector4Data; }
+
+ const Matrix3& GetMatrix3() const { return mMatrix3Data; }
+ const Matrix& GetMatrix() const { return mMatrixData; }
+
+ const Quaternion& GetQuaternion() const { return mQuaternionData; }
+
+private:
+ Dali::Property::Type mType;
+ bool mBoolData;
+ float mFloatData;
+ Vector2 mVector2Data;
+ Vector3 mVector3Data;
+ Vector4 mVector4Data;
+ Matrix3 mMatrix3Data;
+ Matrix mMatrixData;
+ Quaternion mQuaternionData;
+};
+
+static const float POSITION_EPSILON = 0.0001f;
+static const float ROTATION_EPSILON = 0.0001f;
+
+struct TestConstraint
+{
+ Vector4 operator()(const Vector4& color)
+ {
+ return Vector4(color.x, color.y, color.z, 0.1f);
+ }
+};
+
+struct TestConstraintToVector3
+{
+ TestConstraintToVector3(Vector3 target)
+ : mTarget(target)
+ {
+ }
+
+ Vector3 operator()(const Vector3& current)
+ {
+ return mTarget;
+ }
+
+ Vector3 mTarget;
+};
+
+struct TestColorConstraint
+{
+ TestColorConstraint(Vector4 target)
+ : mTarget(target)
+ {
+ }
+
+ Vector4 operator()(const Vector4& color)
+ {
+ return mTarget;
+ }
+
+ Vector4 mTarget;
+};
+
+struct TestPositionConstraint
+{
+ TestPositionConstraint(Vector3 target)
+ : mTarget(target)
+ {
+ }
+
+ Vector3 operator()(const Vector3& position)
+ {
+ return mTarget;
+ }
+
+ Vector3 mTarget;
+};
+
+
+struct TestAlwaysTrueConstraint
+{
+ bool operator()( const bool& current )
+ {
+ return true;
+ }
+};
+
+struct TestAlwaysEqualOrGreaterThanConstraint
+{
+ TestAlwaysEqualOrGreaterThanConstraint( float value )
+ : mValue( value )
+ {
+ }
+
+ float operator()( const float& current )
+ {
+ return ( current < mValue ) ? mValue : current;
+ }
+
+ float mValue;
+};
+
+struct TestAlwaysEqualOrGreaterThanConstraintVector2
+{
+ TestAlwaysEqualOrGreaterThanConstraintVector2( Vector2 value )
+ : mValue( value )
+ {
+ }
+
+ Vector2 operator()( const Vector2& current )
+ {
+ return Vector2( ( current.x < mValue.x ) ? mValue.x : current.x,
+ ( current.y < mValue.y ) ? mValue.y : current.y
+ );
+ }
+
+ Vector2 mValue;
+};
+
+struct TestAlwaysEqualOrGreaterThanConstraintVector3
+{
+ TestAlwaysEqualOrGreaterThanConstraintVector3( Vector3 value )
+ : mValue( value )
+ {
+ }
+
+ Vector3 operator()( const Vector3& current )
+ {
+ return Vector3( ( current.x < mValue.x ) ? mValue.x : current.x,
+ ( current.y < mValue.y ) ? mValue.y : current.y,
+ ( current.z < mValue.z ) ? mValue.z : current.z
+ );
+ }
+
+ Vector3 mValue;
+};
+
+struct TestAlwaysEqualOrGreaterThanConstraintVector4
+{
+ TestAlwaysEqualOrGreaterThanConstraintVector4( Vector4 value )
+ : mValue( value )
+ {
+ }
+
+ Vector4 operator()( const Vector4& current )
+ {
+ return Vector4( ( current.x < mValue.x ) ? mValue.x : current.x,
+ ( current.y < mValue.y ) ? mValue.y : current.y,
+ ( current.z < mValue.z ) ? mValue.z : current.z,
+ ( current.w < mValue.w ) ? mValue.w : current.w
+ );
+ }
+
+ Vector4 mValue;
+};
+
+struct TestConstraintFloat
+{
+ TestConstraintFloat( float value )
+ : mValue( value )
+ {
+ }
+
+ float operator()( const float& current )
+ {
+ return mValue;
+ }
+
+ float mValue;
+};
+
+struct TestConstraintVector2
+{
+ TestConstraintVector2( Vector2 value )
+ : mValue( value )
+ {
+ }
+
+ Vector2 operator()( const Vector2& current )
+ {
+ return mValue;
+ }
+
+ Vector2 mValue;
+};
+
+struct TestConstraintVector3
+{
+ TestConstraintVector3( Vector3 value )
+ : mValue( value )
+ {
+ }
+
+ Vector3 operator()( const Vector3& current )
+ {
+ return mValue;
+ }
+
+ Vector3 mValue;
+};
+
+struct TestConstraintVector4
+{
+ TestConstraintVector4( Vector4 value )
+ : mValue( value )
+ {
+ }
+
+ Vector4 operator()( const Vector4& current )
+ {
+ return mValue;
+ }
+
+ Vector4 mValue;
+};
+
+struct TestConstraintRotation
+{
+ TestConstraintRotation( Quaternion rotation )
+ : mRotation( rotation )
+ {
+ }
+
+ Quaternion operator()( const Quaternion& current )
+ {
+ return mRotation;
+ }
+
+ Quaternion mRotation;
+};
+
+struct TestConstraintMatrix3
+{
+ TestConstraintMatrix3(Matrix3 matrix3)
+ : mMatrix3( matrix3 )
+ {
+ }
+
+ Matrix3 operator()( const Matrix3& current )
+ {
+ return mMatrix3;
+ }
+
+ Matrix3 mMatrix3;
+};
+
+struct TestConstraintMatrix
+{
+ TestConstraintMatrix(Matrix matrix)
+ : mMatrix( matrix )
+ {
+ }
+
+ Matrix operator()( const Matrix& current )
+ {
+ return mMatrix;
+ }
+
+ Matrix mMatrix;
+};
+
+struct MoveAwayWithFadeConstraint
+{
+ MoveAwayWithFadeConstraint( float distance )
+ : mDistance( distance )
+ {
+ }
+
+ Vector3 operator()( const Vector3& current,
+ const PropertyInput& color )
+ {
+ return Vector3( current.x,
+ current.y,
+ -mDistance * (1.0f - color.GetVector4().a) );
+ }
+
+ float mDistance;
+};
+
+struct TestBottomRightAlignConstraint
+{
+ Vector3 operator()( const Vector3& current,
+ const PropertyInput& parentSize )
+ {
+ return Vector3( parentSize.GetVector3().x, parentSize.GetVector3().y, 0.0f );
+ }
+};
+
+struct MeanPositionConstraint1
+{
+ Vector3 operator()( const Vector3& current,
+ const PropertyInput& position1 )
+ {
+ return Vector3( position1.GetVector3() );
+ }
+};
+
+struct MeanPositionConstraint2
+{
+ Vector3 operator()( const Vector3& current,
+ const PropertyInput& position1,
+ const PropertyInput& position2 )
+ {
+ Vector3 meanValue = position1.GetVector3() +
+ position2.GetVector3();
+
+ return meanValue * 0.5f; // div 2
+ }
+};
+
+struct MeanPositionConstraint3
+{
+ Vector3 operator()( const Vector3& current,
+ const PropertyInput& position1,
+ const PropertyInput& position2,
+ const PropertyInput& position3 )
+ {
+ Vector3 meanValue = position1.GetVector3() +
+ position2.GetVector3() +
+ position3.GetVector3();
+
+ return meanValue * (1.0f / 3.0f); // div 3
+ }
+};
+
+struct MeanPositionConstraint4
+{
+ Vector3 operator()( const Vector3& current,
+ const PropertyInput& position1,
+ const PropertyInput& position2,
+ const PropertyInput& position3,
+ const PropertyInput& position4 )
+ {
+ Vector3 meanValue = position1.GetVector3() +
+ position2.GetVector3() +
+ position3.GetVector3() +
+ position4.GetVector3();
+
+ return meanValue * 0.25f; // div 4
+ }
+};
+
+struct MeanPositionConstraint5
+{
+ Vector3 operator()( const Vector3& current,
+ const PropertyInput& position1,
+ const PropertyInput& position2,
+ const PropertyInput& position3,
+ const PropertyInput& position4,
+ const PropertyInput& position5 )
+ {
+ Vector3 meanValue = position1.GetVector3() +
+ position2.GetVector3() +
+ position3.GetVector3() +
+ position4.GetVector3() +
+ position5.GetVector3();
+
+ return meanValue * 0.2f; // div 5
+ }
+};
+
+struct MeanPositionConstraint6
+{
+ Vector3 operator()( const Vector3& current,
+ const PropertyInput& position1,
+ const PropertyInput& position2,
+ const PropertyInput& position3,
+ const PropertyInput& position4,
+ const PropertyInput& position5,
+ const PropertyInput& position6 )
+ {
+ Vector3 meanValue = position1.GetVector3() +
+ position2.GetVector3() +
+ position3.GetVector3() +
+ position4.GetVector3() +
+ position5.GetVector3() +
+ position6.GetVector3();
+
+ return meanValue * (1.0f / 6.0f); // div 6
+ }
+};
+
+struct TestRelativeConstraintFloat
+{
+ TestRelativeConstraintFloat(float scale)
+ : mScale(scale)
+ {
+ }
+
+ float operator()( const float& current, const PropertyInput& relative )
+ {
+ return relative.GetFloat() * mScale;
+ }
+
+ float mScale;
+};
+
+struct TestRelativeConstraintVector3
+{
+ TestRelativeConstraintVector3(float scale)
+ : mScale(scale)
+ {
+ }
+
+ Vector3 operator()( const Vector3& current, const PropertyInput& relative )
+ {
+ return relative.GetVector3() * mScale;
+ }
+
+ float mScale;
+};
+
+} // anonymous namespace
+
+
+
+
+
+
+int UtcDaliConstraintNewBoolean(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a boolean property
+ bool startValue(false);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ /**
+ * Test that the Constraint is correctly applied on a clean Node
+ */
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ // Apply constraint
+
+ Constraint constraint = Constraint::New<bool>( index, TestAlwaysTrueConstraint() );
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), false, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), true, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), true, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), true, TEST_LOCATION );
+
+ // Try to fight with the constraint - this shouldn't work!
+ actor.SetProperty( index, false );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), true, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), true, TEST_LOCATION );
+
+ // Remove the constraint, then set new value
+ actor.RemoveConstraints();
+ actor.SetProperty( index, false );
+
+ // Constraint should have been removed
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), false, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), false, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewFloat(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a float property
+ float startValue(1.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_CHECK( actor.GetProperty<float>(index) == startValue );
+
+ /**
+ * Test that the Constraint is correctly applied on a clean Node
+ */
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<float>(index) == startValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<float>(index) == startValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<float>(index) == startValue );
+
+ // Apply constraint
+
+ float minValue( 2.0f );
+ Constraint constraint = Constraint::New<float>( index, TestAlwaysEqualOrGreaterThanConstraint( minValue ) );
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), minValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), minValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), minValue, TEST_LOCATION );
+
+ // Set to greater than 2.0f, the constraint will allow this
+ actor.SetProperty( index, 3.0f );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), 3.0f, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), 3.0f, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), 3.0f, TEST_LOCATION );
+
+ // Set to less than 2.0f, the constraint will NOT allow this
+ actor.SetProperty( index, 1.0f );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), minValue/*not 1.0f*/, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), minValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), minValue, TEST_LOCATION );
+
+ // Remove the constraint, then set new value
+ actor.RemoveConstraints();
+ actor.SetProperty( index, 1.0f );
+
+ // Constraint should have been removed
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), 1.0f, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), 1.0f, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewVector2(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector2 property
+ Vector2 startValue( 1.0f, 1.0f );
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_CHECK( actor.GetProperty<Vector2>(index) == startValue );
+
+ /**
+ * Test that the Constraint is correctly applied on a clean Node
+ */
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<Vector2>(index) == startValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<Vector2>(index) == startValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<Vector2>(index) == startValue );
+
+ // Apply constraint
+
+ Vector2 minValue( 2.0f, 2.0f );
+ Constraint constraint = Constraint::New<Vector2>( index, TestAlwaysEqualOrGreaterThanConstraintVector2( minValue ) );
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), minValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), minValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), minValue, TEST_LOCATION );
+
+ // Set to greater than 2.0f, the constraint will allow this
+ Vector2 greaterValue( 3.0f, 3.0f );
+ actor.SetProperty( index, greaterValue );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), greaterValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), greaterValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), greaterValue, TEST_LOCATION );
+
+ // Set to less than 2.0f, the constraint will NOT allow this
+ Vector2 lesserValue( 1.0f, 1.0f );
+ actor.SetProperty( index, lesserValue );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), minValue/*not lesserValue*/, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), minValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), minValue, TEST_LOCATION );
+
+ // Remove the constraint, then set new value
+ actor.RemoveConstraints();
+ actor.SetProperty( index, lesserValue );
+
+ // Constraint should have been removed
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), lesserValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), lesserValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewVector3(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector3 property
+ Vector3 startValue(1.0f, 1.0f, 1.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_CHECK( actor.GetProperty<Vector3>(index) == startValue );
+
+ /**
+ * Test that the Constraint is correctly applied on a clean Node
+ */
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<Vector3>(index) == startValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<Vector3>(index) == startValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<Vector3>(index) == startValue );
+
+ // Apply constraint
+
+ Vector3 minValue( 2.0f, 2.0f, 2.0f );
+ Constraint constraint = Constraint::New<Vector3>( index, TestAlwaysEqualOrGreaterThanConstraintVector3( minValue ) );
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), minValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), minValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), minValue, TEST_LOCATION );
+
+ // Set to greater than 2.0f, the constraint will allow this
+ Vector3 greaterValue( 3.0f, 3.0f, 3.0f );
+ actor.SetProperty( index, greaterValue );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), greaterValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), greaterValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), greaterValue, TEST_LOCATION );
+
+ // Set to less than 2.0f, the constraint will NOT allow this
+ Vector3 lesserValue( 1.0f, 1.0f, 1.0f );
+ actor.SetProperty( index, lesserValue );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), minValue/*not lesserValue*/, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), minValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), minValue, TEST_LOCATION );
+
+ // Remove the constraint, then set new value
+ actor.RemoveConstraints();
+ actor.SetProperty( index, lesserValue );
+
+ // Constraint should have been removed
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), lesserValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), lesserValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewVector4(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector4 property
+ Vector4 startValue( 1.0f, 1.0f, 1.0f, 1.0f );
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_CHECK( actor.GetProperty<Vector4>(index) == startValue );
+
+ /**
+ * Test that the Constraint is correctly applied on a clean Node
+ */
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<Vector4>(index) == startValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<Vector4>(index) == startValue );
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetProperty<Vector4>(index) == startValue );
+
+ // Apply constraint
+
+ Vector4 minValue( 2.0f, 2.0f, 2.0f, 2.0f );
+ Constraint constraint = Constraint::New<Vector4>( index, TestAlwaysEqualOrGreaterThanConstraintVector4( minValue ) );
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), minValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), minValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), minValue, TEST_LOCATION );
+
+ // Set to greater than 2.0f, the constraint will allow this
+ Vector4 greaterValue( 3.0f, 3.0f, 3.0f, 3.0f );
+ actor.SetProperty( index, greaterValue );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), greaterValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), greaterValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), greaterValue, TEST_LOCATION );
+
+ // Set to less than 2.0f, the constraint will NOT allow this
+ Vector4 lesserValue( 1.0f, 1.0f, 1.0f, 1.0f );
+ actor.SetProperty( index, lesserValue );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), minValue/*not lesserValue*/, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), minValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), minValue, TEST_LOCATION );
+
+ // Remove the constraint, then set new value
+ actor.RemoveConstraints();
+ actor.SetProperty( index, lesserValue );
+
+ // Constraint should have been removed
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), lesserValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), lesserValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewMatrix(void)
+{
+ try
+ {
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Matrix property
+ Matrix startValue = Matrix::IDENTITY;
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ DALI_TEST_CHECK( index != Property::INVALID_INDEX );
+ if (index != Property::INVALID_INDEX)
+ {
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_CHECK( actor.GetProperty<Matrix>(index) == startValue );
+
+ // Apply constraint
+ Matrix constraintLimit;
+ constraintLimit.SetTransformComponents(Vector3::ONE, Quaternion(Radian(Degree(30.0f)), Vector3::YAXIS), Vector3::ZAXIS );
+ Constraint constraint = Constraint::New<Matrix>( index, TestConstraintMatrix(constraintLimit));
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetProperty<Matrix>(index), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( actor.GetProperty<Matrix>(index), constraintLimit, TEST_LOCATION );
+ }
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_CHECK(0);
+ }
+ END_TEST;
+}
+
+int UtcDaliConstraintNewMatrix3(void)
+{
+ try
+ {
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Matrix3 property
+ Matrix3 startValue(1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ DALI_TEST_CHECK( index != Property::INVALID_INDEX );
+ if (index != Property::INVALID_INDEX)
+ {
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_CHECK( actor.GetProperty<Matrix3>(index) == startValue );
+
+ // Apply constraint
+ Matrix3 constraintLimit(42.0f, 0.0f, 0.0f, 0.0f, 42.0f, 0.0f, 0.0f, 0.0f, 1.0f);
+ Constraint constraint = Constraint::New<Matrix3>( index, TestConstraintMatrix3(constraintLimit));
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetProperty<Matrix3>(index), startValue, 0.001f, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( actor.GetProperty<Matrix3>(index), constraintLimit, 0.001f, TEST_LOCATION );
+ }
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str() );
+ DALI_TEST_CHECK(0);
+ }
+ END_TEST;
+}
+
+int UtcDaliConstraintNewQuaternion(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Quaternion property
+ Quaternion startValue( 0.0f, Vector3::YAXIS );
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Stage::GetCurrent().Add(actor);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), startValue, ROTATION_EPSILON, TEST_LOCATION );
+
+ /**
+ * Test that the Constraint is correctly applied on a clean Node
+ */
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), startValue, ROTATION_EPSILON, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), startValue, ROTATION_EPSILON, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), startValue, ROTATION_EPSILON, TEST_LOCATION );
+
+ // Apply constraint
+
+ Quaternion constrainedRotation( M_PI*0.25f, Vector3::YAXIS );
+ Constraint constraint = Constraint::New<Quaternion>( index, TestConstraintRotation( constrainedRotation ) );
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), startValue, ROTATION_EPSILON, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION );
+
+ // Set to a different rotation, the constraint will NOT allow this
+ Quaternion differentRotation( M_PI*0.5f, Vector3::YAXIS );
+ actor.SetProperty( index, differentRotation );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), constrainedRotation/*not differentRotation*/, ROTATION_EPSILON, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION );
+
+ // Remove the constraint, then set new value
+ actor.RemoveConstraints();
+ actor.SetProperty( index, differentRotation );
+
+ // Constraint should have been removed
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), differentRotation, ROTATION_EPSILON, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), differentRotation, ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewOffStageBoolean(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a boolean property
+ bool startValue(false);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ DALI_TEST_CHECK( actor.GetProperty<bool>(index) == startValue );
+
+ // Apply constraint to off-stage Actor
+ Constraint constraint = Constraint::New<bool>( index, TestAlwaysTrueConstraint() );
+ actor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), false, TEST_LOCATION );
+
+ // Add actor to stage
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), true, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), true, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), true, TEST_LOCATION );
+
+ // Take the actor off-stage
+ Stage::GetCurrent().Remove(actor);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), true, TEST_LOCATION );
+
+ // Set a new value; the constraint will not prevent this
+ actor.SetProperty( index, false );
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), false, TEST_LOCATION );
+
+ // Add actor to stage (2nd time)
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied (2nd time)
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), true, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), true, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), true, TEST_LOCATION );
+
+ // Take the actor off-stage (2nd-time)
+ Stage::GetCurrent().Remove(actor);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), true, TEST_LOCATION );
+
+ // Remove the constraint, and set a new value
+ actor.RemoveConstraints();
+ actor.SetProperty( index, false );
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), false, TEST_LOCATION );
+
+ // Add actor to stage (3rd time)
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be gone
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), false, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), false, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<bool>(index), false, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewOffStageFloat(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a float property
+ float startValue(1.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ DALI_TEST_CHECK( actor.GetProperty<float>(index) == startValue );
+
+ // Apply constraint to off-stage Actor
+ float constrainedValue( 2.0f );
+ Constraint constraint = Constraint::New<float>( index, TestConstraintFloat( constrainedValue ) );
+ actor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ // Add actor to stage
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), constrainedValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), constrainedValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), constrainedValue, TEST_LOCATION );
+
+ // Take the actor off-stage
+ Stage::GetCurrent().Remove(actor);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), constrainedValue, TEST_LOCATION );
+
+ // Set back to startValue; the constraint will not prevent this
+ actor.SetProperty( index, startValue );
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ // Add actor to stage (2nd time)
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied (2nd time)
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), constrainedValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), constrainedValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), constrainedValue, TEST_LOCATION );
+
+ // Take the actor off-stage (2nd-time)
+ Stage::GetCurrent().Remove(actor);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), constrainedValue, TEST_LOCATION );
+
+ // Remove the constraint, and set back to startValue
+ actor.RemoveConstraints();
+ actor.SetProperty( index, startValue );
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ // Add actor to stage (3rd time)
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be gone
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<float>(index), startValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewOffStageVector2(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector2 property
+ Vector2 startValue(1.0f, 1.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ DALI_TEST_CHECK( actor.GetProperty<Vector2>(index) == startValue );
+
+ // Apply constraint to off-stage Actor
+ Vector2 constrainedValue( 2.0f, 2.0f );
+ Constraint constraint = Constraint::New<Vector2>( index, TestConstraintVector2( constrainedValue ) );
+ actor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ // Add actor to stage
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), constrainedValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), constrainedValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), constrainedValue, TEST_LOCATION );
+
+ // Take the actor off-stage
+ Stage::GetCurrent().Remove(actor);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), constrainedValue, TEST_LOCATION );
+
+ // Set back to startValue; the constraint will not prevent this
+ actor.SetProperty( index, startValue );
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ // Add actor to stage (2nd time)
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied (2nd time)
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), constrainedValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), constrainedValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), constrainedValue, TEST_LOCATION );
+
+ // Take the actor off-stage (2nd-time)
+ Stage::GetCurrent().Remove(actor);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), constrainedValue, TEST_LOCATION );
+
+ // Remove the constraint, and set back to startValue
+ actor.RemoveConstraints();
+ actor.SetProperty( index, startValue );
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ // Add actor to stage (3rd time)
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be gone
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector2>(index), startValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewOffStageVector3(void)
+{
+ TestApplication application;
+ Vector3 startValue(1.0f, 1.0f, 1.0f);
+ Vector3 constrainedValue = Vector3( 2.0f, 3.0f, 4.0f );
+
+ Actor actor = Actor::New();
+ // Register a Vector3 property
+
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ DALI_TEST_CHECK( actor.GetProperty<Vector3>(index) == startValue );
+
+ // Apply constraint to off-stage Actor
+ Constraint constraint = Constraint::New<Vector3>( index, TestConstraintVector3( constrainedValue ) );
+ actor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ // Add actor to stage
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render();
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), constrainedValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), constrainedValue, TEST_LOCATION );
+ application.Render();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), constrainedValue, TEST_LOCATION );
+
+ // Take the actor off-stage
+ Stage::GetCurrent().Remove(actor);
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), constrainedValue, TEST_LOCATION );
+
+ // Set back to startValue; the constraint will not prevent this
+ Vector3 intermediateValue(5.0f, 6.0f, 7.0f);
+ actor.SetProperty( index, intermediateValue );
+ application.SendNotification();
+ application.Render();
+ application.Render(); // ensure both buffers are set to intermediateValue
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), intermediateValue, TEST_LOCATION );
+
+ // Add actor to stage (2nd time)
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render();
+
+ // Constraint should be fully applied (2nd time)
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), constrainedValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), constrainedValue, TEST_LOCATION );
+ application.Render();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), constrainedValue, TEST_LOCATION );
+
+ // Take the actor off-stage (2nd-time)
+ Stage::GetCurrent().Remove(actor);
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), constrainedValue, TEST_LOCATION );
+
+ // Remove the constraint, and set back to startValue
+ actor.RemoveConstraints();
+ actor.SetProperty( index, startValue );
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ // Add actor to stage (3rd time)
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render();
+
+ // Constraint should be gone
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+ application.Render();
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>(index), startValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewOffStageVector4(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Vector4 property
+ Vector4 startValue(1.0f, 1.0f, 1.0f, 1.0f);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ DALI_TEST_CHECK( actor.GetProperty<Vector4>(index) == startValue );
+
+ // Apply constraint to off-stage Actor
+ Vector4 constrainedValue( 2.0f, 2.0f, 2.0f, 2.0f );
+ Constraint constraint = Constraint::New<Vector4>( index, TestConstraintVector4( constrainedValue ) );
+ actor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+
+ // Add actor to stage
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), constrainedValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), constrainedValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), constrainedValue, TEST_LOCATION );
+
+ // Take the actor off-stage
+ Stage::GetCurrent().Remove(actor);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), constrainedValue, TEST_LOCATION );
+
+ // Set back to startValue; the constraint will not prevent this
+ actor.SetProperty( index, startValue );
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+
+ // Add actor to stage (2nd time)
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied (2nd time)
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), constrainedValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), constrainedValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), constrainedValue, TEST_LOCATION );
+
+ // Take the actor off-stage (2nd-time)
+ Stage::GetCurrent().Remove(actor);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), constrainedValue, TEST_LOCATION );
+
+ // Remove the constraint, and set back to startValue
+ actor.RemoveConstraints();
+ actor.SetProperty( index, startValue );
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+
+ // Add actor to stage (3rd time)
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be gone
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector4>(index), startValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewOffStageQuaternion(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Register a Quaternion property
+ Quaternion startValue( 0.0f, Vector3::YAXIS );
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), startValue, ROTATION_EPSILON, TEST_LOCATION );
+
+ // Apply constraint to off-stage Actor
+ Quaternion constrainedRotation( M_PI*0.25f, Vector3::YAXIS );
+ Constraint constraint = Constraint::New<Quaternion>( index, TestConstraintRotation( constrainedRotation ) );
+ actor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), startValue, ROTATION_EPSILON, TEST_LOCATION );
+
+ // Add actor to stage
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION );
+
+ // Take the actor off-stage
+ Stage::GetCurrent().Remove(actor);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION );
+
+ // Set back to startValue; the constraint will not prevent this
+ actor.SetProperty( index, startValue );
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), startValue, ROTATION_EPSILON, TEST_LOCATION );
+
+ // Add actor to stage (2nd time)
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied (2nd time)
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION );
+
+ // Take the actor off-stage (2nd-time)
+ Stage::GetCurrent().Remove(actor);
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), constrainedRotation, ROTATION_EPSILON, TEST_LOCATION );
+
+ // Remove the constraint, and set back to startValue
+ actor.RemoveConstraints();
+ actor.SetProperty( index, startValue );
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), startValue, ROTATION_EPSILON, TEST_LOCATION );
+
+ // Add actor to stage (3rd time)
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be gone
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), startValue, ROTATION_EPSILON, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), startValue, ROTATION_EPSILON, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Quaternion>(index), startValue, ROTATION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewLocalInput(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ Vector3 startValue( 0.0f, 0.0f, 0.0f );
+ float distanceWhenFullyTransparent( 100.0f );
+
+ /**
+ * Test that the Constraint is correctly applied on a clean Node
+ */
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ // Apply constraint with a local input property
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::POSITION,
+ LocalSource( Actor::COLOR ),
+ MoveAwayWithFadeConstraint(distanceWhenFullyTransparent) );
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Gradually set the color to fully-transparent; the actor should move back
+
+ for ( float progress = 0.0f; progress < 1.1f; progress += 0.1f )
+ {
+ actor.SetOpacity( 1.0f - progress );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), ( startValue - Vector3(0.0f, 0.0f, progress*distanceWhenFullyTransparent) ), POSITION_EPSILON, TEST_LOCATION );
+ }
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), ( startValue - Vector3(0.0f, 0.0f, distanceWhenFullyTransparent) ), POSITION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewParentInput(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentStartSize( 100.0f, 100.0f, 0.0f );
+ parent.SetSize( parentStartSize );
+ Stage::GetCurrent().Add( parent );
+
+ Actor actor = Actor::New();
+ parent.Add( actor );
+
+ Vector3 startValue( 0.0f, 0.0f, 0.0f );
+
+ /**
+ * Test that the Constraint is correctly applied on a clean Node
+ */
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ // Apply constraint with a parent input property
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::POSITION,
+ ParentSource( Actor::SIZE ),
+ TestBottomRightAlignConstraint() );
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), parentStartSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), parent.GetCurrentSize(), TEST_LOCATION );
+
+ // Gradually shrink the parent; the actor should move inwards
+
+ for ( float progress = 0.0f; progress < 1.1f; progress += 0.1f )
+ {
+ Vector3 size( parentStartSize * std::max(0.0f, 1.0f - progress) );
+ parent.SetSize( size );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), size, POSITION_EPSILON, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), parent.GetCurrentSize(), POSITION_EPSILON, TEST_LOCATION );
+ }
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), Vector3::ZERO, POSITION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewInput1(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentStartSize( 100.0f, 100.0f, 0.0f );
+ parent.SetSize( parentStartSize );
+ Stage::GetCurrent().Add( parent );
+
+ Actor actor = Actor::New();
+ parent.Add( actor );
+
+ Actor sibling1 = Actor::New();
+ sibling1.SetPosition( Vector3(1.0f, 2.0f, 3.0f) );
+ parent.Add( sibling1 );
+
+ Vector3 startValue( 0.0f, 0.0f, 0.0f );
+
+ /**
+ * Test that the Constraint is correctly applied on a clean Node
+ */
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ // Apply constraint with a parent input property
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::POSITION,
+ Source( sibling1, Actor::POSITION ),
+ MeanPositionConstraint1() );
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), sibling1.GetCurrentPosition(), TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), sibling1.GetCurrentPosition(), TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), sibling1.GetCurrentPosition(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewInput2(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentStartSize( 100.0f, 100.0f, 0.0f );
+ parent.SetSize( parentStartSize );
+ Stage::GetCurrent().Add( parent );
+
+ Actor actor = Actor::New();
+ parent.Add( actor );
+
+ Actor sibling1 = Actor::New();
+ sibling1.SetPosition( Vector3(1.0f, 2.0f, 3.0f) );
+ parent.Add( sibling1 );
+
+ Actor sibling2 = Actor::New();
+ sibling2.SetPosition( Vector3(300.0f, 300.0f, 300.0f) );
+ parent.Add( sibling2 );
+
+ application.SendNotification();
+ application.Render(0);
+
+ Vector3 startValue( 0.0f, 0.0f, 0.0f );
+ Vector3 meanValue = sibling1.GetCurrentPosition() +
+ sibling2.GetCurrentPosition();
+ meanValue *= (1.0f / 2.0f); // divide by number of siblings
+
+ /**
+ * Test that the Constraint is correctly applied on a clean Node
+ */
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ // Apply constraint with a parent input property
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::POSITION,
+ Source( sibling1, Actor::POSITION ),
+ Source( sibling2, Actor::POSITION ),
+ MeanPositionConstraint2() );
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewInput3(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentStartSize( 100.0f, 100.0f, 0.0f );
+ parent.SetSize( parentStartSize );
+ Stage::GetCurrent().Add( parent );
+
+ Actor actor = Actor::New();
+ parent.Add( actor );
+
+ Actor sibling1 = Actor::New();
+ sibling1.SetPosition( Vector3(1.0f, 2.0f, 3.0f) );
+ parent.Add( sibling1 );
+
+ Actor sibling2 = Actor::New();
+ sibling2.SetPosition( Vector3(300.0f, 300.0f, 300.0f) );
+ parent.Add( sibling2 );
+
+ Actor sibling3 = Actor::New();
+ sibling3.SetPosition( Vector3(-100.0f, -10.0f, -1.0f) );
+ parent.Add( sibling3 );
+
+ application.SendNotification();
+ application.Render(0);
+
+ Vector3 startValue( 0.0f, 0.0f, 0.0f );
+ Vector3 meanValue = sibling1.GetCurrentPosition() +
+ sibling2.GetCurrentPosition() +
+ sibling3.GetCurrentPosition();
+ meanValue *= (1.0f / 3.0f); // divide by number of siblings
+
+ /**
+ * Test that the Constraint is correctly applied on a clean Node
+ */
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ // Apply constraint with a parent input property
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::POSITION,
+ Source( sibling1, Actor::POSITION ),
+ Source( sibling2, Actor::POSITION ),
+ Source( sibling3, Actor::POSITION ),
+ MeanPositionConstraint3() );
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewInput4(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentStartSize( 100.0f, 100.0f, 0.0f );
+ parent.SetSize( parentStartSize );
+ parent.SetPosition( 10.0f, 10.0f, 10.0f );
+ Stage::GetCurrent().Add( parent );
+
+ Actor actor = Actor::New();
+ parent.Add( actor );
+
+ Actor sibling1 = Actor::New();
+ sibling1.SetPosition( Vector3(1.0f, 2.0f, 3.0f) );
+ parent.Add( sibling1 );
+
+ Actor sibling2 = Actor::New();
+ sibling2.SetPosition( Vector3(300.0f, 300.0f, 300.0f) );
+ parent.Add( sibling2 );
+
+ Actor sibling3 = Actor::New();
+ sibling3.SetPosition( Vector3(-100.0f, -10.0f, -1.0f) );
+ parent.Add( sibling3 );
+
+ application.SendNotification();
+ application.Render(0);
+
+ Vector3 startValue( 0.0f, 0.0f, 0.0f );
+ Vector3 meanValue = parent.GetCurrentPosition() +
+ sibling1.GetCurrentPosition() +
+ sibling2.GetCurrentPosition() +
+ sibling3.GetCurrentPosition();
+ meanValue *= (1.0f / 4.0f); // divide by number of positions
+
+ /**
+ * Test that the Constraint is correctly applied on a clean Node
+ */
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ // Apply constraint with a parent input property
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::POSITION,
+ Source( sibling1, Actor::POSITION ),
+ Source( sibling2, Actor::POSITION ),
+ ParentSource( Actor::POSITION ),
+ Source( sibling3, Actor::POSITION ),
+ MeanPositionConstraint4() );
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewInput5(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentStartSize( 100.0f, 100.0f, 0.0f );
+ parent.SetSize( parentStartSize );
+ parent.SetPosition( 10.0f, 10.0f, 10.0f );
+ Stage::GetCurrent().Add( parent );
+
+ Actor actor = Actor::New();
+ parent.Add( actor );
+
+ Actor sibling1 = Actor::New();
+ sibling1.SetPosition( Vector3(1.0f, 2.0f, 3.0f) );
+ parent.Add( sibling1 );
+
+ Actor sibling2 = Actor::New();
+ sibling2.SetPosition( Vector3(300.0f, 300.0f, 300.0f) );
+ parent.Add( sibling2 );
+
+ Actor sibling3 = Actor::New();
+ sibling3.SetPosition( Vector3(-100.0f, -10.0f, -1.0f) );
+ parent.Add( sibling3 );
+
+ Actor sibling4 = Actor::New();
+ sibling4.SetPosition( Vector3(-1.0f, 1.0f, 2.0f) );
+ parent.Add( sibling4 );
+
+ application.SendNotification();
+ application.Render(0);
+
+ Vector3 startValue( 0.0f, 0.0f, 0.0f );
+ Vector3 meanValue = parent.GetCurrentPosition() +
+ sibling1.GetCurrentPosition() +
+ sibling2.GetCurrentPosition() +
+ sibling3.GetCurrentPosition() +
+ sibling4.GetCurrentPosition();
+ meanValue *= (1.0f / 5.0f); // divide by number of positions
+
+ /**
+ * Test that the Constraint is correctly applied on a clean Node
+ */
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ // Apply constraint with a parent input property
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::POSITION,
+ Source( sibling1, Actor::POSITION ),
+ Source( sibling2, Actor::POSITION ),
+ ParentSource( Actor::POSITION ),
+ Source( sibling3, Actor::POSITION ),
+ Source( sibling4, Actor::POSITION ),
+ MeanPositionConstraint5() );
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintNewInput6(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentStartSize( 100.0f, 100.0f, 0.0f );
+ parent.SetSize( parentStartSize );
+ parent.SetPosition( 10.0f, 10.0f, 10.0f );
+ Stage::GetCurrent().Add( parent );
+
+ Actor actor = Actor::New();
+ parent.Add( actor );
+
+ Actor child = Actor::New();
+ child.SetPosition( Vector3(7.0f, 7.0f, 7.0f) );
+ actor.Add( child );
+
+ Actor sibling1 = Actor::New();
+ sibling1.SetPosition( Vector3(1.0f, 2.0f, 3.0f) );
+ parent.Add( sibling1 );
+
+ Actor sibling2 = Actor::New();
+ sibling2.SetPosition( Vector3(300.0f, 300.0f, 300.0f) );
+ parent.Add( sibling2 );
+
+ Actor sibling3 = Actor::New();
+ sibling3.SetPosition( Vector3(-100.0f, -10.0f, -1.0f) );
+ parent.Add( sibling3 );
+
+ Actor sibling4 = Actor::New();
+ sibling4.SetPosition( Vector3(-1.0f, 1.0f, 2.0f) );
+ parent.Add( sibling4 );
+
+ application.SendNotification();
+ application.Render(0);
+
+ Vector3 startValue( 0.0f, 0.0f, 0.0f );
+ Vector3 meanValue = parent.GetCurrentPosition() +
+ child.GetCurrentPosition() +
+ sibling1.GetCurrentPosition() +
+ sibling2.GetCurrentPosition() +
+ sibling3.GetCurrentPosition() +
+ sibling4.GetCurrentPosition();
+ meanValue *= (1.0f / 6.0f); // divide by number of positions
+
+ /**
+ * Test that the Constraint is correctly applied on a clean Node
+ */
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ // Apply constraint with a parent input property
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::POSITION,
+ Source( child, Actor::POSITION ),
+ Source( sibling1, Actor::POSITION ),
+ Source( sibling2, Actor::POSITION ),
+ ParentSource( Actor::POSITION ),
+ Source( sibling3, Actor::POSITION ),
+ Source( sibling4, Actor::POSITION ),
+ MeanPositionConstraint6() );
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), meanValue, POSITION_EPSILON, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Constraint::DownCast()");
+
+ Actor actor = Actor::New();
+
+ // Register a boolean property
+ bool startValue(false);
+ Property::Index index = actor.RegisterProperty( "test-property", startValue );
+ Constraint constraint = Constraint::New<bool>( index, TestAlwaysTrueConstraint() );
+
+ BaseHandle object(constraint);
+
+ Constraint constraint2 = Constraint::DownCast(object);
+ DALI_TEST_CHECK(constraint2);
+
+ Constraint constraint3 = DownCast< Constraint >(object);
+ DALI_TEST_CHECK(constraint3);
+
+ BaseHandle unInitializedObject;
+ Constraint constraint4 = Constraint::DownCast(unInitializedObject);
+ DALI_TEST_CHECK(!constraint4);
+
+ Constraint constraint5 = DownCast< Constraint >(unInitializedObject);
+ DALI_TEST_CHECK(!constraint5);
+ END_TEST;
+}
+
+int UtcDaliConstraintSetApplyTime(void)
+{
+ TestApplication application;
+
+ // Build constraint
+
+ Vector4 targetColor(Color::BLACK);
+ Constraint constraint = Constraint::New<Vector4>( Actor::COLOR, TestColorConstraint(targetColor) );
+ DALI_TEST_EQUALS(constraint.GetApplyTime(), TimePeriod(0.0f), TEST_LOCATION);
+
+ float applySeconds(7.0f);
+ constraint.SetApplyTime(applySeconds);
+ DALI_TEST_EQUALS(constraint.GetApplyTime(), TimePeriod(applySeconds), TEST_LOCATION);
+
+ // Apply to an actor
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), Color::WHITE, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(applySeconds*200.0f)/* 20% progress */);
+
+ // Constraint shouldn't be fully applied yet
+ Vector4 twentyPercentColor( Color::WHITE.x*0.8f, Color::WHITE.y*0.8f, Color::WHITE.z*0.8f, Color::WHITE.a );
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), twentyPercentColor, TEST_LOCATION );
+
+ // Constraint shouldn't be fully applied yet
+ application.Render(static_cast<unsigned int>(applySeconds*200.0f)/* 40% progress */);
+ Vector4 fourtyPercentColor( Color::WHITE.x*0.6f, Color::WHITE.y*0.6f, Color::WHITE.z*0.6f, Color::WHITE.a );
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), fourtyPercentColor, TEST_LOCATION );
+
+ // Constraint shouldn't be fully applied yet
+ application.Render(static_cast<unsigned int>(applySeconds*200.0f)/* 60% progress */);
+ Vector4 sixtyPercentColor( Color::WHITE.x*0.4f, Color::WHITE.y*0.4f, Color::WHITE.z*0.4f, Color::WHITE.a );
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), sixtyPercentColor, TEST_LOCATION );
+
+ // Constraint shouldn't be fully applied yet
+ application.Render(static_cast<unsigned int>(applySeconds*200.0f)/* 80% progress */);
+ Vector4 eightyPercentColor( Color::WHITE.x*0.2f, Color::WHITE.y*0.2f, Color::WHITE.z*0.2f, Color::WHITE.a );
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), eightyPercentColor, TEST_LOCATION );
+
+ // Constraint should be fully applied
+ application.Render(static_cast<unsigned int>(applySeconds*200.0f)/* 100% progress */);
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), targetColor, TEST_LOCATION );
+
+ // Constraint should still be fully applied
+ application.Render(static_cast<unsigned int>(applySeconds*200.0f)/* Still 100% progress */);
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), targetColor, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), targetColor, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentColor(), targetColor, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintGetApplyTime(void)
+{
+ TestApplication application;
+
+ Constraint constraint = Constraint::New<Vector4>( Actor::COLOR, TestConstraint() );
+ DALI_TEST_EQUALS(constraint.GetApplyTime(), TimePeriod(0.0f), TEST_LOCATION);
+
+ float applySeconds(7.0f);
+ constraint.SetApplyTime(applySeconds);
+ DALI_TEST_EQUALS(constraint.GetApplyTime(), TimePeriod(applySeconds), TEST_LOCATION);
+
+ constraint.SetApplyTime(applySeconds - 3.0f);
+ DALI_TEST_EQUALS(constraint.GetApplyTime(), TimePeriod(applySeconds - 3.0f), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliConstraintSetRemoveTime(void)
+{
+ TestApplication application;
+
+ Vector3 sourcePosition(0.0f, 0.0f, 0.0f);
+ Vector3 targetPosition(100.0f, 100.0f, 100.0f);
+
+ // Build constraint
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::POSITION, TestPositionConstraint(targetPosition) );
+ DALI_TEST_EQUALS(constraint.GetRemoveTime(), TimePeriod(0.0f), TEST_LOCATION);
+
+ float removeSeconds(8.0f);
+ constraint.SetRemoveTime(removeSeconds);
+ DALI_TEST_EQUALS(constraint.GetRemoveTime(), TimePeriod(removeSeconds), TEST_LOCATION);
+
+ // Apply to an actor
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(100u/*0.1 seconds*/);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+
+ // Remove from the actor, and set to alternative position
+
+ actor.RemoveConstraints();
+
+ Vector3 thirdPosition(200.0f, 200.0f, 200.0f);
+ actor.SetPosition(thirdPosition); // Go back to 3rd position
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(removeSeconds*200.0f)/* 20% removal progress */);
+
+ // Constraint shouldn't be fully removed yet
+ Vector3 twentyPercentBack( targetPosition + (thirdPosition - targetPosition)*0.2f );
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), twentyPercentBack, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(removeSeconds*200.0f)/* 40% removal progress */);
+
+ // Constraint shouldn't be fully removed yet
+ Vector3 fourtyPercentBack( targetPosition + (thirdPosition - targetPosition)*0.4f );
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), fourtyPercentBack, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(removeSeconds*200.0f)/* 60% removal progress */);
+
+ // Constraint shouldn't be fully removed yet
+ Vector3 sixtyPercentBack( targetPosition + (thirdPosition - targetPosition)*0.6f );
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sixtyPercentBack, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(removeSeconds*200.0f)/* 80% removal progress */);
+
+ // Constraint shouldn't be fully removed yet
+ Vector3 eightyPercentBack( targetPosition + (thirdPosition - targetPosition)*0.8f );
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), eightyPercentBack, TEST_LOCATION );
+
+ // Constraint should be fully removed
+ application.Render(static_cast<unsigned int>(removeSeconds*200.0f)/* 100% removal progress */);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), thirdPosition, TEST_LOCATION );
+
+ // Constraint should still be fully applied
+ application.Render(static_cast<unsigned int>(removeSeconds*200.0f)/* Still 100% removal progress */);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), thirdPosition, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), thirdPosition, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), thirdPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintGetRemoveTime(void)
+{
+ TestApplication application;
+
+ Constraint constraint = Constraint::New<Vector4>( Actor::COLOR, TestConstraint() );
+ DALI_TEST_EQUALS(constraint.GetRemoveTime(), TimePeriod(0.0f), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliConstraintSetAlphaFunction(void)
+{
+ TestApplication application;
+
+ Vector3 startValue( Vector3::ZERO );
+ Vector3 targetValue(100.0f, 100.0f, 100.0f);
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::POSITION,
+ TestConstraintVector3( targetValue ) );
+
+ // Test the alpha-function itself
+
+ AlphaFunction func = constraint.GetAlphaFunction();
+ DALI_TEST_EQUALS(func(0.1f), 0.1f, TEST_LOCATION); // Default is Linear
+
+ // Test that the alpha-function is used correctly
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ constraint.SetApplyTime( 10.0f );
+ actor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), (targetValue - startValue) * 0.1f, TEST_LOCATION );
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), (targetValue - startValue) * 0.2f, TEST_LOCATION );
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), (targetValue - startValue) * 0.3f, TEST_LOCATION );
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), (targetValue - startValue) * 0.4f, TEST_LOCATION );
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), (targetValue - startValue) * 0.5f, TEST_LOCATION );
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), (targetValue - startValue) * 0.6f, TEST_LOCATION );
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), (targetValue - startValue) * 0.7f, TEST_LOCATION );
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), (targetValue - startValue) * 0.8f, TEST_LOCATION );
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), (targetValue - startValue) * 0.9f, TEST_LOCATION );
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), (targetValue - startValue), TEST_LOCATION );
+
+ // Check that the constrained value is stable
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), (targetValue - startValue), TEST_LOCATION );
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), (targetValue - startValue), TEST_LOCATION );
+
+ // Remove the constraint
+
+ actor.RemoveConstraints();
+ actor.SetPosition( startValue );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), startValue, TEST_LOCATION );
+
+ // Change to non-linear alpha and retest
+
+ constraint.SetAlphaFunction(AlphaFunctions::EaseIn);
+ func = constraint.GetAlphaFunction();
+ DALI_TEST_CHECK(func(0.1f) < 0.09f);
+
+ actor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+
+ DALI_TEST_CHECK( actor.GetProperty<Vector3>( Actor::POSITION ).x > startValue.x );
+ DALI_TEST_CHECK( actor.GetProperty<Vector3>( Actor::POSITION ).y > startValue.y );
+ DALI_TEST_CHECK( actor.GetProperty<Vector3>( Actor::POSITION ).z > startValue.z );
+
+ Vector3 lessThanTenPercentProgress( (targetValue - startValue) * 0.09f );
+ DALI_TEST_CHECK( actor.GetProperty<Vector3>( Actor::POSITION ).x < lessThanTenPercentProgress.x );
+ DALI_TEST_CHECK( actor.GetProperty<Vector3>( Actor::POSITION ).y < lessThanTenPercentProgress.y );
+ DALI_TEST_CHECK( actor.GetProperty<Vector3>( Actor::POSITION ).z < lessThanTenPercentProgress.z );
+
+ application.Render(static_cast<unsigned int>(9000.0f/*9 seconds*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), (targetValue - startValue), TEST_LOCATION );
+
+ // Check that the constrained value is stable
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), (targetValue - startValue), TEST_LOCATION );
+ application.Render(static_cast<unsigned int>(1000.0f/*1 second*/));
+ DALI_TEST_EQUALS( actor.GetProperty<Vector3>( Actor::POSITION ), (targetValue - startValue), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintGetAlphaFunction(void)
+{
+ TestApplication application;
+
+ Constraint constraint = Constraint::New<Vector4>( Actor::COLOR, TestConstraint() );
+
+ AlphaFunction func = constraint.GetAlphaFunction();
+ DALI_TEST_EQUALS(func(0.5f), 0.5f, TEST_LOCATION); // Default is Linear
+ END_TEST;
+}
+
+int UtcDaliConstraintSetRemoveAction(void)
+{
+ TestApplication application;
+
+ Vector3 sourcePosition(0.0f, 0.0f, 0.0f);
+ Vector3 targetPosition(100.0f, 100.0f, 100.0f);
+
+ // Build constraint, with "Discard" remove action
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::POSITION, TestPositionConstraint(targetPosition) );
+ DALI_TEST_EQUALS((unsigned int)constraint.GetRemoveAction(), (unsigned int)Constraint::Bake, TEST_LOCATION);
+
+ constraint.SetRemoveAction(Constraint::Discard);
+ DALI_TEST_EQUALS((unsigned int)constraint.GetRemoveAction(), (unsigned int)Constraint::Discard, TEST_LOCATION);
+
+ float removeSeconds(8.0f);
+ constraint.SetRemoveTime(removeSeconds);
+ DALI_TEST_EQUALS(constraint.GetRemoveTime(), TimePeriod(removeSeconds), TEST_LOCATION);
+
+ // Apply to an actor
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(100u/*0.1 seconds*/);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), targetPosition, TEST_LOCATION );
+
+ // Remove from the actor
+
+ actor.RemoveConstraints(); // should go back to source position
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(removeSeconds*200.0f)/* 20% removal progress */);
+
+ // Constraint shouldn't be fully removed yet
+ Vector3 twentyPercentBack( targetPosition * 0.8f );
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), twentyPercentBack, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(removeSeconds*200.0f)/* 40% removal progress */);
+
+ // Constraint shouldn't be fully removed yet
+ Vector3 fourtyPercentBack( targetPosition * 0.6f );
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), fourtyPercentBack, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(removeSeconds*200.0f)/* 60% removal progress */);
+
+ // Constraint shouldn't be fully removed yet
+ Vector3 sixtyPercentBack( targetPosition * 0.4f );
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sixtyPercentBack, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(removeSeconds*200.0f)/* 80% removal progress */);
+
+ // Constraint shouldn't be fully removed yet
+ Vector3 eightyPercentBack( targetPosition * 0.2f );
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), eightyPercentBack, TEST_LOCATION );
+
+ // Constraint should be fully removed
+ application.Render(static_cast<unsigned int>(removeSeconds*200.0f)/* 100% removal progress */);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION );
+
+ // Constraint should still be fully applied
+ application.Render(static_cast<unsigned int>(removeSeconds*200.0f)/* Still 100% removal progress */);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintGetRemoveAction(void)
+{
+ TestApplication application;
+
+ Constraint constraint = Constraint::New<Vector4>( Actor::COLOR, TestConstraint() );
+ DALI_TEST_EQUALS((unsigned int)constraint.GetRemoveAction(), (unsigned int)Constraint::Bake, TEST_LOCATION);
+
+ constraint.SetRemoveAction(Constraint::Discard);
+ DALI_TEST_EQUALS((unsigned int)constraint.GetRemoveAction(), (unsigned int)Constraint::Discard, TEST_LOCATION);
+
+ constraint.SetRemoveAction(Constraint::Bake);
+ DALI_TEST_EQUALS((unsigned int)constraint.GetRemoveAction(), (unsigned int)Constraint::Bake, TEST_LOCATION);
+ END_TEST;
+}
+
+/**
+ * Test a constraint with non-zero apply-time and remove-time, where the constraint is removed during the apply-time
+ */
+int UtcDaliConstraintRemoveDuringApply(void)
+{
+ TestApplication application;
+
+ Vector3 sourcePosition(0.0f, 0.0f, 0.0f);
+ Vector3 targetPosition(100.0f, 100.0f, 100.0f);
+ Vector3 halfwayPosition(targetPosition * 0.5f);
+
+ // Build constraint
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::POSITION, TestPositionConstraint(targetPosition) );
+ DALI_TEST_EQUALS((unsigned int)constraint.GetRemoveAction(), (unsigned int)Constraint::Bake, TEST_LOCATION);
+
+ float applySeconds(4.0f);
+ constraint.SetApplyTime(applySeconds);
+ DALI_TEST_EQUALS(constraint.GetApplyTime(), TimePeriod(applySeconds), TEST_LOCATION);
+
+ float removeSeconds(8.0f);
+ constraint.SetRemoveTime(removeSeconds);
+ DALI_TEST_EQUALS(constraint.GetRemoveTime(), TimePeriod(removeSeconds), TEST_LOCATION);
+
+ // Apply to an actor
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(applySeconds*250.0f)/* 25% progress */);
+
+ // Constraint shouldn't be fully applied yet
+ Vector3 twentyFivePercent( targetPosition * 0.25f );
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), twentyFivePercent, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(applySeconds*250.0f)/* 50% progress */);
+
+ // Constraint shouldn't be fully applied yet
+ Vector3 fiftyPercent( targetPosition * 0.5f );
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), fiftyPercent, TEST_LOCATION );
+
+ // Remove from the actor
+
+ actor.RemoveConstraints(); // should go back to source position
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(removeSeconds*100.0f)/* 50% - 5% = 45% progress */);
+
+ // Constraint shouldn't be fully removed yet
+ Vector3 fourtyFivePercent( targetPosition * 0.45f );
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), fourtyFivePercent, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(removeSeconds*400.0f)/* 50% - 25% = 25% progress */);
+
+ // Constraint shouldn't be fully removed yet
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), twentyFivePercent, TEST_LOCATION );
+
+ // Constraint should be fully removed
+ application.Render(static_cast<unsigned int>(removeSeconds*500.0f)/* 0% progress */);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION );
+
+ // Constraint should still be fully applied
+ application.Render(static_cast<unsigned int>(removeSeconds*200.0f)/* Still 0% progress */);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION );
+ END_TEST;
+}
+
+/**
+ * Test a constraint with non-zero apply-time & zero (immediate) remove-time, where the constraint is removed during the apply-time
+ */
+int UtcDaliConstraintImmediateRemoveDuringApply(void)
+{
+ TestApplication application;
+
+ Vector3 sourcePosition(0.0f, 0.0f, 0.0f);
+ Vector3 targetPosition(100.0f, 100.0f, 100.0f);
+
+ // Build constraint
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::POSITION, TestPositionConstraint(targetPosition) );
+ DALI_TEST_EQUALS((unsigned int)constraint.GetRemoveAction(), (unsigned int)Constraint::Bake, TEST_LOCATION);
+
+ float applySeconds(4.0f);
+ constraint.SetApplyTime(applySeconds);
+ DALI_TEST_EQUALS(constraint.GetApplyTime(), TimePeriod(applySeconds), TEST_LOCATION);
+ DALI_TEST_EQUALS(constraint.GetRemoveTime(), TimePeriod(0.0f), TEST_LOCATION);
+
+ // Apply to an actor
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ actor.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(applySeconds*250.0f)/* 25% progress */);
+
+ // Constraint shouldn't be fully applied yet
+ Vector3 twentyFivePercent( targetPosition * 0.25f );
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), twentyFivePercent, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(applySeconds*250.0f)/* 50% progress */);
+
+ // Constraint shouldn't be fully applied yet
+ Vector3 fiftyPercent( targetPosition * 0.5f );
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), fiftyPercent, TEST_LOCATION );
+
+ // Remove from the actor
+
+ actor.RemoveConstraints(); // should go back to source position
+ application.SendNotification();
+
+ // Constraint should be fully removed
+ application.Render(static_cast<unsigned int>(200.0f /*0.2 seconds*/));
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION );
+
+ // Constraint should still be fully applied
+ application.Render(static_cast<unsigned int>(200.0f /*0.2 seconds*/));
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentPosition(), sourcePosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintActorSize(void)
+{
+ TestApplication application;
+
+ // Build constraint, to make child 20% of parent size
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SIZE,
+ ParentSource( Actor::SIZE ),
+ TestRelativeConstraintVector3(0.2f) );
+ // Apply to a child actor
+
+ Actor parent = Actor::New();
+ Stage::GetCurrent().Add(parent);
+
+ Actor child = Actor::New();
+ parent.Add(child);
+
+ child.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( child.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ // Animate the parent between two sizes
+
+ Vector3 targetParentSize(100.0f, 100.0f, 100.0f);
+
+ float durationSeconds(10.0f);
+ Animation animation = Animation::New(durationSeconds);
+ animation.AnimateTo( Property(parent, Actor::SIZE), targetParentSize );
+ animation.Play();
+
+ application.SendNotification();
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.25f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize(), targetParentSize*0.25f * 0.2f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.5f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize(), targetParentSize*0.5f * 0.2f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.75f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize(), targetParentSize*0.75f * 0.2f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 100% progress */);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize(), targetParentSize * 0.2f, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize(), targetParentSize * 0.2f, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize(), targetParentSize * 0.2f, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintActorSizeWidth(void)
+{
+ TestApplication application;
+
+ // Build constraint, to make child 20% of parent width
+
+ Constraint constraint = Constraint::New<float>( Actor::SIZE_WIDTH,
+ ParentSource( Actor::SIZE_WIDTH ),
+ TestRelativeConstraintFloat(0.2f) );
+ // Apply to a child actor
+
+ Actor parent = Actor::New();
+ Stage::GetCurrent().Add(parent);
+
+ Actor child = Actor::New();
+ parent.Add(child);
+
+ child.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( child.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ // Animate the parent between two sizes
+
+ Vector3 targetParentSize(80.0f, 90.0f, 100.0f);
+
+ float durationSeconds(10.0f);
+ Animation animation = Animation::New(durationSeconds);
+ animation.AnimateTo( Property(parent, Actor::SIZE), targetParentSize );
+ animation.Play();
+
+ application.SendNotification();
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.25f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, targetParentSize.width*0.25f * 0.2f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.5f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, targetParentSize.width*0.5f * 0.2f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.75f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, targetParentSize.width*0.75f * 0.2f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 100% progress */);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, targetParentSize.width * 0.2f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, targetParentSize.width * 0.2f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION );
+
+ application.Render(0);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, targetParentSize.width * 0.2f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintActorSizeHeight(void)
+{
+ TestApplication application;
+
+ // Build constraint, to make child 20% of parent height
+
+ Constraint constraint = Constraint::New<float>( Actor::SIZE_HEIGHT,
+ ParentSource( Actor::SIZE_HEIGHT ),
+ TestRelativeConstraintFloat(0.2f) );
+ // Apply to a child actor
+
+ Actor parent = Actor::New();
+ Stage::GetCurrent().Add(parent);
+
+ Actor child = Actor::New();
+ parent.Add(child);
+
+ child.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( child.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ // Animate the parent between two sizes
+
+ Vector3 targetParentSize(80.0f, 90.0f, 100.0f);
+
+ float durationSeconds(10.0f);
+ Animation animation = Animation::New(durationSeconds);
+ animation.AnimateTo( Property(parent, Actor::SIZE), targetParentSize );
+ animation.Play();
+
+ application.SendNotification();
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.25f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, targetParentSize.height*0.25f * 0.2f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.5f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, targetParentSize.height*0.5f * 0.2f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.75f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, targetParentSize.height*0.75f * 0.2f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 100% progress */);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, targetParentSize.height * 0.2f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, targetParentSize.height * 0.2f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION );
+
+ application.Render(0);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, targetParentSize.height * 0.2f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, 0.0f, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintActorSizeDepth(void)
+{
+ TestApplication application;
+
+ // Build constraint, to make child 20% of parent height
+
+ Constraint constraint = Constraint::New<float>( Actor::SIZE_DEPTH,
+ ParentSource( Actor::SIZE_DEPTH ),
+ TestRelativeConstraintFloat(0.2f) );
+ // Apply to a child actor
+
+ Actor parent = Actor::New();
+ Stage::GetCurrent().Add(parent);
+
+ Actor child = Actor::New();
+ parent.Add(child);
+
+ child.ApplyConstraint( constraint );
+ DALI_TEST_EQUALS( child.GetCurrentSize(), Vector3::ZERO, TEST_LOCATION );
+
+ // Animate the parent between two sizes
+
+ Vector3 targetParentSize(80.0f, 90.0f, 100.0f);
+
+ float durationSeconds(10.0f);
+ Animation animation = Animation::New(durationSeconds);
+ animation.AnimateTo( Property(parent, Actor::SIZE), targetParentSize );
+ animation.Play();
+
+ application.SendNotification();
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 25% progress */);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.25f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, targetParentSize.depth*0.25f * 0.2f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 50% progress */);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.5f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, targetParentSize.depth*0.5f * 0.2f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 75% progress */);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize*0.75f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, targetParentSize.depth*0.75f * 0.2f, TEST_LOCATION );
+
+ application.Render(static_cast<unsigned int>(durationSeconds*250.0f)/* 100% progress */);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, targetParentSize.depth * 0.2f, TEST_LOCATION );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.Render(0);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, targetParentSize.depth * 0.2f, TEST_LOCATION );
+
+ application.Render(0);
+ DALI_TEST_EQUALS( parent.GetCurrentSize(), targetParentSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().width, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().height, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentSize().depth, targetParentSize.depth * 0.2f, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintInputWorldPosition(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentPosition( 10.0f, 10.0f, 10.0f );
+ parent.SetPosition( parentPosition );
+ parent.SetParentOrigin( ParentOrigin::CENTER );
+ parent.SetAnchorPoint( AnchorPoint::CENTER );
+ Stage::GetCurrent().Add( parent );
+
+ Actor child = Actor::New();
+ child.SetParentOrigin( ParentOrigin::CENTER );
+ child.SetAnchorPoint( AnchorPoint::CENTER );
+ Vector3 childPosition( 10.0f, 10.0f, 10.0f );
+ child.SetPosition( childPosition );
+ parent.Add( child );
+
+ Actor trackingActor = Actor::New();
+ trackingActor.SetParentOrigin( ParentOrigin::CENTER );
+ trackingActor.SetAnchorPoint( AnchorPoint::CENTER );
+ Stage::GetCurrent().Add( trackingActor );
+
+ // The actors should not have a world position yet
+ DALI_TEST_EQUALS( parent.GetCurrentWorldPosition(), Vector3::ZERO, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldPosition(), Vector3::ZERO, TEST_LOCATION );
+ DALI_TEST_EQUALS( trackingActor.GetCurrentWorldPosition(), Vector3::ZERO, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( parent.GetCurrentPosition(), parentPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentPosition(), childPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( trackingActor.GetCurrentPosition(), Vector3::ZERO, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( parent.GetCurrentWorldPosition(), parentPosition, TEST_LOCATION );
+ Vector3 previousPosition( parentPosition + childPosition );
+ DALI_TEST_EQUALS( child.GetCurrentWorldPosition(), previousPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( trackingActor.GetCurrentWorldPosition(), Vector3::ZERO, TEST_LOCATION );
+
+ // Build constraint, to make actor track the world-position of another actor
+ // Note that the world-position is always from the previous frame, so the tracking actor will lag behind
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::POSITION,
+ Source( child, Actor::WORLD_POSITION ),
+ EqualToConstraint() );
+
+ trackingActor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( trackingActor.GetCurrentPosition(), previousPosition, TEST_LOCATION );
+
+ // Move the actors and try again
+ Vector3 relativePosition( 5, 5, 5 );
+ parent.MoveBy( relativePosition );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( parent.GetCurrentPosition(), parentPosition + relativePosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentPosition(), childPosition, TEST_LOCATION );
+
+ // The tracking actor lags behind
+ DALI_TEST_EQUALS( trackingActor.GetCurrentPosition(), previousPosition, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( parent.GetCurrentWorldPosition(), parentPosition + relativePosition, TEST_LOCATION );
+ previousPosition = Vector3( parentPosition + childPosition + relativePosition );
+ DALI_TEST_EQUALS( child.GetCurrentWorldPosition(), previousPosition, TEST_LOCATION );
+
+ // Allow the tracking actor to catch up
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( parent.GetCurrentPosition(), parentPosition + relativePosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentPosition(), childPosition, TEST_LOCATION );
+
+ // The tracking actor catches up!
+ DALI_TEST_EQUALS( trackingActor.GetCurrentPosition(), previousPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( parent.GetCurrentWorldPosition(), parentPosition + relativePosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldPosition(), previousPosition, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintInputWorldRotation(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Radian rotationAngle( Degree(90.0f) );
+ Quaternion rotation( rotationAngle, Vector3::YAXIS );
+ parent.SetRotation( rotation );
+ Stage::GetCurrent().Add( parent );
+
+ Actor child = Actor::New();
+ child.SetRotation( rotation );
+ parent.Add( child );
+
+ Actor trackingActor = Actor::New();
+ Stage::GetCurrent().Add( trackingActor );
+
+ // The actors should not have a world rotation yet
+ DALI_TEST_EQUALS( parent.GetCurrentWorldRotation(), Quaternion(0.0f, Vector3::YAXIS), 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldRotation(), Quaternion(0.0f, Vector3::YAXIS), 0.001, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( parent.GetCurrentRotation(), rotation, 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentRotation(), rotation, 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( trackingActor.GetCurrentRotation(), Quaternion(0.0f, Vector3::YAXIS), 0.001, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( parent.GetCurrentWorldRotation(), Quaternion( rotationAngle, Vector3::YAXIS ), 0.001, TEST_LOCATION );
+ Quaternion previousRotation( rotationAngle * 2.0f, Vector3::YAXIS );
+ DALI_TEST_EQUALS( child.GetCurrentWorldRotation(), previousRotation, 0.001, TEST_LOCATION );
+
+ // Build constraint, to make actor track the world-rotation of another actor
+ // Note that the world-rotation is always from the previous frame, so the tracking actor will lag behind
+
+ Constraint constraint = Constraint::New<Quaternion>( Actor::ROTATION,
+ Source( child, Actor::WORLD_ROTATION ),
+ EqualToQuaternion() );
+
+ trackingActor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( trackingActor.GetCurrentRotation(), previousRotation, 0.001, TEST_LOCATION );
+
+ // Rotate the actors and try again
+ parent.RotateBy( rotation );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( parent.GetCurrentRotation(), rotation * rotation, 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentRotation(), rotation, 0.001, TEST_LOCATION );
+
+ // The tracking actor lags behind
+ DALI_TEST_EQUALS( trackingActor.GetCurrentRotation(), previousRotation, 0.001, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( parent.GetCurrentWorldRotation(), Quaternion( rotationAngle * 2.0f, Vector3::YAXIS ), 0.001, TEST_LOCATION );
+ previousRotation = Quaternion( rotationAngle * 3.0f, Vector3::YAXIS );
+ DALI_TEST_EQUALS( child.GetCurrentWorldRotation(), previousRotation, 0.001, TEST_LOCATION );
+
+ // Allow the tracking actor to catch up
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( parent.GetCurrentRotation(), rotation * rotation, 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentRotation(), rotation, 0.001, TEST_LOCATION );
+
+ // The tracking actor catches up!
+ DALI_TEST_EQUALS( trackingActor.GetCurrentRotation(), previousRotation, 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( parent.GetCurrentWorldRotation(), Quaternion( rotationAngle * 2.0f, Vector3::YAXIS ), 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldRotation(), previousRotation, 0.001, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintInputWorldScale(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentScale( 2.0f, 2.0f, 2.0f );
+ parent.SetScale( parentScale );
+ Stage::GetCurrent().Add( parent );
+
+ Actor child = Actor::New();
+ Vector3 childScale( 1.0f, 2.0f, 3.0f );
+ child.SetScale( childScale );
+ parent.Add( child );
+
+ Actor trackingActor = Actor::New();
+ Stage::GetCurrent().Add( trackingActor );
+
+ // The actors should not have a world scale yet
+ DALI_TEST_EQUALS( parent.GetCurrentWorldScale(), Vector3::ONE, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldScale(), Vector3::ONE, TEST_LOCATION );
+ DALI_TEST_EQUALS( trackingActor.GetCurrentWorldScale(), Vector3::ONE, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( parent.GetCurrentScale(), parentScale, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentScale(), childScale, TEST_LOCATION );
+ DALI_TEST_EQUALS( trackingActor.GetCurrentScale(), Vector3::ONE, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( parent.GetCurrentWorldScale(), parentScale, TEST_LOCATION );
+ Vector3 previousScale( parentScale * childScale );
+ DALI_TEST_EQUALS( child.GetCurrentWorldScale(), previousScale, TEST_LOCATION );
+ DALI_TEST_EQUALS( trackingActor.GetCurrentScale(), Vector3::ONE, TEST_LOCATION );
+
+ // Build constraint, to make actor track the world-scale of another actor
+ // Note that the world-scale is always from the previous frame, so the tracking actor will lag behind
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SCALE,
+ Source( child, Actor::WORLD_SCALE ),
+ EqualToConstraint() );
+
+ trackingActor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( trackingActor.GetCurrentScale(), previousScale, TEST_LOCATION );
+
+ // Scale the actors and try again
+ Vector3 relativeScale( 3, 3, 3 );
+ parent.ScaleBy( relativeScale );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( parent.GetCurrentScale(), parentScale * relativeScale, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentScale(), childScale, TEST_LOCATION );
+
+ // The tracking actor lags behind
+ DALI_TEST_EQUALS( trackingActor.GetCurrentScale(), previousScale, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( parent.GetCurrentWorldScale(), parentScale * relativeScale, TEST_LOCATION );
+ previousScale = Vector3( parentScale * childScale * relativeScale );
+ DALI_TEST_EQUALS( child.GetCurrentWorldScale(), previousScale, TEST_LOCATION );
+
+ // Allow the tracking actor to catch up
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( parent.GetCurrentScale(), parentScale * relativeScale, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentScale(), childScale, TEST_LOCATION );
+
+ // The tracking actor catches up!
+ DALI_TEST_EQUALS( trackingActor.GetCurrentScale(), previousScale, TEST_LOCATION );
+ DALI_TEST_EQUALS( parent.GetCurrentWorldScale(), parentScale * relativeScale, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldScale(), previousScale, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintInputWorldColor(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector4 parentColor( 1.0f, 0.5f, 0.0f, 1.0f );
+ parent.SetColor( parentColor );
+ Stage::GetCurrent().Add( parent );
+
+ Actor child = Actor::New();
+ Vector4 childColor( 0.5f, 0.5f, 0.5f, 1.0f );
+ child.SetColor( childColor );
+ parent.Add( child );
+
+ Actor trackingActor = Actor::New();
+ Stage::GetCurrent().Add( trackingActor );
+
+ // The actors should not have a world color yet
+ DALI_TEST_EQUALS( parent.GetCurrentWorldColor(), Color::WHITE, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldColor(), Color::WHITE, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( parent.GetCurrentColor(), parentColor, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentColor(), childColor, TEST_LOCATION );
+ DALI_TEST_EQUALS( trackingActor.GetCurrentColor(), Color::WHITE, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( parent.GetCurrentWorldColor(), parentColor, TEST_LOCATION );
+ Vector4 previousColor( childColor );
+ previousColor.a *= parentColor.a;
+ DALI_TEST_EQUALS( child.GetCurrentWorldColor(), previousColor, TEST_LOCATION );
+
+ // Build constraint, to make actor track the world-color of another actor
+ // Note that the world-color is always from the previous frame, so the tracking actor will lag behind
+
+ Constraint constraint = Constraint::New<Vector4>( Actor::COLOR,
+ Source( child, Actor::WORLD_COLOR ),
+ EqualToVector4() );
+
+ trackingActor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( trackingActor.GetCurrentColor(), previousColor, TEST_LOCATION );
+
+ // Set the color and try again
+ Vector4 newChildColor( 0.75f, 0.75f, 0.75f, 1.0f );
+ child.SetColor( newChildColor );
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( parent.GetCurrentColor(), parentColor, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentColor(), newChildColor, TEST_LOCATION );
+
+ // The tracking actor lags behind
+ DALI_TEST_EQUALS( trackingActor.GetCurrentColor(), previousColor, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( parent.GetCurrentWorldColor(), parentColor, TEST_LOCATION );
+ previousColor = Vector3( newChildColor );
+ DALI_TEST_EQUALS( child.GetCurrentWorldColor(), previousColor, TEST_LOCATION );
+
+ // Allow the tracking actor to catch up
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( parent.GetCurrentColor(), parentColor, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentColor(), newChildColor, TEST_LOCATION );
+
+ // The tracking actor catches up!
+ DALI_TEST_EQUALS( trackingActor.GetCurrentColor(), previousColor, TEST_LOCATION );
+ DALI_TEST_EQUALS( parent.GetCurrentWorldColor(), parentColor, TEST_LOCATION );
+ DALI_TEST_EQUALS( child.GetCurrentWorldColor(), previousColor, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliConstraintInvalidInputProperty(void)
+{
+ TestApplication application;
+ Actor actor = Actor::New();
+ Constraint constraint = Constraint::New<Vector3>( Actor::POSITION, LocalSource( PROPERTY_REGISTRATION_START_INDEX ), MultiplyConstraint() );
+
+ Stage::GetCurrent().Add( actor );
+
+ // Cannot use type registered properties as input to constraints
+ try
+ {
+ actor.ApplyConstraint( constraint );
+ tet_result( TET_FAIL );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "mTargetProxy->IsPropertyAConstraintInput( source.propertyIndex )", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliBuiltinConstraintParentSize(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentSize(9,9,9);
+ parent.SetSize( parentSize );
+ Stage::GetCurrent().Add( parent );
+
+ Actor actor = Actor::New();
+ parent.Add( actor );
+
+ Vector3 startValue( Vector3::ZERO );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetCurrentSize() == startValue );
+
+ // Apply constraint
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), EqualToConstraint() );
+ actor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), parentSize, TEST_LOCATION );
+
+ // This should be ignored
+ actor.SetSize( startValue );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), parentSize, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), parentSize, TEST_LOCATION );
+
+ // Remove the constraint, then set new value
+ actor.RemoveConstraints();
+ actor.SetSize( startValue );
+
+ // Constraint should have been removed
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), startValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliBuiltinConstraintParentSizeRelative(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentSize(9,9,9);
+ parent.SetSize( parentSize );
+ Stage::GetCurrent().Add( parent );
+
+ Actor actor = Actor::New();
+ parent.Add( actor );
+
+ Vector3 startValue( Vector3::ZERO );
+ Vector3 scale(2,3,4);
+ Vector3 endValue( parentSize * scale );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetCurrentSize() == startValue );
+
+ // Apply constraint
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SIZE, ParentSource( Actor::SIZE ), RelativeToConstraint( scale ) );
+ actor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), endValue, TEST_LOCATION );
+
+ // This should be ignored
+ actor.SetSize( startValue );
+
+ // Check that nothing has changed after a couple of buffer swaps
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), endValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), endValue, TEST_LOCATION );
+
+ // Remove the constraint, then set new value
+ actor.RemoveConstraints();
+ actor.SetSize( startValue );
+
+ // Constraint should have been removed
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), startValue, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), startValue, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliBuiltinConstraintScaleToFitConstraint(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 startParentSize( 10, 10, 10 );
+ parent.SetSize( startParentSize );
+ Stage::GetCurrent().Add( parent );
+
+ Actor actor = Actor::New();
+ Vector3 startChildSize( 5, 5, 5 );
+ actor.SetSize( startChildSize );
+ parent.Add( actor );
+
+ Vector3 endChildSize( 8, 8, 8 );
+ Vector3 endParentSize( 4, 4, 4 );
+ Vector3 startChildScale( 2, 2, 2 ); // startParentSize / startChildSize
+ Vector3 intermediateChildScale( 1.25, 1.25, 1.25 ); // startParentSize / endChildSize
+ Vector3 endChildScale( 0.5, 0.5, 0.5 ); // endParentSize / endChildSize
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( actor.GetCurrentSize() == startChildSize );
+
+ // Apply constraint
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SCALE,
+ LocalSource( Actor::SIZE ),
+ ParentSource( Actor::SIZE ),
+ ScaleToFitConstraint() );
+ actor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied, but parent size is larger than child
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), startChildSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), startChildScale, TEST_LOCATION );
+
+ // This should be allowed (still less than parent size)
+ actor.SetSize( endChildSize );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), endChildSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), intermediateChildScale, TEST_LOCATION );
+
+ // Reduce the parent size
+ parent.SetSize( endParentSize );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), endChildSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), endChildScale, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor.GetCurrentSize(), endChildSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), endChildScale, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliBuiltinConstraintScaleToFitKeepAspectRatio(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentSize1( 10, 10, 10 );
+ parent.SetSize( parentSize1 );
+ Stage::GetCurrent().Add( parent );
+
+ Actor actor = Actor::New();
+ Vector3 childSize( 4, 5, 5 );
+ actor.SetSize( childSize );
+ parent.Add( actor );
+
+ application.SendNotification();
+ application.Render(0);
+ Vector3 childScale1( 1.0f, 1.0f, 1.0f );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale1, TEST_LOCATION );
+
+ // Apply constraint
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SCALE,
+ LocalSource( Actor::SIZE ),
+ ParentSource( Actor::SIZE ),
+ ScaleToFitKeepAspectRatioConstraint() );
+ actor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied, but parent size is larger than child
+ Vector3 childScale2( 2.0f, 2.0f, 2.0f );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale2, TEST_LOCATION );
+
+ // change parent size
+ Vector3 parentSize2( 40, 50, 50 );
+ parent.SetSize( parentSize2 );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied, but parent size is larger than child
+ Vector3 childScale3( 10.0f, 10.0f, 10.0f );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale3, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliBuiltinConstraintScaleToFillKeepAspectRatio(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentSize1( 10, 10, 10 );
+ parent.SetSize( parentSize1 );
+ Stage::GetCurrent().Add( parent );
+
+ Actor actor = Actor::New();
+ Vector3 childSize( 4, 5, 5 );
+ actor.SetSize( childSize );
+ parent.Add( actor );
+
+ application.SendNotification();
+ application.Render(0);
+ Vector3 childScale1( 1.0f, 1.0f, 1.0f );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale1, TEST_LOCATION );
+
+ // Apply constraint
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SCALE,
+ LocalSource( Actor::SIZE ),
+ ParentSource( Actor::SIZE ),
+ ScaleToFillKeepAspectRatioConstraint() );
+ actor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied, but parent size is larger than child
+ float val = 10.f / 4.f;
+ Vector3 childScale2( val, val, val );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale2, TEST_LOCATION );
+
+ // change parent size
+ Vector3 parentSize2( 40, 50, 50 );
+ parent.SetSize( parentSize2 );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied, but parent size is larger than child
+ Vector3 childScale3( 10.0f, 10.0f, 10.0f );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale3, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliBuiltinConstraintScaleToFillXYKeepAspectRatio(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentSize1( 10, 10, 10 );
+ parent.SetSize( parentSize1 );
+ Stage::GetCurrent().Add( parent );
+
+ Actor actor = Actor::New();
+ Vector3 childSize( 4, 5, 5 );
+ actor.SetSize( childSize );
+ parent.Add( actor );
+
+ application.SendNotification();
+ application.Render(0);
+ Vector3 childScale1( 1.0f, 1.0f, 1.0f );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale1, TEST_LOCATION );
+
+ // Apply constraint
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SCALE,
+ LocalSource( Actor::SIZE ),
+ ParentSource( Actor::SIZE ),
+ ScaleToFillXYKeepAspectRatioConstraint() );
+ actor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied, but parent size is larger than child
+ float val = 10.f / 4.f;
+ Vector3 childScale2( val, val, val );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale2, TEST_LOCATION );
+
+ // change parent size
+ Vector3 parentSize2( 40, 50, 50 );
+ parent.SetSize( parentSize2 );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied, but parent size is larger than child
+ Vector3 childScale3( 10.0f, 10.0f, 10.0f );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale3, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliBuiltinConstraintShrinkInsideKeepAspectRatioConstraint(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ Vector3 parentSize1( 10, 10, 10 );
+ parent.SetSize( parentSize1 );
+ Stage::GetCurrent().Add( parent );
+
+ Actor actor = Actor::New();
+ Vector3 childSize( 4, 5, 5 );
+ actor.SetSize( childSize );
+ parent.Add( actor );
+
+ application.SendNotification();
+ application.Render(0);
+ Vector3 childScale1( 1.0f, 1.0f, 1.0f );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale1, TEST_LOCATION );
+
+ // Apply constraint
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SCALE,
+ LocalSource( Actor::SIZE ),
+ ParentSource( Actor::SIZE ),
+ ShrinkInsideKeepAspectRatioConstraint() );
+ actor.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied, but parent size is larger than child
+ Vector3 childScale2( 1.0f, 1.0f, 1.0f );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale2, TEST_LOCATION );
+
+ // change parent size
+ Vector3 parentSize2( 40, 50, 50 );
+ parent.SetSize( parentSize2 );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied, but parent size is larger than child
+ Vector3 childScale3( 1.0f, 1.0f, 1.0f );
+ DALI_TEST_EQUALS( actor.GetCurrentScale(), childScale3, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliBuiltinConstraintMultiplyConstraint(void)
+{
+ TestApplication application;
+
+ Actor actor1 = Actor::New();
+ Vector3 startPosition( 10, 10, 10 );
+ actor1.SetPosition( startPosition );
+ Stage::GetCurrent().Add( actor1 );
+
+ Actor actor2 = Actor::New();
+ Vector3 startSize( 100, 100, 100 );
+ actor2.SetSize( startSize );
+ Stage::GetCurrent().Add( actor2 );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( actor1.GetCurrentPosition() == startPosition );
+ DALI_TEST_CHECK( actor2.GetCurrentSize() == startSize );
+
+ // Apply constraint - multiply actor1 size by actor2 position
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SIZE,
+ Source( actor1, Actor::POSITION ),
+ MultiplyConstraint() );
+ constraint.SetRemoveAction( Constraint::Discard );
+ actor2.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ Vector3 size( startSize * startPosition );
+ DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, TEST_LOCATION );
+
+ // Change the multiply input
+ Vector3 endPosition( 2, 2, 2 );
+ actor1.SetPosition( endPosition );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ size = Vector3( startSize * endPosition );
+ DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliBuiltinConstraintDivideConstraint(void)
+{
+ TestApplication application;
+
+ Actor actor1 = Actor::New();
+ Vector3 startPosition( 10, 10, 10 );
+ actor1.SetPosition( startPosition );
+ Stage::GetCurrent().Add( actor1 );
+
+ Actor actor2 = Actor::New();
+ Vector3 startSize( 100, 100, 100 );
+ actor2.SetSize( startSize );
+ Stage::GetCurrent().Add( actor2 );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( actor1.GetCurrentPosition() == startPosition );
+ DALI_TEST_CHECK( actor2.GetCurrentSize() == startSize );
+
+ // Apply constraint - divide actor1 size by actor2 position
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SIZE,
+ Source( actor1, Actor::POSITION ),
+ DivideConstraint() );
+ constraint.SetRemoveAction( Constraint::Discard );
+ actor2.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ Vector3 size( 10, 10, 10 ); // startSize / startPosition
+ DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, TEST_LOCATION );
+
+ // Change the divide input
+ Vector3 endPosition( 2, 2, 2 );
+ actor1.SetPosition( endPosition );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ size = Vector3( 50, 50, 50 ); // startSize / endPosition
+ DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliBuiltinConstraintEqualToConstraint(void)
+{
+ TestApplication application;
+
+ Actor actor1 = Actor::New();
+ Vector3 startPosition( 10, 10, 10 );
+ actor1.SetPosition( startPosition );
+ Stage::GetCurrent().Add( actor1 );
+
+ Actor actor2 = Actor::New();
+ Vector3 startSize( 100, 100, 100 );
+ actor2.SetSize( startSize );
+ Stage::GetCurrent().Add( actor2 );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( actor1.GetCurrentPosition() == startPosition );
+ DALI_TEST_CHECK( actor2.GetCurrentSize() == startSize );
+
+ // Apply constraint - actor1 size == actor2 position
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SIZE,
+ Source( actor1, Actor::POSITION ),
+ EqualToConstraint() );
+ constraint.SetRemoveAction( Constraint::Discard );
+ actor2.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor2.GetCurrentSize(), startPosition, TEST_LOCATION );
+
+ // Change the input
+ Vector3 endPosition( 2, 2, 2 );
+ actor1.SetPosition( endPosition );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor2.GetCurrentSize(), endPosition, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor2.GetCurrentSize(), endPosition, TEST_LOCATION );
+
+ //
+ // Check float variant of constraint
+ //
+ float startOpacity(1.0f);
+ float endOpacity(0.2f);
+ actor1.SetOpacity( startOpacity );
+ actor2.SetOpacity( startOpacity );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor1.GetCurrentOpacity(), startOpacity, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor2.GetCurrentOpacity(), startOpacity, TEST_LOCATION );
+
+ Constraint constraint2 = Constraint::New<float>( Actor::COLOR_ALPHA,
+ Source( actor1, Actor::COLOR_ALPHA ),
+ EqualToConstraint() );
+ constraint2.SetRemoveAction( Constraint::Discard );
+ actor2.ApplyConstraint( constraint2 );
+
+ actor1.SetOpacity(endOpacity);
+
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( actor2.GetCurrentOpacity(), endOpacity, 0.000001f, TEST_LOCATION );
+
+ //
+ // Check Vector4 variant of constraint
+ //
+ actor1.SetColor( Color::GREEN );
+ actor2.SetColor( Color::RED );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( actor1.GetCurrentColor() == Color::GREEN );
+ DALI_TEST_CHECK( actor2.GetCurrentColor() == Color::RED );
+
+ Constraint constraint3 = Constraint::New<Vector4>( Actor::COLOR,
+ Source( actor1, Actor::COLOR ),
+ EqualToConstraint() );
+ constraint3.SetRemoveAction( Constraint::Discard );
+ actor2.ApplyConstraint( constraint3 );
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( actor2.GetCurrentColor() == Color::GREEN );
+
+ //
+ // Check Quaternion variant of constraint
+ //
+ Quaternion q1 = Quaternion( Math::PI_2, Vector3::XAXIS );
+ Quaternion q2 = Quaternion( Math::PI_4, Vector3::YAXIS );
+ actor1.SetRotation( q1 );
+ actor2.SetRotation( q2 );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor1.GetCurrentRotation(), q1, 0.01, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor2.GetCurrentRotation(), q2, 0.01, TEST_LOCATION );
+
+ Constraint constraint4 = Constraint::New<Quaternion>( Actor::ROTATION,
+ Source( actor1, Actor::ROTATION ),
+ EqualToConstraint() );
+ constraint4.SetRemoveAction( Constraint::Discard );
+ actor2.ApplyConstraint( constraint4 );
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor2.GetCurrentRotation(), q1, 0.01, TEST_LOCATION );
+
+ //
+ // Check Matrix3 variant
+ //
+ EqualToConstraint equalToConstraint;
+
+ Matrix3 a;
+ a.AsFloat()[0] = 1.f;
+ Matrix3 b;
+ b.AsFloat()[0] = 2.f;
+ PropertyInputAbstraction pi(b);
+
+ Matrix3 c = equalToConstraint(a,pi);
+ DALI_TEST_EQUALS( c.AsFloat()[0], b.AsFloat()[0], 0.01, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliBuiltinConstraintRelativeToConstraint(void)
+{
+ TestApplication application;
+
+ Actor actor1 = Actor::New();
+ Vector3 startPosition( 10, 10, 10 );
+ actor1.SetPosition( startPosition );
+ Stage::GetCurrent().Add( actor1 );
+
+ Actor actor2 = Actor::New();
+ Vector3 startSize( 100, 100, 100 );
+ actor2.SetSize( startSize );
+ Stage::GetCurrent().Add( actor2 );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( actor1.GetCurrentPosition() == startPosition );
+ DALI_TEST_CHECK( actor2.GetCurrentSize() == startSize );
+
+ // Apply constraint - actor1 size == actor2 position
+
+ RelativeToConstraint( 0.f );
+ Vector3 scale( 0.5, 0.6, 0.7 );
+ Constraint constraint = Constraint::New<Vector3>( Actor::SIZE,
+ Source( actor1, Actor::POSITION ),
+ RelativeToConstraint( scale ) );
+ constraint.SetRemoveAction( Constraint::Discard );
+ actor2.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor2.GetCurrentSize(), scale * startPosition, TEST_LOCATION );
+
+ // Change the input
+ Vector3 endPosition( 2, 2, 2 );
+ actor1.SetPosition( endPosition );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ DALI_TEST_EQUALS( actor2.GetCurrentSize(), scale * endPosition, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor2.GetCurrentSize(), scale * endPosition, TEST_LOCATION );
+
+ //
+ // Check float variant of constraint
+ //
+ float scale2( 0.5f );
+ float startOpacity(1.0f);
+ actor1.SetOpacity( startOpacity );
+ actor2.SetOpacity( startOpacity );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_EQUALS( actor1.GetCurrentOpacity(), startOpacity, TEST_LOCATION );
+ DALI_TEST_EQUALS( actor2.GetCurrentOpacity(), startOpacity, TEST_LOCATION );
+
+ Constraint constraint2 = Constraint::New<float>( Actor::COLOR_ALPHA,
+ Source( actor1, Actor::COLOR_ALPHA ),
+ RelativeToConstraintFloat(scale2) );
+ constraint2.SetRemoveAction( Constraint::Discard );
+ actor2.ApplyConstraint(constraint2);
+ application.SendNotification();
+ application.Render(0);
+
+ DALI_TEST_EQUALS( actor2.GetCurrentOpacity(), startOpacity * scale2, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliBuiltinConstraintInverseOfConstraint(void)
+{
+ TestApplication application;
+
+ Actor actor1 = Actor::New();
+ Vector3 startPosition( 10, 10, 10 );
+ actor1.SetPosition( startPosition );
+ Stage::GetCurrent().Add( actor1 );
+
+ Actor actor2 = Actor::New();
+ Vector3 startSize( 100, 100, 100 );
+ actor2.SetSize( startSize );
+ Stage::GetCurrent().Add( actor2 );
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK( actor1.GetCurrentPosition() == startPosition );
+ DALI_TEST_CHECK( actor2.GetCurrentSize() == startSize );
+
+ // Apply constraint - actor1 size == ( 1 / actor2 position )
+
+ Constraint constraint = Constraint::New<Vector3>( Actor::SIZE,
+ Source( actor1, Actor::POSITION ),
+ InverseOfConstraint() );
+ constraint.SetRemoveAction( Constraint::Discard );
+ actor2.ApplyConstraint( constraint );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ Vector3 size( 0.1, 0.1, 0.1 ); // 1 / startPosition
+ DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, 0.00001f, TEST_LOCATION );
+
+ // Change the input
+ Vector3 endPosition( 2, 2, 2 );
+ actor1.SetPosition( endPosition );
+
+ application.SendNotification();
+ application.Render(0);
+
+ // Constraint should be fully applied
+ size = Vector3( 0.5, 0.5, 0.5 ); // 1 / endPosition
+ DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, TEST_LOCATION );
+ application.Render(0);
+ DALI_TEST_EQUALS( actor2.GetCurrentSize(), size, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliBuiltinConstraintFunctions(void)
+{
+ TestApplication application;
+
+ {
+ SourceWidthFixedHeight sourceWidthFixedHeight( 10.f );
+ Vector3 current;
+ {
+ Vector3 reference(1, 10, 0);
+ Vector3 value = sourceWidthFixedHeight( current, PropertyInputAbstraction(Vector3::ONE) );
+ DALI_TEST_EQUALS( reference, value, TEST_LOCATION );
+ }
+ {
+ Vector3 reference(10, 10, 0);
+ Vector3 value = sourceWidthFixedHeight( current, PropertyInputAbstraction(Vector3::ONE*10.f) );
+ DALI_TEST_EQUALS( reference, value, TEST_LOCATION );
+ }
+ {
+ Vector3 reference(10,10,0);
+ Vector3 value = sourceWidthFixedHeight( current, PropertyInputAbstraction(Vector3::ONE*10.f) );
+ DALI_TEST_EQUALS( reference, value, TEST_LOCATION );
+ }
+ }
+
+ {
+ SourceHeightFixedWidth sourceHeightFixedWidth( 10.f );
+ Vector3 current;
+ {
+ Vector3 reference(10,1,0);
+ Vector3 value = sourceHeightFixedWidth( current, PropertyInputAbstraction(Vector3::ONE) );
+ DALI_TEST_EQUALS( reference, value, TEST_LOCATION );
+ }
+ {
+ Vector3 reference(10,10,0);
+ Vector3 value = sourceHeightFixedWidth( current, PropertyInputAbstraction(Vector3::ONE*10.f) );
+ DALI_TEST_EQUALS( reference, value, TEST_LOCATION );
+ }
+ {
+ Vector3 reference(10,100,0);
+ Vector3 value = sourceHeightFixedWidth( current, PropertyInputAbstraction(Vector3::ONE*100.f) );
+ DALI_TEST_EQUALS( reference, value, TEST_LOCATION );
+ }
+ }
+
+ { // LookAt
+ Quaternion current(0, Vector3::YAXIS);
+ PropertyInputAbstraction target(Vector3::ZAXIS);
+ PropertyInputAbstraction targetRotation(Vector3::YAXIS);
+ PropertyInputAbstraction camera(Vector3::ZERO);
+
+ {
+ Quaternion reference(1., 0., 0., 0.);
+ Quaternion value = LookAt( current, target, camera, targetRotation );
+ DALI_TEST_EQUALS( reference, value, 0.001, TEST_LOCATION );
+ }
+
+ {
+ OrientedLookAt orientedLookAt(90.f);
+ Quaternion reference(.525322, 0., 0., 0.850904);
+ Quaternion value = orientedLookAt( current, target, camera, targetRotation );
+ DALI_TEST_EQUALS( reference, value, 0.001, TEST_LOCATION );
+ }
+ }
+
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <stdlib.h>
+#include <dali/dali.h>
+
+#include <dali/integration-api/events/touch-event-integ.h>
+#include <dali/integration-api/events/mouse-wheel-event-integ.h>
+#include <dali/integration-api/events/key-event-integ.h>
+
+#include "dali-test-suite-utils/dali-test-suite-utils.h"
+
+using namespace Dali;
+
+
+void custom_actor_test_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void custom_actor_test_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+std::vector< std::string > MasterCallStack;
+
+} // anon namespace
+
+// TypeRegistry needs custom actor Implementations to have the same name (namespaces are ignored so we use one here)
+namespace Impl
+{
+
+struct TestCustomActor : public CustomActorImpl
+{
+ /**
+ * Constructor
+ */
+ TestCustomActor()
+ : CustomActorImpl( true ), // requires touch
+ mDaliProperty( Property::INVALID_INDEX ),
+ mSizeSet( Vector3::ZERO ),
+ mTargetSize( Vector3::ZERO )
+ {
+ SetRequiresMouseWheelEvents(true);
+ }
+
+ /**
+ * Destructor
+ */
+ virtual ~TestCustomActor()
+ {
+ }
+
+ void Initialize( const char* name = NULL )
+ {
+ mDaliProperty = Self().RegisterProperty( "Dali", std::string("no"), Property::READ_WRITE);
+
+ OnInitialize( name );
+ }
+
+ virtual void OnInitialize( const char* name ) {}
+
+ /**
+ * Resets the call stack
+ */
+ void ResetCallStack()
+ {
+ mSizeSet = Vector3();
+ mTargetSize = Vector3();
+ mMethodsCalled.clear();
+ }
+
+ void AddToCallStacks( const char* method )
+ {
+ mMethodsCalled.push_back( method );
+
+ // Combine Actor name with method string
+ std::string nameAndMethod( Self().GetName() );
+ if ( 0 == nameAndMethod.size() )
+ {
+ nameAndMethod = "Unknown: ";
+ }
+ else
+ {
+ nameAndMethod += ": ";
+ }
+ nameAndMethod += method;
+
+ MasterCallStack.push_back( nameAndMethod );
+ }
+
+ // From CustomActorImpl
+ virtual void OnStageConnection()
+ {
+ AddToCallStacks("OnStageConnection");
+ }
+ virtual void OnStageDisconnection()
+ {
+ AddToCallStacks("OnStageDisconnection");
+ }
+ virtual void OnChildAdd(Actor& child)
+ {
+ AddToCallStacks("OnChildAdd");
+ }
+ virtual void OnChildRemove(Actor& child)
+ {
+ AddToCallStacks("OnChildRemove");
+ }
+ virtual void OnPropertySet( Property::Index index, Property::Value propertyValue )
+ {
+ AddToCallStacks("OnPropertySet");
+ }
+ virtual void OnSizeSet(const Vector3& targetSize)
+ {
+ mSizeSet = targetSize;
+ AddToCallStacks("OnSizeSet");
+ }
+ virtual void OnSizeAnimation(Animation& animation, const Vector3& targetSize)
+ {
+ mTargetSize = targetSize;
+ AddToCallStacks("OnSizeAnimation");
+ }
+ virtual bool OnTouchEvent(const TouchEvent& event)
+ {
+ AddToCallStacks("OnTouchEvent");
+ return true;
+ }
+ virtual bool OnMouseWheelEvent(const MouseWheelEvent& event)
+ {
+ AddToCallStacks("OnMouseWheelEvent");
+ return true;
+ }
+ virtual bool OnKeyEvent(const KeyEvent& event)
+ {
+ AddToCallStacks("OnKeyEvent");
+ return true;
+ }
+ virtual void OnKeyInputFocusGained()
+ {
+ AddToCallStacks("OnKeyInputFocusGained");
+ }
+ virtual void OnKeyInputFocusLost()
+ {
+ AddToCallStacks("OnKeyInputFocusLost");
+ }
+ virtual Actor GetChildByAlias(const std::string& actorAlias)
+ {
+ AddToCallStacks("GetChildByAlias");
+
+ if ("found" == actorAlias)
+ {
+ return Actor::New();
+ }
+ else
+ {
+ return Actor();
+ }
+ }
+
+ void SetDaliProperty(std::string s)
+ {
+ Self().SetProperty(mDaliProperty, s) ;
+ }
+
+ Property::Index mDaliProperty;
+ std::vector< std::string > mMethodsCalled;
+ Vector3 mSizeSet;
+ Vector3 mTargetSize;
+};
+
+/**
+ * Variant which adds a new child during OnStageConnection
+ */
+struct TestCustomActorVariant1 : public TestCustomActor
+{
+ /**
+ * Constructor
+ */
+ TestCustomActorVariant1( Actor childToAdd )
+ : mChildToAdd( childToAdd )
+ {
+ }
+
+ // From CustomActorImpl
+ virtual void OnStageConnection()
+ {
+ // Chain up first
+ TestCustomActor::OnStageConnection();
+
+ // Add the child
+ Self().Add( mChildToAdd );
+ }
+
+ Actor mChildToAdd;
+};
+
+/**
+ * Variant which removes children during OnStageConnection
+ */
+struct TestCustomActorVariant2 : public TestCustomActor
+{
+ /**
+ * Constructor
+ */
+ TestCustomActorVariant2()
+ {
+ }
+
+ // From CustomActorImpl
+ virtual void OnStageConnection()
+ {
+ // Chain up first
+ TestCustomActor::OnStageConnection();
+
+ // Remove all the children
+ for( unsigned int i=0, num=Self().GetChildCount(); i<num; ++i )
+ {
+ Self().Remove( Self().GetChildAt(0) );
+ }
+ }
+};
+
+/**
+ * Variant which adds a new child during OnStageDisconnection
+ */
+struct TestCustomActorVariant3 : public TestCustomActor
+{
+ /**
+ * Constructor
+ */
+ TestCustomActorVariant3( Actor childToAdd )
+ : mChildToAdd( childToAdd )
+ {
+ }
+
+ // From CustomActorImpl
+ virtual void OnStageDisconnection()
+ {
+ // Chain up first
+ TestCustomActor::OnStageDisconnection();
+
+ // Add the child
+ Self().Add( mChildToAdd );
+ }
+
+ Actor mChildToAdd;
+};
+
+/**
+ * Variant which removes children during OnStageDisconnection
+ */
+struct TestCustomActorVariant4 : public TestCustomActor
+{
+ /**
+ * Constructor
+ */
+ TestCustomActorVariant4()
+ {
+ }
+
+ // From CustomActorImpl
+ virtual void OnStageDisconnection()
+ {
+ // Chain up first
+ TestCustomActor::OnStageDisconnection();
+
+ // Remove all the children
+ for( unsigned int i=0, num=Self().GetChildCount(); i<num; ++i )
+ {
+ Self().Remove( Self().GetChildAt(0) );
+ }
+ }
+};
+
+/**
+ * Variant which removes its parent from Stage during OnStageConnection
+ */
+struct TestCustomActorVariant5 : public TestCustomActor
+{
+ /**
+ * Constructor
+ */
+ TestCustomActorVariant5()
+ {
+ }
+
+ // From CustomActorImpl
+ virtual void OnStageConnection()
+ {
+ // Chain up first
+ TestCustomActor::OnStageConnection();
+
+ // Take parent off-stage
+ Actor parent = Self().GetParent();
+ if ( parent )
+ {
+ Stage::GetCurrent().Remove( parent );
+ }
+ }
+};
+
+/**
+ * Variant which adds its parent to Stage during OnStageDisconnection
+ */
+struct TestCustomActorVariant6 : public TestCustomActor
+{
+ /**
+ * Constructor
+ */
+ TestCustomActorVariant6()
+ {
+ }
+
+ // From CustomActorImpl
+ virtual void OnStageDisconnection()
+ {
+ // Chain up first
+ TestCustomActor::OnStageDisconnection();
+
+ // Put parent on-stage
+ Actor parent = Self().GetParent();
+ if ( parent )
+ {
+ Stage::GetCurrent().Add( parent );
+ }
+ }
+};
+
+/**
+ * Variant which reparents its children into a separate container
+ */
+struct TestCustomActorVariant7 : public TestCustomActor
+{
+ /**
+ * Constructor
+ */
+ TestCustomActorVariant7()
+ {
+ }
+
+ virtual void OnInitialize( const char* name )
+ {
+ // We need to do this early, before the OnChildAdd is recorded
+ Self().SetName( name );
+
+ mContainer = Actor::New();
+ mContainer.SetName( "Container" );
+ Self().Add( mContainer );
+ }
+
+ // From CustomActorImpl
+ virtual void OnChildAdd(Actor& child)
+ {
+ // Chain up first
+ TestCustomActor::OnChildAdd(child);
+
+ // Reparent child
+ if ( child != mContainer )
+ {
+ mContainer.Add( child );
+ }
+ }
+
+ Actor mContainer;
+};
+
+/**
+ * Variant which attempts to interfere with the reparenting of a child to another container
+ */
+struct TestCustomActorVariant8 : public TestCustomActor
+{
+ /**
+ * Constructor
+ */
+ TestCustomActorVariant8( Actor rival )
+ : mRivalContainer( rival )
+ {
+ }
+
+ // From CustomActorImpl
+ virtual void OnChildRemove(Actor& child)
+ {
+ // Chain up first
+ TestCustomActor::OnChildRemove(child);
+
+ mRivalContainer.Remove( child ); // attempt to block reparenting to rival (should be a NOOP)
+ }
+
+ Actor mRivalContainer;
+};
+
+// Need a class that doesn't override virtual methods
+class SimpleTestCustomActor : public CustomActorImpl
+{
+public:
+
+ /**
+ * Constructor
+ */
+ SimpleTestCustomActor()
+ : CustomActorImpl( true ) // requires touch
+ {
+ }
+
+ /**
+ * Destructor
+ */
+ virtual ~SimpleTestCustomActor()
+ {
+ }
+
+ // From CustomActorImpl
+ virtual void OnStageConnection()
+ {
+ }
+ virtual void OnStageDisconnection()
+ {
+ }
+ virtual void OnChildAdd(Actor& child)
+ {
+ }
+ virtual void OnChildRemove(Actor& child)
+ {
+ }
+ virtual void OnSizeSet(const Vector3& targetSize)
+ {
+ }
+ virtual void OnSizeAnimation(Animation& animation, const Vector3& targetSize)
+ {
+ }
+ virtual bool OnTouchEvent(const TouchEvent& event)
+ {
+ return true;
+ }
+ virtual bool OnMouseWheelEvent(const MouseWheelEvent& event)
+ {
+ return true;
+ }
+ virtual bool OnKeyEvent(const KeyEvent& event)
+ {
+ return true;
+ }
+ virtual void OnKeyInputFocusGained()
+ {
+ }
+ virtual void OnKeyInputFocusLost()
+ {
+ }
+
+ virtual Actor GetChildByAlias(const std::string& actorAlias)
+ {
+ return Actor();
+ }
+};
+
+} ; // namespace Impl
+
+
+namespace
+{
+
+/**
+ * Test custom actor handle
+ */
+class TestCustomActor : public CustomActor
+{
+public:
+
+ static TestCustomActor New()
+ {
+ Impl::TestCustomActor* impl = new Impl::TestCustomActor;
+ TestCustomActor custom( *impl ); // takes ownership
+
+ impl->Initialize();
+
+ return custom;
+ }
+
+ static TestCustomActor NewVariant1( Actor childToAdd )
+ {
+ Impl::TestCustomActor* impl = new Impl::TestCustomActorVariant1( childToAdd );
+ TestCustomActor custom( *impl ); // takes ownership
+
+ impl->Initialize();
+
+ return custom;
+ }
+
+ static TestCustomActor NewVariant2()
+ {
+ Impl::TestCustomActor* impl = new Impl::TestCustomActorVariant2();
+ TestCustomActor custom( *impl ); // takes ownership
+
+ impl->Initialize();
+
+ return custom;
+ }
+
+ static TestCustomActor NewVariant3( Actor childToAdd )
+ {
+ Impl::TestCustomActor* impl = new Impl::TestCustomActorVariant3( childToAdd );
+ TestCustomActor custom( *impl ); // takes ownership
+
+ impl->Initialize();
+
+ return custom;
+ }
+
+ static TestCustomActor NewVariant4()
+ {
+ Impl::TestCustomActor* impl = new Impl::TestCustomActorVariant4();
+ TestCustomActor custom( *impl ); // takes ownership
+
+ impl->Initialize();
+
+ return custom;
+ }
+
+ static TestCustomActor NewVariant5()
+ {
+ Impl::TestCustomActor* impl = new Impl::TestCustomActorVariant5();
+ TestCustomActor custom( *impl ); // takes ownership
+
+ impl->Initialize();
+
+ return custom;
+ }
+
+ static TestCustomActor NewVariant6()
+ {
+ Impl::TestCustomActor* impl = new Impl::TestCustomActorVariant6();
+ TestCustomActor custom( *impl ); // takes ownership
+
+ impl->Initialize();
+
+ return custom;
+ }
+
+ static TestCustomActor NewVariant7( const char* name )
+ {
+ Impl::TestCustomActor* impl = new Impl::TestCustomActorVariant7();
+ TestCustomActor custom( *impl ); // takes ownership
+
+ impl->Initialize( name );
+
+ return custom;
+ }
+
+ static TestCustomActor NewVariant8( Actor rival )
+ {
+ Impl::TestCustomActor* impl = new Impl::TestCustomActorVariant8( rival );
+ TestCustomActor custom( *impl ); // takes ownership
+
+ impl->Initialize();
+
+ return custom;
+ }
+
+ virtual ~TestCustomActor()
+ {
+ }
+
+ Impl::TestCustomActor& GetImpl()
+ {
+ return static_cast<Impl::TestCustomActor&>(GetImplementation());
+ }
+
+ std::vector< std::string >& GetMethodsCalled()
+ {
+ return GetImpl().mMethodsCalled;
+ }
+
+ void ResetCallStack()
+ {
+ GetImpl().ResetCallStack();
+ }
+
+ void SetDaliProperty(std::string s)
+ {
+ GetImpl().SetDaliProperty(s);
+ }
+
+ Vector3 GetSize()
+ {
+ return GetImpl().mSizeSet;
+ }
+
+ Vector3 GetTargetSize()
+ {
+ return GetImpl().mTargetSize;
+ }
+
+private:
+
+ TestCustomActor( Impl::TestCustomActor& impl ) : CustomActor( impl )
+ {
+ }
+};
+
+
+BaseHandle CreateActor()
+{
+ return TestCustomActor::New();
+}
+
+} // anon namespace
+
+
+int UtcDaliCustomActorDestructor(void)
+{
+ TestApplication application;
+
+ CustomActor* actor = new CustomActor();
+ delete actor;
+
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
+
+int UtcDaliCustomActorImplDestructor(void)
+{
+ TestApplication application;
+ CustomActorImpl* actor = new Impl::TestCustomActor();
+ delete actor;
+
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliCustomActorDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CustomActor::DownCast()");
+
+ TestCustomActor custom = TestCustomActor::New();
+
+ Actor anActor = Actor::New();
+ anActor.Add( custom );
+
+ Actor child = anActor.GetChildAt(0);
+ CustomActor customActor = CustomActor::DownCast( child );
+ DALI_TEST_CHECK( customActor );
+
+ customActor = NULL;
+ DALI_TEST_CHECK( !customActor );
+
+ customActor = DownCast< CustomActor >( child );
+ DALI_TEST_CHECK( customActor );
+ END_TEST;
+}
+
+// Negative test case for a method
+int UtcDaliCustomActorDownCastNegative(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CustomActor::DownCast()");
+
+ Actor actor1 = Actor::New();
+ Actor anActor = Actor::New();
+ anActor.Add(actor1);
+
+ Actor child = anActor.GetChildAt(0);
+ CustomActor customActor = CustomActor::DownCast( child );
+ DALI_TEST_CHECK( !customActor );
+
+ Actor unInitialzedActor;
+ customActor = CustomActor::DownCast( unInitialzedActor );
+ DALI_TEST_CHECK( !customActor );
+
+ customActor = DownCast< CustomActor >( unInitialzedActor );
+ DALI_TEST_CHECK( !customActor );
+ END_TEST;
+}
+
+int UtcDaliCustomActorOnStageConnectionDisconnection(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CustomActor::OnStageConnection() & OnStageDisconnection");
+
+ TestCustomActor custom = TestCustomActor::New();
+ DALI_TEST_EQUALS( 0, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+
+ // add the custom actor to stage
+ Stage::GetCurrent().Add( custom );
+
+ DALI_TEST_EQUALS( 1, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", custom.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+
+ Stage::GetCurrent().Remove( custom );
+
+ DALI_TEST_EQUALS( 2, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageDisconnection", custom.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+
+ // Excercise the message passing to Update thread
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ END_TEST;
+}
+
+int UtcDaliCustomActorOnStageConnectionOrder(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CustomActor::OnStageConnection() order");
+
+ MasterCallStack.clear();
+
+ /* Build tree of actors:
+ *
+ * A (parent)
+ * / \
+ * B C
+ * / \ \
+ * D E F
+ *
+ * OnStageConnection should be received for A, B, D, E, C, and finally F
+ */
+
+ TestCustomActor actorA = TestCustomActor::New();
+ actorA.SetName( "ActorA" );
+
+ TestCustomActor actorB = TestCustomActor::New();
+ actorB.SetName( "ActorB" );
+ actorA.Add( actorB );
+
+ TestCustomActor actorC = TestCustomActor::New();
+ actorC.SetName( "ActorC" );
+ actorA.Add( actorC );
+
+ TestCustomActor actorD = TestCustomActor::New();
+ actorD.SetName( "ActorD" );
+ actorB.Add( actorD );
+
+ TestCustomActor actorE = TestCustomActor::New();
+ actorE.SetName( "ActorE" );
+ actorB.Add( actorE );
+
+ TestCustomActor actorF = TestCustomActor::New();
+ actorF.SetName( "ActorF" );
+ actorC.Add( actorF );
+
+ // add the custom actor to stage
+ Stage::GetCurrent().Add( actorA );
+
+ DALI_TEST_EQUALS( 3, (int)(actorA.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildAdd", actorA.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildAdd", actorA.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", actorA.GetMethodsCalled()[ 2 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 3, (int)(actorB.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildAdd", actorB.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildAdd", actorB.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", actorB.GetMethodsCalled()[ 2 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 2, (int)(actorC.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildAdd", actorC.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", actorC.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 1, (int)(actorD.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", actorD.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 1, (int)(actorE.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", actorE.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 1, (int)(actorF.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", actorF.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+
+ // Check sequence is correct in MasterCallStack
+
+ DALI_TEST_EQUALS( 3+3+2+1+1+1, (int)(MasterCallStack.size()), TEST_LOCATION );
+
+ DALI_TEST_EQUALS( "ActorA: OnChildAdd", MasterCallStack[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnChildAdd", MasterCallStack[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorB: OnChildAdd", MasterCallStack[ 2 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorB: OnChildAdd", MasterCallStack[ 3 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorC: OnChildAdd", MasterCallStack[ 4 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( "ActorA: OnStageConnection", MasterCallStack[ 5 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorB: OnStageConnection", MasterCallStack[ 6 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorD: OnStageConnection", MasterCallStack[ 7 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorE: OnStageConnection", MasterCallStack[ 8 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorC: OnStageConnection", MasterCallStack[ 9 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorF: OnStageConnection", MasterCallStack[ 10 ], TEST_LOCATION );
+
+ // Excercise the message passing to Update thread
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ END_TEST;
+}
+
+int UtcDaliCustomActorOnStageDisconnectionOrder(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CustomActor::OnStageDisconnection() order");
+
+ Stage stage = Stage::GetCurrent();
+
+ /* Build tree of actors:
+ *
+ * A (parent)
+ * / \
+ * B C
+ * / \ \
+ * D E F
+ *
+ * OnStageDisconnection should be received for D, E, B, F, C, and finally A.
+ */
+
+ TestCustomActor actorA = TestCustomActor::New();
+ actorA.SetName( "ActorA" );
+ stage.Add( actorA );
+
+ TestCustomActor actorB = TestCustomActor::New();
+ actorB.SetName( "ActorB" );
+ actorA.Add( actorB );
+
+ TestCustomActor actorC = TestCustomActor::New();
+ actorC.SetName( "ActorC" );
+ actorA.Add( actorC );
+
+ TestCustomActor actorD = TestCustomActor::New();
+ actorD.SetName( "ActorD" );
+ actorB.Add( actorD );
+
+ TestCustomActor actorE = TestCustomActor::New();
+ actorE.SetName( "ActorE" );
+ actorB.Add( actorE );
+
+ TestCustomActor actorF = TestCustomActor::New();
+ actorF.SetName( "ActorF" );
+ actorC.Add( actorF );
+
+ // Excercise the message passing to Update thread
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ // Clear call stacks before disconnection
+ actorA.ResetCallStack();
+ actorB.ResetCallStack();
+ actorC.ResetCallStack();
+ actorD.ResetCallStack();
+ actorE.ResetCallStack();
+ actorF.ResetCallStack();
+ MasterCallStack.clear();
+
+ stage.Remove( actorA );
+
+ DALI_TEST_EQUALS( 1, (int)(actorA.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageDisconnection", actorA.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 1, (int)(actorB.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageDisconnection", actorB.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 1, (int)(actorC.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageDisconnection", actorC.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 1, (int)(actorD.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageDisconnection", actorD.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 1, (int)(actorE.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageDisconnection", actorE.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 1, (int)(actorF.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageDisconnection", actorF.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+
+ // Check sequence is correct in MasterCallStack
+
+ DALI_TEST_EQUALS( 6, (int)(MasterCallStack.size()), TEST_LOCATION );
+
+ DALI_TEST_EQUALS( "ActorD: OnStageDisconnection", MasterCallStack[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorE: OnStageDisconnection", MasterCallStack[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorB: OnStageDisconnection", MasterCallStack[ 2 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorF: OnStageDisconnection", MasterCallStack[ 3 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorC: OnStageDisconnection", MasterCallStack[ 4 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnStageDisconnection", MasterCallStack[ 5 ], TEST_LOCATION );
+
+ // Excercise the message passing to Update thread
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ END_TEST;
+}
+
+int UtcDaliCustomActorAddDuringOnStageConnection(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Actor::Add behaviour during Dali::CustomActor::OnStageConnection() callback");
+
+ Stage stage = Stage::GetCurrent();
+
+ MasterCallStack.clear();
+
+ /* The actorA is a special variant which adds a child to itself during OnStageConnection()
+ * The actorB is provided as the child
+ */
+
+ TestCustomActor actorB = TestCustomActor::New();
+ actorB.SetName( "ActorB" );
+
+ TestCustomActor actorA = TestCustomActor::NewVariant1( actorB );
+ actorA.SetName( "ActorA" );
+ stage.Add( actorA );
+
+ // Check callback sequence
+
+ DALI_TEST_EQUALS( 2, (int)(actorA.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", actorA.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildAdd", actorA.GetMethodsCalled()[ 1 ], TEST_LOCATION ); // Called from within OnStageConnection()
+
+ DALI_TEST_EQUALS( 2, (int)(actorA.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", actorA.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 3, (int)(MasterCallStack.size()), TEST_LOCATION );
+
+ DALI_TEST_EQUALS( "ActorA: OnStageConnection", MasterCallStack[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorB: OnStageConnection", MasterCallStack[ 1 ], TEST_LOCATION ); // Occurs during Actor::Add from within from within OnStageConnection()
+ DALI_TEST_EQUALS( "ActorA: OnChildAdd", MasterCallStack[ 2 ], TEST_LOCATION ); // Occurs after Actor::Add from within from within OnStageConnection()
+
+ // Excercise the message passing to Update thread
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ // Check everything is ok after Actors are removed
+
+ stage.Remove( actorA );
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ END_TEST;
+}
+
+int UtcDaliCustomActorRemoveDuringOnStageConnection(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Actor::Remove behaviour during Dali::CustomActor::OnStageConnection() callback");
+
+ Stage stage = Stage::GetCurrent();
+
+ MasterCallStack.clear();
+
+ /* The actorA is a special variant which removes its children during OnStageConnection()
+ * Actors B & C are provided as the children
+ */
+
+ TestCustomActor actorA = TestCustomActor::NewVariant2();
+ actorA.SetName( "ActorA" );
+
+ TestCustomActor actorB = TestCustomActor::New();
+ actorB.SetName( "ActorB" );
+ actorA.Add( actorB );
+
+ TestCustomActor actorC = TestCustomActor::New();
+ actorC.SetName( "ActorC" );
+ actorA.Add( actorC );
+
+ stage.Add( actorA );
+
+ // Check callback sequence
+
+ DALI_TEST_EQUALS( 5, (int)(actorA.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildAdd", actorA.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildAdd", actorA.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", actorA.GetMethodsCalled()[ 2 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildRemove", actorA.GetMethodsCalled()[ 3 ], TEST_LOCATION ); // Called from within OnStageConnection()
+ DALI_TEST_EQUALS( "OnChildRemove", actorA.GetMethodsCalled()[ 4 ], TEST_LOCATION ); // Called from within OnStageConnection()
+
+ DALI_TEST_EQUALS( 5, (int)(MasterCallStack.size()), TEST_LOCATION );
+
+ DALI_TEST_EQUALS( "ActorA: OnChildAdd", MasterCallStack[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnChildAdd", MasterCallStack[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnStageConnection", MasterCallStack[ 2 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnChildRemove", MasterCallStack[ 3 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnChildRemove", MasterCallStack[ 4 ], TEST_LOCATION );
+
+ /* Actors B & C should be removed before the point where they could receive an OnStageConnection callback
+ * Therefore they shouldn't receive either OnStageConnection or OnStageDisconnection
+ */
+ DALI_TEST_EQUALS( 0, (int)(actorB.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( 0, (int)(actorC.GetMethodsCalled().size()), TEST_LOCATION );
+
+ // Excercise the message passing to Update thread
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ // Check everything is ok after last actor is removed
+
+ stage.Remove( actorA );
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ END_TEST;
+}
+
+int UtcDaliCustomActorAddDuringOnStageDisconnection(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Actor::Add behaviour during Dali::CustomActor::OnStageDisonnection() callback");
+
+ Stage stage = Stage::GetCurrent();
+
+ /* The actorA is a special variant which adds a child to itself during OnStageDisconnection()
+ * The actorB is provided as the child
+ */
+
+ TestCustomActor actorB = TestCustomActor::New();
+ actorB.SetName( "ActorB" );
+
+ TestCustomActor actorA = TestCustomActor::NewVariant3( actorB );
+ actorA.SetName( "ActorA" );
+ stage.Add( actorA );
+
+ // Excercise the message passing to Update thread
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ // Clear call stacks before disconnection
+ actorA.ResetCallStack();
+ actorB.ResetCallStack();
+ MasterCallStack.clear();
+
+ stage.Remove( actorA );
+
+ // Check callback sequence
+
+ DALI_TEST_EQUALS( 2, (int)(actorA.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageDisconnection", actorA.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildAdd", actorA.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+
+ // Child was added after parent disconnection, so should not receive OnStageConnection()
+ DALI_TEST_EQUALS( 0, (int)(actorB.GetMethodsCalled().size()), TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 2, (int)(MasterCallStack.size()), TEST_LOCATION );
+
+ DALI_TEST_EQUALS( "ActorA: OnStageDisconnection", MasterCallStack[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnChildAdd", MasterCallStack[ 1 ], TEST_LOCATION );
+
+ // Excercise the message passing to Update thread
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ END_TEST;
+}
+
+int UtcDaliCustomActorRemoveDuringOnStageDisconnection(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Actor::Remove behaviour during Dali::CustomActor::OnStageDisconnection() callback");
+
+ Stage stage = Stage::GetCurrent();
+
+ /* The actorA is a special variant which removes its children during OnStageDisconnection()
+ * The actorB is provided as the child
+ */
+
+ TestCustomActor actorA = TestCustomActor::NewVariant4();
+ actorA.SetName( "ActorA" );
+ stage.Add( actorA );
+
+ TestCustomActor actorB = TestCustomActor::New();
+ actorB.SetName( "ActorB" );
+ actorA.Add( actorB );
+
+ // Excercise the message passing to Update thread
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+
+ // Clear call stacks before disconnection
+ actorA.ResetCallStack();
+ actorB.ResetCallStack();
+ MasterCallStack.clear();
+
+ stage.Remove( actorA );
+
+ // Check callback sequence
+
+ DALI_TEST_EQUALS( 2, (int)(actorA.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageDisconnection", actorA.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildRemove", actorA.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 1, (int)(actorB.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageDisconnection", actorB.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 3, (int)(MasterCallStack.size()), TEST_LOCATION );
+
+ DALI_TEST_EQUALS( "ActorB: OnStageDisconnection", MasterCallStack[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnStageDisconnection", MasterCallStack[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnChildRemove", MasterCallStack[ 2 ], TEST_LOCATION );
+
+ // Excercise the message passing to Update thread
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ END_TEST;
+}
+
+int UtcDaliCustomActorRemoveParentDuringOnStageConnection(void)
+{
+ TestApplication application;
+ tet_infoline("Weird test where child removes its own parent from Stage during Dali::CustomActor::OnStageConnection() callback");
+
+ Stage stage = Stage::GetCurrent();
+
+ MasterCallStack.clear();
+
+ /* The actorA is the parent of actorB
+ * The actorB is a special variant which removes its own parent during OnStageConnection()
+ * The child actor is interrupting the parent's connection to stage, therefore the parent should not get an OnStageDisconnection()
+ */
+
+ TestCustomActor actorA = TestCustomActor::New();
+ actorA.SetName( "ActorA" );
+
+ TestCustomActor actorB = TestCustomActor::NewVariant5();
+ actorB.SetName( "ActorB" );
+ actorA.Add( actorB );
+
+ stage.Add( actorA );
+
+ // Check callback sequence
+
+ DALI_TEST_EQUALS( 3, (int)(actorA.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildAdd", actorA.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", actorA.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageDisconnection", actorA.GetMethodsCalled()[ 2 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 1, (int)(actorB.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", actorB.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 4, (int)(MasterCallStack.size()), TEST_LOCATION );
+
+ DALI_TEST_EQUALS( "ActorA: OnChildAdd", MasterCallStack[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnStageConnection", MasterCallStack[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorB: OnStageConnection", MasterCallStack[ 2 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnStageDisconnection", MasterCallStack[ 3 ], TEST_LOCATION );
+
+ // Excercise the message passing to Update thread
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ END_TEST;
+}
+
+int UtcDaliCustomActorAddParentDuringOnStageDisconnection(void)
+{
+ TestApplication application;
+ tet_infoline("Weird test where child adds its own parent to Stage during Dali::CustomActor::OnStageDisconnection() callback");
+
+ Stage stage = Stage::GetCurrent();
+
+ MasterCallStack.clear();
+
+ /* The actorA is the parent of actorB
+ * The actorB is a special variant which (weirdly) adds its own parent during OnStageDisconnection()
+ * The child actor is interrupting the disconnection, such that parent should not get a OnStageDisconnection()
+ */
+
+ TestCustomActor actorA = TestCustomActor::New();
+ actorA.SetName( "ActorA" );
+ stage.Add( actorA );
+
+ TestCustomActor actorB = TestCustomActor::NewVariant6();
+ actorB.SetName( "ActorB" );
+ actorA.Add( actorB );
+
+ stage.Remove( actorA );
+
+ // Check callback sequence
+
+ DALI_TEST_EQUALS( 2, (int)(actorA.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", actorA.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildAdd", actorA.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 2, (int)(actorB.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", actorB.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageDisconnection", actorB.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+ // Disconnect was interrupted, so we should only get one OnStageConnection() for actorB
+
+ DALI_TEST_EQUALS( 4, (int)(MasterCallStack.size()), TEST_LOCATION );
+
+ DALI_TEST_EQUALS( "ActorA: OnStageConnection", MasterCallStack[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorB: OnStageConnection", MasterCallStack[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnChildAdd", MasterCallStack[ 2 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorB: OnStageDisconnection", MasterCallStack[ 3 ], TEST_LOCATION );
+
+ // Excercise the message passing to Update thread
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ END_TEST;
+}
+
+int UtcDaliCustomActorOnChildAddRemove(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CustomActor::OnChildAdd() & OnChildRemove()");
+
+ TestCustomActor custom = TestCustomActor::New();
+ DALI_TEST_EQUALS( 0, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+
+ Actor aChild = Actor::New();
+ custom.Add( aChild );
+
+ DALI_TEST_EQUALS( 1, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildAdd", custom.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+
+ custom.Remove( aChild );
+
+ DALI_TEST_EQUALS( 2, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildRemove", custom.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliCustomActorReparentDuringOnChildAdd(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Actor:Add (reparenting) behaviour during Dali::CustomActor::OnChildAdd() callback");
+
+ Stage stage = Stage::GetCurrent();
+
+ MasterCallStack.clear();
+
+ /* The actorA is a special variant which reparents children added into a separate container child
+ * The actorB is the child of actorA
+ */
+
+ TestCustomActor actorA = TestCustomActor::NewVariant7( "ActorA" );
+ stage.Add( actorA );
+
+ TestCustomActor actorB = TestCustomActor::New();
+ actorB.SetName( "ActorB" );
+ actorA.Add( actorB );
+
+ // Check hierarchy is as follows:
+ // A
+ // |
+ // Container
+ // |
+ // B
+
+ DALI_TEST_EQUALS( 1, (int)(actorA.GetChildCount()), TEST_LOCATION );
+
+ Actor container = actorA.GetChildAt(0);
+ Actor containerChild;
+
+ DALI_TEST_CHECK( container );
+ if ( container )
+ {
+ DALI_TEST_EQUALS( "Container", container.GetName(), TEST_LOCATION );
+ DALI_TEST_EQUALS( 1, (int)(container.GetChildCount()), TEST_LOCATION );
+ containerChild = container.GetChildAt(0);
+ }
+
+ DALI_TEST_CHECK( containerChild );
+ if ( containerChild )
+ {
+ DALI_TEST_EQUALS( "ActorB", containerChild.GetName(), TEST_LOCATION );
+ DALI_TEST_EQUALS( 0, (int)(containerChild.GetChildCount()), TEST_LOCATION );
+ }
+
+ // Check callback sequence
+
+ DALI_TEST_EQUALS( 4, (int)(actorA.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildAdd", actorA.GetMethodsCalled()[ 0 ], TEST_LOCATION ); // The mContainer added to actorA
+ DALI_TEST_EQUALS( "OnStageConnection", actorA.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildAdd", actorA.GetMethodsCalled()[ 2 ], TEST_LOCATION ); // The actorB added to actorA
+ DALI_TEST_EQUALS( "OnChildRemove", actorA.GetMethodsCalled()[ 3 ], TEST_LOCATION );
+ // mContainer will then receive OnChildAdd
+
+ DALI_TEST_EQUALS( 3, (int)(actorB.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", actorB.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageDisconnection", actorB.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", actorB.GetMethodsCalled()[ 2 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 7, (int)(MasterCallStack.size()), TEST_LOCATION );
+
+ DALI_TEST_EQUALS( "ActorA: OnChildAdd", MasterCallStack[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnStageConnection", MasterCallStack[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorB: OnStageConnection", MasterCallStack[ 2 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnChildAdd", MasterCallStack[ 3 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorB: OnStageDisconnection", MasterCallStack[ 4 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnChildRemove", MasterCallStack[ 5 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorB: OnStageConnection", MasterCallStack[ 6 ], TEST_LOCATION );
+
+ // Excercise the message passing to Update thread
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ END_TEST;
+}
+
+/**
+ * Test that Remove can be called (a NOOP) during the OnChildRemove
+ * triggered when reparenting an actor
+ */
+int UtcDaliCustomActorRemoveDuringOnChildRemove(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Actor:Remove behaviour during OnChildRemove() callback triggered when reparenting");
+
+ Stage stage = Stage::GetCurrent();
+
+ MasterCallStack.clear();
+
+ /* The childActor will be reparented from actorA to actorB
+ * The actorA is a special variant which attempts to remove a child from actorB, during the OnChildRemove callback()
+ * This should be a NOOP since the reparenting has not occured yet
+ */
+
+ TestCustomActor actorB = TestCustomActor::New();
+ actorB.SetName( "ActorB" );
+ stage.Add( actorB );
+
+ TestCustomActor actorA = TestCustomActor::NewVariant8( actorB );
+ actorA.SetName( "ActorA" );
+ stage.Add( actorA );
+
+ Actor childActor = Actor::New();
+ childActor.SetName( "Child" );
+ // Reparent from actorA to actorB
+ actorA.Add( childActor );
+ actorB.Add( childActor );
+
+ // Check hierarchy is as follows:
+ // A B
+ // |
+ // Child
+
+ DALI_TEST_EQUALS( 0, (int)(actorA.GetChildCount()), TEST_LOCATION );
+ DALI_TEST_EQUALS( 1, (int)(actorB.GetChildCount()), TEST_LOCATION );
+ DALI_TEST_EQUALS( 0, (int)(childActor.GetChildCount()), TEST_LOCATION );
+
+ Actor child = actorB.GetChildAt(0);
+
+ DALI_TEST_CHECK( child );
+ if ( child )
+ {
+ DALI_TEST_EQUALS( "Child", child.GetName(), TEST_LOCATION );
+ }
+
+ // Check callback sequence
+
+ DALI_TEST_EQUALS( 3, (int)(actorA.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", actorA.GetMethodsCalled()[ 0 ], TEST_LOCATION ); // The mContainer added to actorA
+ DALI_TEST_EQUALS( "OnChildAdd", actorA.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildRemove", actorA.GetMethodsCalled()[ 2 ], TEST_LOCATION ); // The actorB added to actorA
+ // mContainer will then receive OnChildAdd
+
+ DALI_TEST_EQUALS( 2, (int)(actorB.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnStageConnection", actorB.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnChildAdd", actorB.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+
+ DALI_TEST_EQUALS( 5, (int)(MasterCallStack.size()), TEST_LOCATION );
+
+ DALI_TEST_EQUALS( "ActorB: OnStageConnection", MasterCallStack[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnStageConnection", MasterCallStack[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnChildAdd", MasterCallStack[ 2 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorA: OnChildRemove", MasterCallStack[ 3 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( "ActorB: OnChildAdd", MasterCallStack[ 4 ], TEST_LOCATION );
+
+ // Excercise the message passing to Update thread
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ END_TEST;
+}
+
+int UtcDaliCustomActorOnPropertySet(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CustomActor::OnPropertySet()");
+
+ TestCustomActor custom = TestCustomActor::New();
+ DALI_TEST_EQUALS( 0, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+
+ custom.SetDaliProperty("yes") ;
+
+ DALI_TEST_EQUALS( 1, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnPropertySet", custom.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliCustomActorOnSizeSet(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CustomActor::OnSizeSet()");
+
+ TestCustomActor custom = TestCustomActor::New();
+ DALI_TEST_EQUALS( 0, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+
+ custom.SetSize( Vector2( 9.0f, 10.0f ) );
+ DALI_TEST_EQUALS( 1, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnSizeSet", custom.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( 9.0f, custom.GetSize().width, TEST_LOCATION );
+ DALI_TEST_EQUALS( 10.0f, custom.GetSize().height, TEST_LOCATION );
+
+ custom.SetSize( Vector3( 4.0f, 5.0f, 6.0f ) );
+ DALI_TEST_EQUALS( 2, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnSizeSet", custom.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( 4.0f, custom.GetSize().width, TEST_LOCATION );
+ DALI_TEST_EQUALS( 5.0f, custom.GetSize().height, TEST_LOCATION );
+ DALI_TEST_EQUALS( 6.0f, custom.GetSize().depth, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliCustomActorOnSizeAnimation(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CustomActor::OnSizeAnimation()");
+
+ TestCustomActor custom = TestCustomActor::New();
+ DALI_TEST_EQUALS( 0, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+
+ Animation anim = Animation::New( 1.0f );
+ anim.Resize( custom, Vector3( 8.0f, 9.0f, 10.0f ) );
+ DALI_TEST_EQUALS( 1, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnSizeAnimation", custom.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( 8.0f, custom.GetTargetSize().width, TEST_LOCATION );
+ DALI_TEST_EQUALS( 9.0f, custom.GetTargetSize().height, TEST_LOCATION );
+ DALI_TEST_EQUALS( 10.0f, custom.GetTargetSize().depth, TEST_LOCATION );
+
+ anim.Resize( custom, 1.0f, 2.0f );
+ DALI_TEST_EQUALS( 2, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnSizeAnimation", custom.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+ DALI_TEST_EQUALS( 1.0f, custom.GetTargetSize().width, TEST_LOCATION );
+ DALI_TEST_EQUALS( 2.0f, custom.GetTargetSize().height, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliCustomActorOnTouchEvent(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CustomActor::OnTouchEvent()");
+
+ TestCustomActor custom = TestCustomActor::New();
+ DALI_TEST_EQUALS( 0, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+
+ // set size for custom actor
+ custom.SetSize( 100, 100 );
+ // add the custom actor to stage
+ Stage::GetCurrent().Add( custom );
+ custom.ResetCallStack();
+
+ // Render and notify a couple of times
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+
+ // simulate a touch event
+ Dali::TouchPoint point( 0, TouchPoint::Down, 1, 1 );
+ Dali::Integration::TouchEvent event;
+ event.AddPoint( point );
+ application.ProcessEvent( event );
+
+ DALI_TEST_EQUALS( 1, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnTouchEvent", custom.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliCustomActorOnMouseWheelEvent(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CustomActor::OnMouseWheelEvent()");
+
+ TestCustomActor custom = TestCustomActor::New();
+ DALI_TEST_EQUALS( 0, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+
+ // set size for custom actor
+ custom.SetSize( 100, 100 );
+ // add the custom actor to stage
+ Stage::GetCurrent().Add( custom );
+ custom.ResetCallStack();
+
+ // Render and notify a couple of times
+ application.SendNotification();
+ application.Render();
+ application.SendNotification();
+ application.Render();
+
+ // simulate a mouse wheel event
+ Vector2 screenCoordinates( 10.0f, 10.0f );
+ Integration::MouseWheelEvent event(0, 0u, screenCoordinates, 1, 1000u);
+ application.ProcessEvent( event );
+
+ DALI_TEST_EQUALS( 1, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "OnMouseWheelEvent", custom.GetMethodsCalled()[ 0 ], TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliCustomActorFindChildByAlias(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::CustomActor::GetChildByAlias()");
+
+ TestCustomActor custom = TestCustomActor::New();
+ DALI_TEST_EQUALS( 0, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+
+ custom.Add(Actor::New());
+
+ DALI_TEST_EQUALS( 1, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+
+ DALI_TEST_CHECK( !custom.FindChildByAlias("not-found") );
+
+ DALI_TEST_EQUALS( 2, (int)(custom.GetMethodsCalled().size()), TEST_LOCATION );
+ DALI_TEST_EQUALS( "GetChildByAlias", custom.GetMethodsCalled()[ 1 ], TEST_LOCATION );
+
+ DALI_TEST_CHECK( custom.FindChildByAlias("found") );
+ END_TEST;
+}
+
+int UtcDaliCustomActorImplOnPropertySet(void)
+{
+ TestApplication application;
+ CustomActorImpl* impl = new Impl::SimpleTestCustomActor();
+
+ impl->OnPropertySet( 0, 0 );
+
+ DALI_TEST_CHECK( true );
+
+ delete impl;
+ END_TEST;
+}
+
+int UtcDaliCustomActorGetImplementation(void)
+{
+ TestApplication application;
+
+ TestCustomActor custom = TestCustomActor::New();
+ CustomActorImpl& impl = custom.GetImplementation();
+ impl.GetOwner(); // Test
+
+ const TestCustomActor constCustom = TestCustomActor::New();
+ const CustomActorImpl& constImpl = constCustom.GetImplementation();
+ constImpl.GetOwner(); // Test
+
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
--- /dev/null
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_degree_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_degree_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+// Positive test case for constructors
+int UtcDaliDegreeConstructors01(void)
+{
+ TestApplication application;
+
+ // Default constructor, does not initialise the value
+ Degree degree0( 0.0f );
+
+ // Test float assignment operator
+ degree0 = 180.0f;
+ DALI_TEST_EQUALS( float(degree0), 180.0f, 0.001f, TEST_LOCATION );
+
+ // Constructor from float value
+ Degree degree1( 180.0f );
+ DALI_TEST_EQUALS( float(degree1), 180.0f, 0.001f, TEST_LOCATION );
+
+ // Constructor from a Radian
+ Degree degree2( Radian( Math::PI ) );
+ DALI_TEST_EQUALS( float(degree2), 180.0f, 0.001f, TEST_LOCATION );
+
+ // Assignment from Radian
+ Degree degree3( 0.0f );
+ degree3 = Radian( Math::PI );
+ DALI_TEST_EQUALS( float(degree3), 180.0f, 0.001f, TEST_LOCATION );
+ END_TEST;
+}
+
+// Positive test case for comparison
+int UtcDaliDegreeComparison01(void)
+{
+ TestApplication application;
+
+ // Comparison between radians
+ Degree degree0( 90.0f );
+ Degree degree1( 90.0f );
+ Degree degree2( 180.0f );
+
+ DALI_TEST_CHECK( degree0 == degree1 );
+ DALI_TEST_CHECK( degree0 != degree2 );
+
+ // Comparison between radian to degree
+ Degree degree3( 180.0f );
+ Degree degree4( 90.0f );
+ Radian radian0( Math::PI );
+
+ DALI_TEST_CHECK( degree3 == radian0 );
+ DALI_TEST_CHECK( degree4 != radian0 );
+
+ // Comparison with float
+ Degree degree5( 90.0f );
+
+ DALI_TEST_CHECK( degree5 == 90.0f );
+ DALI_TEST_CHECK( degree5 != 180.0f );
+
+ END_TEST;
+}
+
+
+// test case for cast operators
+int UtcDaliDegreeCastOperators01(void)
+{
+ TestApplication application; // Exceptions require TestApplication
+
+ Degree degree0( 180.0f );
+
+ const float& value0( degree0 );
+ DALI_TEST_EQUALS( value0, 180.0f, 0.001f, TEST_LOCATION );
+
+ degree0 = 90.0f;
+ DALI_TEST_EQUALS( value0, 90.0f, 0.001f, TEST_LOCATION );
+
+ float& value1( degree0 );
+ DALI_TEST_EQUALS( value1, 90.0f, 0.001f, TEST_LOCATION );
+
+ value1 = 180.0f;
+ DALI_TEST_EQUALS( float(degree0), 180.0f, 0.001f, TEST_LOCATION );
+ END_TEST;
+}
+
+
+
+int UtcDaliDegreeCastOperatorEquals(void)
+{
+ TestApplication application;
+
+ Degree a(90.0f);
+ Degree b(90.0f);
+ Degree c(180.0f);
+
+ DALI_TEST_EQUALS(a == a, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(a == b, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(a == c, false, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliDegreeCastOperatorNotEquals(void)
+{
+ TestApplication application;
+
+ Degree a(90.0f);
+ Degree b(90.0f);
+ Degree c(180.0f);
+
+ DALI_TEST_EQUALS(a != a, false, TEST_LOCATION);
+ DALI_TEST_EQUALS(a != b, false, TEST_LOCATION);
+ DALI_TEST_EQUALS(a != c, true, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliDegreeCastOperatorLessThan(void)
+{
+ TestApplication application;
+
+ Degree a(45.0f);
+ Degree b(90.0f);
+ Degree c(180.0f);
+ Degree d(360.0f);
+ Degree e(-180.0f);
+
+ DALI_TEST_EQUALS(a < a, false, TEST_LOCATION);
+ DALI_TEST_EQUALS(a < b, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(a < c, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(a < d, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(a < e, false, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(b < a, false, TEST_LOCATION);
+ DALI_TEST_EQUALS(b < b, false, TEST_LOCATION);
+ DALI_TEST_EQUALS(c < b, false, TEST_LOCATION);
+ DALI_TEST_EQUALS(d < b, false, TEST_LOCATION);
+ DALI_TEST_EQUALS(e < b, true, TEST_LOCATION);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/integration-api/events/event.h>
+#include <dali/integration-api/events/gesture-event.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_event_processing_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_event_processing_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+struct InvalidEvent : public Integration::Event
+{
+ InvalidEvent() : Event( Event::Type(-1000) ) {}
+ ~InvalidEvent() {}
+};
+
+struct InvalidGesture : public Integration::GestureEvent
+{
+ InvalidGesture() : GestureEvent( Gesture::Type(-1000), Gesture::Clear ) {}
+ ~InvalidGesture() {}
+};
+
+} // anon namespace
+
+int UtcDaliInvalidEvent(void)
+{
+ TestApplication application;
+
+ try
+ {
+ InvalidEvent event;
+ application.ProcessEvent( event );
+ tet_result( TET_FAIL );
+ }
+ catch ( Dali::DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "false", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliInvalidGesture(void)
+{
+ TestApplication application;
+
+ try
+ {
+ InvalidGesture event;
+ application.ProcessEvent( event );
+ tet_result( TET_FAIL );
+ }
+ catch ( Dali::DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "false", TEST_LOCATION );
+ }
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <errno.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_font_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_font_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+const std::string FAMILY_NAME = "Arial";
+const std::string STYLE = "Bold";
+const unsigned int PIXEL_SIZE = 20;
+const unsigned int POINT_SIZE = 11.f;
+
+static Font CreateFont( PointSize size )
+{
+ // Don't use a font which could be cached otherwise cached values will be used making measure text test to fail.
+ return Font::New(FontParameters("TET-FreeSans", "Book", size));
+}
+
+static Font CreateFont( PixelSize size )
+{
+ // Don't use a font which could be cached otherwise cached values will be used making measure text test to fail.
+ return Font::New(FontParameters("TET-FreeSans", "Book", size));
+}
+
+static Font CreateFont( CapsHeight size )
+{
+ // Don't use a font which could be cached otherwise cached values will be used making measure text test to fail.
+ return Font::New(FontParameters("TET-FreeSans", "Book", size));
+}
+
+} //anon namespace
+
+int UtcDaliFontNew01(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::New() - with specific font family and pixel size");
+
+ Font font; // invoke default constructor (creates an empty handle)
+ font = CreateFont(PixelSize(25.0f)); // This does not call platform abstraction until some text is displayed or measured
+
+ DALI_TEST_CHECK(font);
+
+ tet_infoline("Testing Dali::Font::New() - with default font name and pixel size");
+
+ Font font2 = Font::New(FontParameters("", "", PixelSize(0.0f)));
+
+ DALI_TEST_CHECK(font2);
+
+ Font* ptrFont = new Font;
+ *ptrFont = Font::New(FontParameters("", "", PixelSize(0.0f)));
+ delete ptrFont;
+ END_TEST;
+}
+
+int UtcDaliFontNew02(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::New() - with specific font family and point size");
+
+ Font font = CreateFont(PointSize(8));
+
+ DALI_TEST_CHECK(font);
+
+ tet_infoline("Testing Dali::Font::New() - with default font family and point size");
+
+ Font font2;
+ font2 = Font::New(FontParameters("", "", PointSize(0)));
+
+ DALI_TEST_CHECK(font2);
+ END_TEST;
+}
+
+int UtcDaliFontNew03(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::New() - with specific font family and caps-height");
+
+ Font font = CreateFont(CapsHeight(8));
+
+ DALI_TEST_CHECK(font);
+ DALI_TEST_CHECK(font.GetPixelSize() > 8.0f); // Pixel size should be bigger than requested CapsHeight
+
+ tet_infoline("Testing Dali::Font::New() - with default font family and point size");
+
+ Font font2 = Font::New(FontParameters("", "", CapsHeight(0)));
+
+ DALI_TEST_CHECK(font2);
+ END_TEST;
+}
+
+int UtcDaliFontNew04(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::New() - with wrong font family or font style");
+
+ Font font = Font::New(FontParameters("gfagag", "fgafgafga",PointSize(0)));
+
+ DALI_TEST_CHECK(font);
+ END_TEST;
+}
+
+int UtcDaliFontNew05(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::New() - with pixel size and weight");
+
+ PixelSize pixelSize(PIXEL_SIZE);
+ FontParameters fontParams(FAMILY_NAME, "", pixelSize);
+ Font font = Font::New( fontParams );
+
+ DALI_TEST_CHECK( font );
+ DALI_TEST_CHECK( font.GetName() == FAMILY_NAME );
+ DALI_TEST_CHECK( font.GetStyle().empty() );
+ END_TEST;
+}
+
+int UtcDaliFontNew06(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::New() - with caps height");
+
+ CapsHeight capsHeight(10.f);
+ FontParameters fontParams(FAMILY_NAME, "", capsHeight);
+ Font font = Font::New( fontParams );
+
+ DALI_TEST_CHECK( font );
+ DALI_TEST_CHECK( font.GetName() == FAMILY_NAME );
+ DALI_TEST_CHECK( font.GetStyle().empty() );
+ END_TEST;
+}
+
+
+int UtcDaliFontDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Font::DownCast()");
+
+ Font font = CreateFont(PixelSize(25.0f));
+
+ BaseHandle object(font);
+
+ Font font2 = Font::DownCast(object);
+ DALI_TEST_CHECK(font2);
+
+ Font font3 = DownCast< Font >(object);
+ DALI_TEST_CHECK(font3);
+
+ BaseHandle unInitializedObject;
+ Font font4 = Font::DownCast(unInitializedObject);
+ DALI_TEST_CHECK(!font4);
+
+ Font font5 = DownCast< Font >(unInitializedObject);
+ DALI_TEST_CHECK(!font5);
+ END_TEST;
+}
+
+int UtcDaliFontGetPixelSize(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::GetPixelSize()");
+
+ Font font = CreateFont(PixelSize(32));
+
+ DALI_TEST_CHECK(32 == font.GetPixelSize());
+ END_TEST;
+}
+
+int UtcDaliFontGetPointSize(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::GetPointSize)");
+
+ Font font = CreateFont(PointSize(8.0f));
+
+ DALI_TEST_EQUALS(8.f, font.GetPointSize(), Math::MACHINE_EPSILON_1000, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliFontPointsToPixels(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::PointsToPixels)");
+
+ unsigned int points= Font::PointsToPixels( 12.0f );
+
+ DALI_TEST_CHECK( points == 36 );
+ END_TEST;
+}
+
+int UtcFontMeasureTextWidth(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::MeasureTextWidth()");
+
+ TraceCallStack& trace = application.GetPlatform().GetTrace();
+ trace.Enable(true);
+
+ Font font = CreateFont(PointSize(8));
+
+ float width = font.MeasureTextWidth("test me", 24.0f);
+
+ // No cache
+
+ DALI_TEST_CHECK(trace.FindMethod("ReadMetricsFromCacheFile"));
+ DALI_TEST_CHECK(trace.FindMethod("WriteMetricsToCacheFile"));
+ DALI_TEST_CHECK(trace.FindMethod("GetGlyphData"));
+ trace.Reset();
+
+ DALI_TEST_EQUALS(width, 168.0f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
+ width = font.MeasureTextWidth(Text(std::string("test me")), 24.0f);
+
+ // Should now be cached in memory
+ DALI_TEST_CHECK( ! trace.FindMethod("ReadMetricsFromCacheFile"));
+ DALI_TEST_CHECK( ! trace.FindMethod("WriteMetricsToCacheFile"));
+ DALI_TEST_CHECK( ! trace.FindMethod("GetGlyphData"));
+
+ DALI_TEST_EQUALS(width, 168.0f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
+
+ Text text = Text(std::string("t"))[0];
+ Character c = text[0];
+ width = font.MeasureTextWidth(c, 24.0f);
+ DALI_TEST_EQUALS(width, 24.0f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcFontMeasureTextHeight(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::MeasureTextHeight()");
+
+ TraceCallStack& trace = application.GetPlatform().GetTrace();
+ trace.Enable(true);
+
+ Font font = CreateFont(PointSize(8));
+
+ float height = font.MeasureTextHeight("test me", 48.0f);
+
+ DALI_TEST_CHECK(trace.FindMethod("ReadMetricsFromCacheFile"));
+ DALI_TEST_CHECK(trace.FindMethod("WriteMetricsToCacheFile"));
+ DALI_TEST_CHECK(trace.FindMethod("GetGlyphData"));
+ trace.Reset();
+
+ DALI_TEST_EQUALS(height, 6.8571f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
+
+ height = font.MeasureTextHeight(Text(std::string("test me")), 48.0f);
+
+ DALI_TEST_CHECK( ! trace.FindMethod("ReadMetricsFromCacheFile"));
+ DALI_TEST_CHECK( ! trace.FindMethod("WriteMetricsToCacheFile"));
+ DALI_TEST_CHECK( ! trace.FindMethod("GetGlyphData"));
+
+ DALI_TEST_EQUALS(height, 6.8571f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
+
+ Text text = Text(std::string("t"))[0];
+ Character c = text[0];
+ height = font.MeasureTextHeight(c, 24.0f);
+ DALI_TEST_EQUALS(height, 24.0f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcFontMeasureText(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::MeasureText()");
+
+ TraceCallStack& trace = application.GetPlatform().GetTrace();
+ trace.Enable(true);
+
+ Font font = CreateFont(PointSize(8));
+
+ Vector3 size = font.MeasureText("test me");
+
+ DALI_TEST_CHECK(trace.FindMethod("ReadMetricsFromCacheFile"));
+ DALI_TEST_CHECK(trace.FindMethod("WriteMetricsToCacheFile"));
+ DALI_TEST_CHECK(trace.FindMethod("GetGlyphData"));
+ trace.Reset();
+
+ DALI_TEST_EQUALS(size.width, 53.1076f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
+ DALI_TEST_EQUALS(size.height, 7.5868f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
+
+ size = font.MeasureText(Text(std::string("test me")));
+
+ DALI_TEST_CHECK( ! trace.FindMethod("ReadMetricsFromCacheFile"));
+ DALI_TEST_CHECK( ! trace.FindMethod("WriteMetricsToCacheFile"));
+ DALI_TEST_CHECK( ! trace.FindMethod("GetGlyphData"));
+
+ DALI_TEST_EQUALS(size.width, 53.1076f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
+ DALI_TEST_EQUALS(size.height, 7.5868f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
+
+
+ Text text = Text(std::string("t"))[0];
+ Character c = text[0];
+ size = font.MeasureText(c);
+
+ // character size is square
+ DALI_TEST_EQUALS(size.width, 7.5868f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
+ DALI_TEST_EQUALS(size.height, 7.5868f, Math::MACHINE_EPSILON_1000, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcFontGetFamilyForText(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::GetFamilyForText()");
+
+ std::string latinFont = Font::GetFamilyForText("Hello world");
+ DALI_TEST_CHECK( latinFont.size() != 0 );
+
+ latinFont = Font::GetFamilyForText( Text(std::string("Hello world")) );
+ DALI_TEST_CHECK( latinFont.size() != 0 );
+
+ std::string asianFont = Font::GetFamilyForText("繁體中文");
+ DALI_TEST_CHECK( asianFont.size() != 0 );
+
+ asianFont = Font::GetFamilyForText(Text(std::string("繁體中文")));
+ DALI_TEST_CHECK( asianFont.size() != 0 );
+
+ Text text = Text(std::string("繁體中文"))[0];
+ Character c = text[0];
+
+ asianFont = Font::GetFamilyForText(c );
+ DALI_TEST_CHECK( asianFont.size() != 0 );
+
+ END_TEST;
+}
+
+int UtcFontGetFontLineHeightFromCapsHeight(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::GetLineHeightFromCapsHeight()");
+
+ CapsHeight capsHeight(10);
+ PixelSize pixelSize = Font::GetLineHeightFromCapsHeight("", "", capsHeight);
+ DALI_TEST_CHECK( capsHeight < pixelSize );
+
+ pixelSize = Font::GetLineHeightFromCapsHeight(Font::GetFamilyForText("Hello world"), "", capsHeight);
+ DALI_TEST_CHECK( capsHeight < pixelSize );
+
+ pixelSize = Font::GetLineHeightFromCapsHeight(Font::GetFamilyForText(Text(std::string("Hello world"))), "", capsHeight);
+ DALI_TEST_CHECK( capsHeight < pixelSize );
+ END_TEST;
+}
+
+int UtcFontAllGlyphsSupported(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::AllGlyphsSupported()");
+
+ Font font = Font::New();
+
+ font.AllGlyphsSupported("Hello World\n");
+
+ DALI_TEST_CHECK(application.GetPlatform().WasCalled(TestPlatformAbstraction::AllGlyphsSupportedFunc));
+ application.GetPlatform().ResetTrace();
+
+ font.AllGlyphsSupported(Text(std::string("Hello World\n")));
+
+ DALI_TEST_CHECK(application.GetPlatform().WasCalled(TestPlatformAbstraction::AllGlyphsSupportedFunc));
+
+ application.GetPlatform().ResetTrace();
+
+ Text text = Text(std::string("t"))[0];
+ Character c = text[0];
+ font.AllGlyphsSupported(c);
+
+ DALI_TEST_CHECK(application.GetPlatform().WasCalled(TestPlatformAbstraction::AllGlyphsSupportedFunc));
+ END_TEST;
+}
+
+int UtcFontGetMetrics(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::UtcFontGetMetrics()");
+
+ Font font = Font::New();
+ font.MeasureText(Text(std::string("Hello World"))); // Builds fake metrics in TestPlatformAbstraction.
+
+ float lineHeight = font.GetLineHeight();
+ float ascender = font.GetAscender();
+ float underlineThickness = font.GetUnderlineThickness();
+ float underlinePosition = font.GetUnderlinePosition();
+ Font::Metrics metrics = font.GetMetrics( Text("H")[0] );
+
+ // TODO VCC This TET case fails if there are some metrics cached.
+
+ DALI_TEST_EQUALS( lineHeight, 11.380209f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
+ DALI_TEST_EQUALS( ascender, 10.242188f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
+ DALI_TEST_EQUALS( underlineThickness, 2.276042f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
+ DALI_TEST_EQUALS( underlinePosition, 9.104167f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
+ DALI_TEST_EQUALS( metrics.GetAdvance(), 11.380209f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
+ DALI_TEST_EQUALS( metrics.GetBearing(), 10.242188f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
+ DALI_TEST_EQUALS( metrics.GetWidth(), 11.380209f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcFontIsDefault(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::UtcFontIsDefault()");
+
+ FontParameters fontParams("FreeSans", "", PointSize(10.f));
+ Font font1 = Font::New(fontParams);
+
+ DALI_TEST_CHECK( !font1.IsDefaultSystemFont() );
+ DALI_TEST_CHECK( !font1.IsDefaultSystemSize() );
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::ValidateFontFamilyNameFunc ) );
+ application.GetPlatform().ResetTrace();
+
+ Font font2 = Font::New();
+
+ DALI_TEST_CHECK( !font2.IsDefaultSystemFont() );
+ DALI_TEST_CHECK( font2.IsDefaultSystemSize() );
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::ValidateFontFamilyNameFunc ) );
+ END_TEST;
+}
+
+
+int UtcFontGetInstalledFonts(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::Font::GetInstalledFonts()");
+
+ // the default should only get installed and downloaded fonts
+ std::vector<std::string> fontList;
+
+ fontList = Font::GetInstalledFonts(Font::LIST_SYSTEM_FONTS);
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::ValidateGetFontListFunc ) );
+ DALI_TEST_CHECK( application.GetPlatform().GetLastFontListMode() == Dali::Integration::PlatformAbstraction::LIST_SYSTEM_FONTS );
+
+ fontList = Font::GetInstalledFonts(Font::LIST_ALL_FONTS);
+ DALI_TEST_CHECK( application.GetPlatform().GetLastFontListMode() == Dali::Integration::PlatformAbstraction::LIST_ALL_FONTS );
+
+ fontList = Font::GetInstalledFonts(Font::LIST_APPLICATION_FONTS);
+ DALI_TEST_CHECK( application.GetPlatform().GetLastFontListMode() == Dali::Integration::PlatformAbstraction::LIST_APPLICATION_FONTS );
+
+ END_TEST;
+}
+
+int UtcFontMetricsDefaultConstructor(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing UtcFontMetricsDefaultConstructor");
+
+ Font::Metrics metrics;
+
+ DALI_TEST_EQUALS( metrics.GetAdvance() , 0.f , Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+ DALI_TEST_EQUALS( metrics.GetBearing() , 0.f , Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+ DALI_TEST_EQUALS( metrics.GetWidth() , 0.f , Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+ DALI_TEST_EQUALS( metrics.GetHeight() , 0.f , Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+
+ END_TEST;
+}
+
+int UtcFontMetricsCopyConstructor(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing UtcFontMetricsCopyConstructor");
+
+ Font font = Font::New();
+ font.MeasureText(Text(std::string("Hello World"))); // Builds fake metrics in TestPlatformAbstraction.
+ Font::Metrics metrics = font.GetMetrics( Text("H")[0] );
+ Font::Metrics metrics2( metrics );
+
+ DALI_TEST_EQUALS( metrics.GetAdvance() , metrics2.GetAdvance() , Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+ DALI_TEST_EQUALS( metrics.GetBearing() , metrics2.GetBearing(), Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+ DALI_TEST_EQUALS( metrics.GetWidth() , metrics2.GetWidth() , Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+ DALI_TEST_EQUALS( metrics.GetHeight() , metrics2.GetHeight(), Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+
+ END_TEST;
+}
+
+int UtcFontMetricsAssignmentOperator(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing UtcFontMetricsAssignmentOperator");
+
+ Font font = Font::New();
+ font.MeasureText(Text(std::string("Hello World"))); // Builds fake metrics in TestPlatformAbstraction.
+ Font::Metrics metrics = font.GetMetrics( Text("H")[0] );
+ Font::Metrics metrics2;
+
+ metrics2 = metrics;
+
+ DALI_TEST_EQUALS( metrics.GetAdvance() , metrics2.GetAdvance() , Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+ DALI_TEST_EQUALS( metrics.GetBearing() , metrics2.GetBearing(), Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+ DALI_TEST_EQUALS( metrics.GetWidth() , metrics2.GetWidth() , Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+ DALI_TEST_EQUALS( metrics.GetHeight() , metrics2.GetHeight(), Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <errno.h>
+#include <dali/dali.h>
+
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_font_parameters_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_font_parameters_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+const std::string FAMILY_NAME = "Arial";
+const std::string STYLE = "Bold";
+const unsigned int PIXEL_SIZE = 20;
+const unsigned int POINT_SIZE = 11.f;
+
+} // anon namespace
+
+
+int UtcDaliFontParamsDefaultConstructor(void)
+{
+ TestApplication application;
+ tet_infoline("Testing UtcDaliFontParamsDefaultConstructor");
+ FontParameters params;
+
+ DALI_TEST_CHECK(params.GetFamilyName() == "" );
+ DALI_TEST_CHECK(params.GetStyle() == "" );
+ DALI_TEST_EQUALS( float(params.GetSize()) , 0.f , Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+
+ END_TEST;
+}
+
+int UtcDaliFontParamsPointSizeConstructor(void)
+{
+ TestApplication application;
+ tet_infoline("Testing UtcDaliFontParamsPointSizeConstructor");
+
+ PointSize pointSize( POINT_SIZE );
+ FontParameters params( FAMILY_NAME, STYLE, pointSize);
+
+ DALI_TEST_CHECK(params.GetFamilyName() == FAMILY_NAME );
+ DALI_TEST_CHECK(params.GetStyle() == STYLE );
+ DALI_TEST_EQUALS( float(params.GetSize()), float(pointSize), Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliFontParamsPixelSizeConstructor(void)
+{
+ TestApplication application;
+ tet_infoline("Testing UtcDaliFontParamsPixelSizeConstructor");
+
+ PixelSize pixelSize( PIXEL_SIZE );
+ FontParameters params( FAMILY_NAME, STYLE, pixelSize);
+
+ DALI_TEST_CHECK(params.GetFamilyName() == FAMILY_NAME );
+ DALI_TEST_CHECK(params.GetStyle() == STYLE );
+ DALI_TEST_EQUALS( float(params.GetSize()), Font::PixelsToPoints( PIXEL_SIZE ) , Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+
+ END_TEST;
+}
+
+int UtcDaliFontParamsCopyConstructor(void)
+{
+ TestApplication application;
+ tet_infoline("Testing UtcDaliFontParamsCopyConstructor");
+ PixelSize pixelSize( PIXEL_SIZE );
+ FontParameters params( FAMILY_NAME, STYLE, pixelSize);
+
+
+ FontParameters params2( params );
+ DALI_TEST_CHECK(params2.GetFamilyName() == FAMILY_NAME );
+ DALI_TEST_CHECK(params2.GetStyle() == STYLE );
+ DALI_TEST_EQUALS( float(params2.GetSize()), Font::PixelsToPoints( PIXEL_SIZE ) , Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+
+ END_TEST;
+}
+
+int UtcDaliFontParamsAssignmentOperator(void)
+{
+ TestApplication application;
+ tet_infoline("Testing UtcDaliFontParamsAssignmentOperator");
+ PixelSize pixelSize( PIXEL_SIZE );
+ FontParameters params( FAMILY_NAME, STYLE, pixelSize);
+
+ FontParameters params2;
+ params2 = params;
+ DALI_TEST_CHECK(params2.GetFamilyName() == FAMILY_NAME );
+ DALI_TEST_CHECK(params2.GetStyle() == STYLE );
+ DALI_TEST_EQUALS( float(params2.GetSize()) ,Font::PixelsToPoints( PIXEL_SIZE ) , Math::MACHINE_EPSILON_10000, TEST_LOCATION );
+
+ // for coverage self assignment
+ params2 = params2;
+ DALI_TEST_CHECK(params2.GetFamilyName() == FAMILY_NAME );
+
+ END_TEST;
+}
+
+int UtcDaliFontParamsPointSizeEqualityOperator(void)
+{
+ TestApplication application;
+ tet_infoline("Testing UtcDaliFontParamsPixelSizeConstructor");
+ PointSize pointSize1(1.f);
+ PointSize pointSize2(2.f);
+ DALI_TEST_CHECK( pointSize1 != pointSize2 );
+
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <algorithm>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using std::max;
+using namespace Dali;
+
+void utc_dali_framebuffer_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_framebuffer_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+static const float ROTATION_EPSILON = 0.0001f;
+
+
+int UtcDaliFrameBufferImageNew01(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliFrameBufferImageNew01 - FrameBufferImage::New(unsigned int, unsigned int, Pixel::Format)");
+
+ // invoke default handle constructor
+ FrameBufferImage image;
+ Dali::ImageAttributes attributes;
+ Vector2 stageSize = Stage::GetCurrent().GetSize();
+
+ // initialise handle
+ image = FrameBufferImage::New(); // create framebuffer with the same dimensions as the stage
+ ImageActor actor=ImageActor::New(image);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ attributes = image.GetAttributes();
+
+ DALI_TEST_CHECK( image );
+ DALI_TEST_EQUALS((float)attributes.GetWidth(), stageSize.width, TEST_LOCATION);
+ DALI_TEST_EQUALS((float)attributes.GetHeight(), stageSize.height, TEST_LOCATION);
+
+ image = FrameBufferImage::New(16, 16); // create framebuffer with dimensions of 16x16
+ actor.SetImage(image);
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ attributes = image.GetAttributes();
+
+ DALI_TEST_CHECK( image );
+ DALI_TEST_EQUALS(attributes.GetWidth(), 16u, TEST_LOCATION);
+ DALI_TEST_EQUALS(attributes.GetHeight(), 16u, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliFrameBufferImageDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::FrameBufferImage::DownCast()");
+
+ FrameBufferImage image = FrameBufferImage::New();
+
+ BaseHandle object(image);
+
+ FrameBufferImage image2 = FrameBufferImage::DownCast(object);
+ DALI_TEST_CHECK(image2);
+
+ FrameBufferImage image3 = DownCast< FrameBufferImage >(object);
+ DALI_TEST_CHECK(image3);
+
+ BaseHandle unInitializedObject;
+ FrameBufferImage image4 = FrameBufferImage::DownCast(unInitializedObject);
+ DALI_TEST_CHECK(!image4);
+
+ FrameBufferImage image5 = DownCast< FrameBufferImage >(unInitializedObject);
+ DALI_TEST_CHECK(!image5);
+
+ Image image6 = FrameBufferImage::New();
+ FrameBufferImage image7 = FrameBufferImage::DownCast(image6);
+ DALI_TEST_CHECK(image7);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_gesture_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_gesture_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+// TestGesture Struct (Gesture constructor is protected)
+struct TestGesture : public Gesture
+{
+public:
+ TestGesture(Gesture::Type type, Gesture::State state)
+ : Gesture(type, state) {}
+
+ virtual ~TestGesture() {}
+};
+
+} // anon namespace
+
+int UtcDaliGestureConstructor(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ TestGesture pan(Gesture::Pan, Gesture::Started);
+ DALI_TEST_EQUALS(Gesture::Pan, pan.type, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Started, pan.state, TEST_LOCATION);
+
+ TestGesture pinch(Gesture::Pinch, Gesture::Clear);
+ DALI_TEST_EQUALS(Gesture::Pinch, pinch.type, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Clear, pinch.state, TEST_LOCATION);
+
+ // Test copy constructor
+ TestGesture pan2(pan);
+ DALI_TEST_EQUALS(Gesture::Pan, pan2.type, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Started, pan2.state, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliGestureAssignment(void)
+{
+ // Test Assignment operator
+ TestGesture pan(Gesture::Pan, Gesture::Finished);
+ DALI_TEST_EQUALS(Gesture::Pan, pan.type, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Finished, pan.state, TEST_LOCATION);
+
+ TestGesture test(Gesture::Pinch, Gesture::Started);
+ DALI_TEST_EQUALS(Gesture::Pinch, test.type, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Started, test.state, TEST_LOCATION);
+
+ test = pan;
+ DALI_TEST_EQUALS(Gesture::Pan, test.type, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Finished, test.state, TEST_LOCATION);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <algorithm>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+using namespace std;
+
+void utc_dali_gesture_detector_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_gesture_detector_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+int UtcDaliGestureDetectorConstructorNegative(void)
+{
+ TestApplication application;
+
+ GestureDetector detector;
+
+ Actor actor = Actor::New();
+
+ try
+ {
+ detector.Attach(actor);
+ tet_result(TET_FAIL);
+ }
+ catch (DaliException& exception)
+ {
+ if ( exception.mCondition.find("detector") != string::npos )
+ {
+ tet_result(TET_PASS);
+ }
+ }
+ END_TEST;
+}
+
+int UtcDaliGestureDetectorConstructorPositive(void)
+{
+ TestApplication application;
+
+ // Use pan gesture as GestureDetector cannot be created.
+ GestureDetector detector = PanGestureDetector::New();
+
+ Actor actor = Actor::New();
+
+ try
+ {
+ detector.Attach(actor);
+ tet_result(TET_PASS);
+ }
+ catch (DaliException& exception)
+ {
+ tet_result(TET_FAIL);
+ }
+ END_TEST;
+}
+
+int UtcDaliGestureDetectorDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::GestureDetector::DownCast()");
+
+ GestureDetector detector = PanGestureDetector::New();
+
+ BaseHandle object(detector);
+
+ GestureDetector detector2 = GestureDetector::DownCast(object);
+ DALI_TEST_CHECK(detector2);
+
+ GestureDetector detector3 = DownCast< GestureDetector >(object);
+ DALI_TEST_CHECK(detector3);
+
+ BaseHandle unInitializedObject;
+ GestureDetector detector4 = GestureDetector::DownCast(unInitializedObject);
+ DALI_TEST_CHECK(!detector4);
+
+ GestureDetector detector5 = DownCast< GestureDetector >(unInitializedObject);
+ DALI_TEST_CHECK(!detector5);
+ END_TEST;
+}
+
+int UtcDaliGestureDetectorAttachPositive(void)
+{
+ TestApplication application;
+
+ // Use pan gesture as GestureDetector cannot be created.
+ GestureDetector detector = PanGestureDetector::New();
+
+ Actor actor = Actor::New();
+
+ detector.Attach(actor);
+
+ vector<Actor> actors = detector.GetAttachedActors();
+
+ if (find(actors.begin(), actors.end(), actor) != actors.end())
+ {
+ tet_result(TET_PASS);
+ }
+ else
+ {
+ tet_result(TET_FAIL);
+ }
+
+ // Scoped gesture detector. GestureDetectors connect to a destroy signal of the actor. If the
+ // actor is still alive when the gesture detector is destroyed, then it should disconnect from
+ // this signal. If it does not, then when this function ends, there will be a segmentation fault
+ // thus, a TET case failure.
+ {
+ GestureDetector detector2 = PanGestureDetector::New();
+ detector2.Attach(actor);
+ }
+ END_TEST;
+}
+
+int UtcDaliGestureDetectorAttachNegative(void)
+{
+ TestApplication application;
+
+ // Use pan gesture as GestureDetector cannot be created.
+ GestureDetector detector = PanGestureDetector::New();
+
+ // Do not initialise actor
+ Actor actor;
+
+ try
+ {
+ detector.Attach(actor);
+ tet_result(TET_FAIL);
+ }
+ catch (DaliException& exception)
+ {
+ if ( exception.mCondition.find("actor") != string::npos )
+ {
+ tet_result(TET_PASS);
+ }
+ }
+ END_TEST;
+}
+
+int UtcDaliGestureDetectorDetachPositive(void)
+{
+ TestApplication application;
+
+ // Use pan gesture as GestureDetector cannot be created.
+ GestureDetector detector = PanGestureDetector::New();
+
+ Actor actor = Actor::New();
+ detector.Attach(actor);
+ vector<Actor> actors = detector.GetAttachedActors();
+
+ if (find(actors.begin(), actors.end(), actor) != actors.end())
+ {
+ tet_result(TET_PASS);
+ }
+ else
+ {
+ tet_result(TET_FAIL);
+ }
+
+ // Detach and retrive attached actors again, the vector should be empty.
+ detector.Detach(actor);
+
+ actors = detector.GetAttachedActors();
+ if (actors.empty())
+ {
+ tet_result(TET_PASS);
+ }
+ else
+ {
+ tet_result(TET_FAIL);
+ }
+ END_TEST;
+}
+
+int UtcDaliGestureDetectorDetachNegative01(void)
+{
+ TestApplication application;
+
+ // Use pan gesture as GestureDetector cannot be created.
+ GestureDetector detector = PanGestureDetector::New();
+
+ // Do not initialise actor
+ Actor actor;
+
+ try
+ {
+ detector.Detach(actor);
+ tet_result(TET_FAIL);
+ }
+ catch (DaliException& exception)
+ {
+ if ( exception.mCondition.find("actor") != string::npos )
+ {
+ tet_result(TET_PASS);
+ }
+ }
+ END_TEST;
+}
+
+int UtcDaliGestureDetectorDetachNegative02(void)
+{
+ TestApplication application;
+
+ // Use pan gesture as GestureDetector cannot be created.
+ GestureDetector detector = PanGestureDetector::New();
+
+ Actor actor = Actor::New();
+ detector.Attach(actor);
+
+ // Detach an actor that hasn't been attached. This should not cause an exception, it's a no-op.
+ try
+ {
+ Actor actor2 = Actor::New();
+ detector.Detach(actor2);
+ tet_result(TET_PASS);
+ }
+ catch (DaliException& exception)
+ {
+ tet_result(TET_FAIL);
+ }
+ END_TEST;
+}
+
+int UtcDaliGestureDetectorDetachNegative03(void)
+{
+ TestApplication application;
+ TestGestureManager& gestureManager = application.GetGestureManager();
+
+ // Use pan gesture as GestureDetector cannot be created.
+ GestureDetector detector = PanGestureDetector::New();
+
+ Actor actor = Actor::New();
+ detector.Attach(actor);
+
+ // Detach an actor twice - no exception should happen.
+ try
+ {
+ detector.Detach(actor);
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+
+ gestureManager.Initialize(); // Reset values
+ detector.Detach(actor);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+ }
+ catch (DaliException& exception)
+ {
+ tet_result(TET_FAIL);
+ }
+ END_TEST;
+}
+
+int UtcDaliGestureDetectorDetachAll(void)
+{
+ TestApplication application;
+
+ // Use pan gesture as GestureDetector cannot be created.
+ GestureDetector detector = PanGestureDetector::New();
+
+ const unsigned int actorsToAdd = 5;
+ vector<Actor> myActors;
+
+ for (unsigned int i = 0; i < actorsToAdd; ++i)
+ {
+ Actor actor = Actor::New();
+ myActors.push_back(actor);
+ detector.Attach(actor);
+ }
+
+ vector<Actor> attachedActors = detector.GetAttachedActors();
+ DALI_TEST_EQUALS(actorsToAdd, attachedActors.size(), TEST_LOCATION);
+
+ // Detach and retrieve attached actors again, the vector should be empty.
+ detector.DetachAll();
+
+ attachedActors = detector.GetAttachedActors();
+ DALI_TEST_EQUALS(true, attachedActors.empty(), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliGestureDetectorDetachAllNegative(void)
+{
+ TestApplication application;
+ TestGestureManager& gestureManager = application.GetGestureManager();
+
+ // Use pan gesture as GestureDetector cannot be created.
+ GestureDetector detector = PanGestureDetector::New();
+
+ const unsigned int actorsToAdd = 5;
+ vector<Actor> myActors;
+
+ for (unsigned int i = 0; i < actorsToAdd; ++i)
+ {
+ Actor actor = Actor::New();
+ myActors.push_back(actor);
+ detector.Attach(actor);
+ }
+
+ vector<Actor> attachedActors = detector.GetAttachedActors();
+ DALI_TEST_EQUALS(actorsToAdd, attachedActors.size(), TEST_LOCATION);
+
+ // Detach and retrieve attached actors again, the vector should be empty.
+ detector.DetachAll();
+
+ attachedActors = detector.GetAttachedActors();
+ DALI_TEST_EQUALS(true, attachedActors.empty(), TEST_LOCATION);
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+
+ // Call DetachAll again, there should not be any exception
+ try
+ {
+ gestureManager.Initialize(); // Reset values
+ detector.DetachAll();
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+ }
+ catch (DaliException& exception)
+ {
+ tet_result(TET_FAIL);
+ }
+ END_TEST;
+}
+
+int UtcDaliGestureDetectorGetAttachedActors(void)
+{
+ TestApplication application;
+
+ // Use pan gesture as GestureDetector cannot be created.
+ GestureDetector detector = PanGestureDetector::New();
+
+ // Initially there should not be any actors.
+ DALI_TEST_EQUALS(0u, detector.GetAttachedActors().size(), TEST_LOCATION);
+
+ // Attach one actor
+ Actor actor1 = Actor::New();
+ detector.Attach(actor1);
+ DALI_TEST_EQUALS(1u, detector.GetAttachedActors().size(), TEST_LOCATION);
+
+ // Attach another actor
+ Actor actor2 = Actor::New();
+ detector.Attach(actor2);
+ DALI_TEST_EQUALS(2u, detector.GetAttachedActors().size(), TEST_LOCATION);
+
+ // Attach another five actors
+ vector<Actor> myActors;
+ for (unsigned int i = 0; i < 5; ++i)
+ {
+ Actor actor = Actor::New();
+ myActors.push_back(actor);
+ detector.Attach(actor);
+ }
+ DALI_TEST_EQUALS(7u, detector.GetAttachedActors().size(), TEST_LOCATION);
+
+ // Detach actor2
+ detector.Detach(actor2);
+ DALI_TEST_EQUALS(6u, detector.GetAttachedActors().size(), TEST_LOCATION);
+
+ // Attach actor1 again, count should not increase.
+ detector.Attach(actor1);
+ DALI_TEST_EQUALS(6u, detector.GetAttachedActors().size(), TEST_LOCATION);
+
+ // Detach actor2 again, count should not decrease.
+ detector.Detach(actor2);
+ DALI_TEST_EQUALS(6u, detector.GetAttachedActors().size(), TEST_LOCATION);
+
+ // Detach actor1.
+ detector.Detach(actor1);
+ DALI_TEST_EQUALS(5u, detector.GetAttachedActors().size(), TEST_LOCATION);
+
+ // Create scoped actor, actor should be automatically removed from the detector when it goes out
+ // of scope.
+ {
+ Actor scopedActor = Actor::New();
+ detector.Attach(scopedActor);
+ DALI_TEST_EQUALS(6u, detector.GetAttachedActors().size(), TEST_LOCATION);
+ }
+ DALI_TEST_EQUALS(5u, detector.GetAttachedActors().size(), TEST_LOCATION);
+
+ // Detach all so nothing remains.
+ detector.DetachAll();
+ DALI_TEST_EQUALS(0u, detector.GetAttachedActors().size(), TEST_LOCATION);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include "dali-test-suite-utils/dali-test-suite-utils.h"
+
+using namespace Dali;
+
+void handle_test_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void handle_test_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+Handle ImplicitCopyConstructor(Handle passedByValue)
+{
+ // object + copy + passedByValue, ref count == 3
+ DALI_TEST_CHECK(passedByValue);
+ if (passedByValue)
+ {
+ DALI_TEST_EQUALS(3, passedByValue.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+ }
+
+ return passedByValue;
+}
+
+void CheckTypeName(const Property::Type& type)
+{
+ switch(type)
+ {
+ case Property::NONE:
+ {
+ DALI_TEST_CHECK( "NONE" == std::string(PropertyTypes::GetName( type ) ) );
+ break;
+ }
+ case Property::BOOLEAN:
+ {
+ DALI_TEST_CHECK( "BOOLEAN" == std::string(PropertyTypes::GetName( type ) ) );
+ break;
+ }
+ case Property::FLOAT:
+ {
+ DALI_TEST_CHECK( "FLOAT" == std::string(PropertyTypes::GetName( type ) ) );
+ break;
+ }
+ case Property::INTEGER:
+ {
+ DALI_TEST_CHECK( "INTEGER" == std::string(PropertyTypes::GetName( type ) ) );
+ break;
+ }
+ case Property::UNSIGNED_INTEGER:
+ {
+ DALI_TEST_CHECK( "UNSIGNED_INTEGER" == std::string(PropertyTypes::GetName( type ) ) );
+ break;
+ }
+ case Property::VECTOR2:
+ {
+ DALI_TEST_CHECK( "VECTOR2" == std::string(PropertyTypes::GetName( type ) ) );
+ break;
+ }
+ case Property::VECTOR3:
+ {
+ DALI_TEST_CHECK( "VECTOR3" == std::string(PropertyTypes::GetName( type ) ) );
+ break;
+ }
+ case Property::VECTOR4:
+ {
+ DALI_TEST_CHECK( "VECTOR4" == std::string(PropertyTypes::GetName( type ) ) );
+ break;
+ }
+ case Property::MATRIX3:
+ {
+ DALI_TEST_CHECK( "MATRIX3" == std::string(PropertyTypes::GetName( type ) ) );
+ break;
+ }
+ case Property::MATRIX:
+ {
+ DALI_TEST_CHECK( "MATRIX" == std::string(PropertyTypes::GetName( type ) ) );
+ break;
+ }
+ case Property::RECTANGLE:
+ {
+ DALI_TEST_CHECK( "RECTANGLE" == std::string(PropertyTypes::GetName( type ) ) );
+ break;
+ }
+ case Property::ROTATION:
+ {
+ DALI_TEST_CHECK( "ROTATION" == std::string(PropertyTypes::GetName( type ) ) );
+ break;
+ }
+ case Property::STRING:
+ {
+ DALI_TEST_CHECK( "STRING" == std::string(PropertyTypes::GetName( type ) ) );
+ break;
+ }
+ case Property::ARRAY:
+ {
+ DALI_TEST_CHECK( "ARRAY" == std::string(PropertyTypes::GetName( type ) ) );
+ break;
+ }
+ case Property::MAP:
+ {
+ DALI_TEST_CHECK( "MAP" == std::string(PropertyTypes::GetName( type ) ) );
+ break;
+ }
+ case Property::TYPE_COUNT:
+ {
+ DALI_TEST_CHECK( "NONE" == std::string(PropertyTypes::GetName( type ) ) );
+ break;
+ }
+ } // switch(type)
+
+} // CheckTypeName
+
+} // anon namespace
+
+
+int UtcDaliHandleConstructorVoid(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Handle::Handle()");
+
+ Handle object;
+
+ DALI_TEST_CHECK(!object);
+ END_TEST;
+}
+
+int UtcDaliHandleCopyConstructor(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Handle::Handle(const Handle&)");
+
+ // Initialize an object, ref count == 1
+ Handle object = Actor::New();
+
+ DALI_TEST_EQUALS(1, object.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+
+ // Copy the object, ref count == 2
+ Handle copy(object);
+ DALI_TEST_CHECK(copy);
+ if (copy)
+ {
+ DALI_TEST_EQUALS(2, copy.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+ }
+
+ {
+ // Pass by value, and return another copy, ref count == 3
+ Handle anotherCopy = ImplicitCopyConstructor(copy);
+
+ DALI_TEST_CHECK(anotherCopy);
+ if (anotherCopy)
+ {
+ DALI_TEST_EQUALS(3, anotherCopy.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+ }
+ }
+
+ // anotherCopy out of scope, ref count == 2
+ DALI_TEST_CHECK(copy);
+ if (copy)
+ {
+ DALI_TEST_EQUALS(2, copy.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliHandleAssignmentOperator(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Handle::operator=");
+
+ Handle object = Actor::New();
+
+ DALI_TEST_CHECK(object);
+ DALI_TEST_EQUALS(1, object.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+
+ Handle copy;
+ DALI_TEST_CHECK(!copy);
+
+ copy = object;
+ DALI_TEST_CHECK(copy);
+ DALI_TEST_EQUALS(2, copy.GetBaseObject().ReferenceCount(), TEST_LOCATION);
+ DALI_TEST_CHECK(&(copy.GetBaseObject()) == &(object.GetBaseObject()));
+ END_TEST;
+}
+
+int UtcDaliHandleSupports(void)
+{
+ tet_infoline("Positive Test Dali::Handle::Supports()");
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ DALI_TEST_CHECK( true == actor.Supports( Handle::DYNAMIC_PROPERTIES ) );
+ END_TEST;
+}
+
+int UtcDaliHandleGetPropertyCount(void)
+{
+ tet_infoline("Positive Test Dali::Handle::GetPropertyCount()");
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ int defaultPropertyCount( actor.GetPropertyCount() );
+
+ // Register a dynamic property
+ actor.RegisterProperty( "test-property", float(123.0f) );
+ DALI_TEST_CHECK( (defaultPropertyCount + 1u) == actor.GetPropertyCount() );
+ END_TEST;
+}
+
+int UtcDaliHandleGetPropertyName(void)
+{
+ tet_infoline("Positive Test Dali::Handle::GetPropertyName()");
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ DALI_TEST_CHECK( "parent-origin" == actor.GetPropertyName( Actor::PARENT_ORIGIN ) );
+
+ // Register a dynamic property
+ std::string name("this-name-should-match");
+ Property::Index index = actor.RegisterProperty( name, float(123.0f) );
+ DALI_TEST_CHECK( name == actor.GetPropertyName( index ) );
+
+ END_TEST;
+}
+
+int UtcDaliHandleGetPropertyIndex(void)
+{
+ tet_infoline("Positive Test Dali::Handle::GetPropertyIndex()");
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ DALI_TEST_CHECK( Actor::PARENT_ORIGIN == actor.GetPropertyIndex("parent-origin") );
+
+ // Register a dynamic property
+ std::string name("this-name-should-match");
+ Property::Index index = actor.RegisterProperty( name, float(123.0f) );
+ DALI_TEST_CHECK( index == actor.GetPropertyIndex( name ) );
+ END_TEST;
+}
+
+int UtcDaliHandleIsPropertyWritable(void)
+{
+ tet_infoline("Positive Test Dali::Handle::IsPropertyWritable()");
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Actor properties which are writable:
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::PARENT_ORIGIN ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::PARENT_ORIGIN_X ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::PARENT_ORIGIN_Y ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::PARENT_ORIGIN_Z ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::ANCHOR_POINT ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::ANCHOR_POINT_X ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::ANCHOR_POINT_Y ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::ANCHOR_POINT_Z ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::SIZE ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::SIZE_WIDTH ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::SIZE_HEIGHT ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::SIZE_DEPTH ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::POSITION ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::POSITION_X ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::POSITION_Y ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::POSITION_Z ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::ROTATION ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::SCALE ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::SCALE_X ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::SCALE_Y ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::SCALE_Z ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::VISIBLE ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::COLOR ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::COLOR_RED ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::COLOR_GREEN ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::COLOR_BLUE ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyWritable( Actor::COLOR_ALPHA ) );
+
+ // World-properties are not writable:
+ DALI_TEST_CHECK( false == actor.IsPropertyWritable( Actor::WORLD_POSITION ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyWritable( Actor::WORLD_ROTATION ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyWritable( Actor::WORLD_SCALE ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyWritable( Actor::WORLD_COLOR ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyWritable( Actor::WORLD_POSITION_X ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyWritable( Actor::WORLD_POSITION_Y ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyWritable( Actor::WORLD_POSITION_Z ) );
+
+ END_TEST;
+}
+
+int UtcDaliHandleIsPropertyAnimatable(void)
+{
+ tet_infoline("Positive Test Dali::Handle::IsPropertyAnimatable()");
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Actor properties which are animatable:
+ DALI_TEST_CHECK( false == actor.IsPropertyAnimatable( Actor::PARENT_ORIGIN ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyAnimatable( Actor::PARENT_ORIGIN_X ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyAnimatable( Actor::PARENT_ORIGIN_Y ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyAnimatable( Actor::PARENT_ORIGIN_Z ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyAnimatable( Actor::ANCHOR_POINT ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyAnimatable( Actor::ANCHOR_POINT_X ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyAnimatable( Actor::ANCHOR_POINT_Y ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyAnimatable( Actor::ANCHOR_POINT_Z ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::SIZE ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::SIZE_WIDTH ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::SIZE_HEIGHT ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::SIZE_DEPTH ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::POSITION ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::POSITION_X ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::POSITION_Y ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::POSITION_Z ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::ROTATION ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::SCALE ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::SCALE_X ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::SCALE_Y ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::SCALE_Z ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::VISIBLE ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::COLOR ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::COLOR_RED ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::COLOR_GREEN ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::COLOR_BLUE ) );
+ DALI_TEST_CHECK( true == actor.IsPropertyAnimatable( Actor::COLOR_ALPHA ) );
+
+ // World-properties can not be animated
+ DALI_TEST_CHECK( false == actor.IsPropertyAnimatable( Actor::WORLD_POSITION ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyAnimatable( Actor::WORLD_ROTATION ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyAnimatable( Actor::WORLD_SCALE ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyAnimatable( Actor::WORLD_COLOR ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyAnimatable( Actor::WORLD_POSITION_X ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyAnimatable( Actor::WORLD_POSITION_Y ) );
+ DALI_TEST_CHECK( false == actor.IsPropertyAnimatable( Actor::WORLD_POSITION_Z ) );
+
+ END_TEST;
+}
+
+int UtcDaliHandleGetPropertyType(void)
+{
+ tet_infoline("Positive Test Dali::Handle::GetPropertyType()");
+ TestApplication application;
+ unsigned int unsingedIntTest = 33;
+
+ Actor actor = Actor::New();
+ DALI_TEST_CHECK( Property::VECTOR3 == actor.GetPropertyType( Actor::PARENT_ORIGIN ) );
+ DALI_TEST_CHECK( Property::VECTOR3 == actor.GetPropertyType( Actor::ANCHOR_POINT ) );
+ DALI_TEST_CHECK( Property::VECTOR3 == actor.GetPropertyType( Actor::SIZE ) );
+ DALI_TEST_CHECK( Property::VECTOR3 == actor.GetPropertyType( Actor::POSITION ) );
+ DALI_TEST_CHECK( Property::ROTATION == actor.GetPropertyType( Actor::ROTATION ) );
+ DALI_TEST_CHECK( Property::VECTOR3 == actor.GetPropertyType( Actor::SCALE ) );
+ DALI_TEST_CHECK( Property::BOOLEAN == actor.GetPropertyType( Actor::VISIBLE ) );
+ DALI_TEST_CHECK( Property::VECTOR4 == actor.GetPropertyType( Actor::COLOR ) );
+
+ // Register some dynamic properties
+ Property::Index boolIndex = actor.RegisterProperty( "bool-property", bool(true) );
+ Property::Index floatIndex = actor.RegisterProperty( "float-property", float(123.0f) );
+ Property::Index vector2Index = actor.RegisterProperty( "vector2-property", Vector2(1.0f, 2.0f) );
+ Property::Index vector3Index = actor.RegisterProperty( "vector3-property", Vector3(1.0f, 2.0f, 3.0f) );
+ Property::Index vector4Index = actor.RegisterProperty( "vector4-property", Vector4(1.0f, 2.0f, 3.0f, 4.0f) );
+ Property::Index rotationIndex = actor.RegisterProperty( "rotation-property", AngleAxis(Degree(180.0f), Vector3::YAXIS) );
+
+ DALI_TEST_CHECK( Property::BOOLEAN == actor.GetPropertyType( boolIndex ) );
+ DALI_TEST_CHECK( Property::FLOAT == actor.GetPropertyType( floatIndex ) );
+ DALI_TEST_CHECK( Property::VECTOR2 == actor.GetPropertyType( vector2Index ) );
+ DALI_TEST_CHECK( Property::VECTOR3 == actor.GetPropertyType( vector3Index ) );
+ DALI_TEST_CHECK( Property::VECTOR4 == actor.GetPropertyType( vector4Index ) );
+ DALI_TEST_CHECK( Property::ROTATION == actor.GetPropertyType( rotationIndex ) );
+
+ // Non animatable properties
+ Property::Index nonAnimStringIndex = actor.RegisterProperty( "man-from-delmonte", std::string("yes"), Property::READ_WRITE);
+ Property::Index nonAnimV2Index = actor.RegisterProperty( "v2", Vector2(1.f, 2.f), Property::READ_WRITE);
+ Property::Index nonAnimV3Index = actor.RegisterProperty( "v3", Vector3(1.f, 2.f, 3.f), Property::READ_WRITE);
+ Property::Index nonAnimV4Index = actor.RegisterProperty( "v4", Vector4(1.f, 2.f, 3.f, 4.f), Property::READ_WRITE);
+ Property::Index nonAnimBooleanIndex = actor.RegisterProperty( "bool", true, Property::READ_WRITE);
+ Property::Index nonAnimFloatIndex = actor.RegisterProperty( "float", 0.f, Property::READ_WRITE);
+ Property::Index nonAnimUnsignedIntIndex = actor.RegisterProperty( "unsinged-int", unsingedIntTest, Property::READ_WRITE);
+
+ DALI_TEST_CHECK( nonAnimStringIndex != Property::INVALID_INDEX );
+ DALI_TEST_CHECK( nonAnimV2Index != Property::INVALID_INDEX );
+ DALI_TEST_CHECK( nonAnimV3Index != Property::INVALID_INDEX );
+ DALI_TEST_CHECK( nonAnimV4Index != Property::INVALID_INDEX );
+ DALI_TEST_CHECK( nonAnimBooleanIndex != Property::INVALID_INDEX );
+ DALI_TEST_CHECK( nonAnimFloatIndex != Property::INVALID_INDEX );
+ DALI_TEST_CHECK( nonAnimUnsignedIntIndex != Property::INVALID_INDEX );
+
+ DALI_TEST_CHECK( Property::STRING == actor.GetPropertyType( nonAnimStringIndex ) );
+ DALI_TEST_CHECK( Property::VECTOR2 == actor.GetPropertyType( nonAnimV2Index ) );
+ DALI_TEST_CHECK( Property::VECTOR3 == actor.GetPropertyType( nonAnimV3Index ) );
+ DALI_TEST_CHECK( Property::VECTOR4 == actor.GetPropertyType( nonAnimV4Index ) );
+ DALI_TEST_CHECK( Property::BOOLEAN == actor.GetPropertyType( nonAnimBooleanIndex ) );
+ DALI_TEST_CHECK( Property::FLOAT == actor.GetPropertyType( nonAnimFloatIndex ) );
+ DALI_TEST_CHECK( Property::UNSIGNED_INTEGER == actor.GetPropertyType( nonAnimUnsignedIntIndex ) );
+
+ DALI_TEST_CHECK( !actor.IsPropertyAnimatable( nonAnimStringIndex ) );
+ DALI_TEST_CHECK( !actor.IsPropertyAnimatable( nonAnimV2Index ) );
+ DALI_TEST_CHECK( !actor.IsPropertyAnimatable( nonAnimV3Index ) );
+ DALI_TEST_CHECK( !actor.IsPropertyAnimatable( nonAnimV4Index ) );
+ DALI_TEST_CHECK( !actor.IsPropertyAnimatable( nonAnimBooleanIndex ) );
+ DALI_TEST_CHECK( !actor.IsPropertyAnimatable( nonAnimFloatIndex ) );
+ DALI_TEST_CHECK( !actor.IsPropertyAnimatable( nonAnimUnsignedIntIndex ) );
+
+ DALI_TEST_EQUALS( "yes" , actor.GetProperty( nonAnimStringIndex ).Get<std::string>(), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2(1.f, 2.f) , actor.GetProperty( nonAnimV2Index ).Get<Vector2>(), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector3(1.f, 2.f, 3.f) , actor.GetProperty( nonAnimV3Index ).Get<Vector3>(), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector4(1.f, 2.f, 3.f, 4.f) , actor.GetProperty( nonAnimV4Index ).Get<Vector4>(), TEST_LOCATION );
+ DALI_TEST_EQUALS( true, actor.GetProperty( nonAnimBooleanIndex ).Get<bool>(), TEST_LOCATION );
+ DALI_TEST_EQUALS( 0.f, actor.GetProperty( nonAnimFloatIndex ).Get<float>(), TEST_LOCATION );
+ DALI_TEST_EQUALS( unsingedIntTest, actor.GetProperty( nonAnimUnsignedIntIndex ).Get<unsigned int>(), TEST_LOCATION );
+
+ END_TEST;
+}
+
+int UtcDaliHandleNonAnimtableProperties(void)
+{
+ tet_infoline("Test Non Animatable Properties");
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ Property::Index nonAnimStringIndex = actor.RegisterProperty( "man-from-delmonte", std::string("no"), Property::READ_WRITE);
+
+ //// modify writable?
+ try
+ {
+ actor.SetProperty( nonAnimStringIndex, Property::Value("yes") );
+ }
+ catch (Dali::DaliException& e)
+ {
+ DALI_TEST_CHECK(!"exception");
+ }
+
+ DALI_TEST_CHECK( "yes" == actor.GetProperty( nonAnimStringIndex ).Get<std::string>() );
+
+ //// cannot modify read only?
+ Property::Index readonly = actor.RegisterProperty( "float", 0.f, Property::READ_ONLY);
+
+ DALI_TEST_CHECK(!actor.IsPropertyAnimatable(readonly));
+ DALI_TEST_CHECK(!actor.IsPropertyWritable(readonly));
+
+ bool exception = false;
+ try
+ {
+ actor.SetProperty( readonly, Property::Value(1.f) );
+ }
+ catch (Dali::DaliException& e)
+ {
+ exception = true;
+ }
+
+ DALI_TEST_CHECK(exception);
+
+ DALI_TEST_EQUALS( 0.f, actor.GetProperty( readonly ).Get<float>(), TEST_LOCATION );
+
+ /// animatable can be set
+ Property::Index write_anim = actor.RegisterProperty( "write_float", 0.f, Property::ANIMATABLE);
+
+ DALI_TEST_CHECK(actor.IsPropertyAnimatable(write_anim));
+ DALI_TEST_CHECK(actor.IsPropertyWritable(write_anim));
+
+ exception = false;
+ try
+ {
+ actor.SetProperty( write_anim, Property::Value(1.f) );
+ }
+ catch (Dali::DaliException& e)
+ {
+ exception = true;
+ }
+
+ DALI_TEST_CHECK(!exception);
+
+ //// animate a non animatable property is a noop?
+ float durationSeconds(2.0f);
+ Animation animation = Animation::New(durationSeconds);
+ bool relativeValue(true);
+
+ exception = false;
+
+ try
+ {
+ animation.AnimateBy(Property(actor, nonAnimStringIndex), relativeValue, AlphaFunctions::EaseIn);
+ animation.Play();
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(durationSeconds*0100.0f)/* some progress */);
+ }
+ catch (Dali::DaliException& e)
+ {
+ exception = true;
+ }
+
+ DALI_TEST_CHECK(!exception);
+ DALI_TEST_EQUALS( "yes", actor.GetProperty( nonAnimStringIndex ).Get<std::string>(), TEST_LOCATION );
+
+ END_TEST;
+}
+
+int UtcDaliHandleNonAnimtableCompositeProperties(void)
+{
+ tet_infoline("Test Non Animatable Composite Properties");
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ Property::Value value(Property::ARRAY);
+ Property::Array anArray;
+ DALI_TEST_CHECK( Property::Value(anArray).GetType() == Property::ARRAY ); // 2nd constructor
+
+ value.AppendItem( Property::Value( 0.f ) );
+ value.AppendItem( "a string" );
+ value.SetItem(0, Property::Value( 5.f )); // exercise SetItem
+
+ int index = value.AppendItem( Vector3(1,2,3) );
+
+ DALI_TEST_EQUALS( 2, index, TEST_LOCATION);
+ DALI_TEST_EQUALS( 3, value.GetSize(), TEST_LOCATION);
+
+ Property::Index propertyIndex = actor.RegisterProperty( "composite", value, Property::READ_WRITE);
+
+ Property::Value out = actor.GetProperty( propertyIndex );
+
+ DALI_TEST_CHECK( Property::FLOAT == out.GetItem(0).GetType());
+ DALI_TEST_CHECK( Property::STRING == out.GetItem(1).GetType());
+ DALI_TEST_CHECK( Property::VECTOR3 == out.GetItem(2).GetType());
+
+ DALI_TEST_EQUALS( 5.f, out.GetItem(0).Get<float>(), TEST_LOCATION);
+ DALI_TEST_EQUALS( "a string", out.GetItem(1).Get<std::string>(), TEST_LOCATION);
+ DALI_TEST_EQUALS( Vector3(1,2,3), out.GetItem(2).Get<Vector3>(), TEST_LOCATION);
+
+ // Property Maps
+ Property::Value valueMap(Property::MAP);
+ Property::Map aKindofMap;
+ DALI_TEST_CHECK( Property::Value(aKindofMap).GetType() == Property::MAP ); // 2nd constructor
+
+ valueMap.SetValue("key", 5.f);
+ valueMap.SetValue("2key", "a string");
+
+ DALI_TEST_EQUALS( true, valueMap.HasKey("key"), TEST_LOCATION);
+ DALI_TEST_EQUALS( "key", valueMap.GetKey(0), TEST_LOCATION);
+
+ DALI_TEST_EQUALS( true, valueMap.HasKey("2key"), TEST_LOCATION);
+ DALI_TEST_EQUALS( "2key", valueMap.GetKey(1), TEST_LOCATION);
+
+ DALI_TEST_EQUALS( 5.f, valueMap.GetValue("key").Get<float>(), TEST_LOCATION);
+ DALI_TEST_EQUALS( "a string", valueMap.GetValue("2key").Get<std::string>(), TEST_LOCATION);
+
+ valueMap.SetItem(0, Property::Value("a string"));
+ valueMap.SetItem(1, Property::Value(5.f));
+
+ DALI_TEST_EQUALS( 5.f, valueMap.GetValue("2key").Get<float>(), TEST_LOCATION);
+ DALI_TEST_EQUALS( "a string", valueMap.GetValue("key").Get<std::string>(), TEST_LOCATION);
+
+ // ordered map
+ valueMap = Property::Value(Property::MAP);
+
+ valueMap.SetValue("key", 5.f);
+ valueMap.SetValue("2key", "a string");
+
+ DALI_TEST_EQUALS( 5.f, valueMap.GetItem(0).Get<float>(), TEST_LOCATION);
+ DALI_TEST_EQUALS( "a string", valueMap.GetItem(1).Get<std::string>(), TEST_LOCATION);
+
+ DALI_TEST_EQUALS( 2, valueMap.GetSize(), TEST_LOCATION);
+
+ // composite types not animatable
+ bool exception = false;
+ try
+ {
+ /* Property::Index mapPropertyIndex = */ actor.RegisterProperty( "compositemap", value, Property::ANIMATABLE);
+ }
+ catch (Dali::DaliException& e)
+ {
+ exception = true;
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ }
+
+ DALI_TEST_EQUALS(exception, true, TEST_LOCATION);
+
+ // Map of maps
+ Property::Value mapOfMaps(Property::MAP);
+
+ mapOfMaps.SetValue( "key", Property::Value(Property::MAP) );
+ mapOfMaps.SetValue( "2key", "a string" );
+
+ DALI_TEST_EQUALS( "a string", mapOfMaps.GetValue("2key").Get<std::string>(), TEST_LOCATION);
+
+ mapOfMaps.GetValue("key").SetValue("subkey", 5.f);
+
+ DALI_TEST_EQUALS( true, mapOfMaps.GetValue("key").HasKey("subkey"), TEST_LOCATION);
+ DALI_TEST_EQUALS( 5.f, mapOfMaps.GetValue("key").GetValue("subkey").Get<float>(), TEST_LOCATION);
+
+ // list of maps
+ Property::Value listOfMaps(Property::ARRAY);
+
+ listOfMaps.AppendItem( Property::Value(Property::MAP) );
+ listOfMaps.AppendItem( Property::Value(Property::MAP) );
+
+ listOfMaps.GetItem(0).SetValue("key", 5.f);
+ listOfMaps.GetItem(1).SetValue("key",10.f);
+
+ DALI_TEST_EQUALS( 5.f, listOfMaps.GetItem(0).GetValue("key").Get<float>(), TEST_LOCATION );
+ DALI_TEST_EQUALS( 10.f, listOfMaps.GetItem(1).GetValue("key").Get<float>(), TEST_LOCATION );
+
+ END_TEST;
+}
+
+int UtcDaliHandleSetProperty01(void)
+{
+ tet_infoline("Positive Test Dali::Handle::SetProperty()");
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ DALI_TEST_CHECK( ParentOrigin::TOP_LEFT == actor.GetProperty( Actor::PARENT_ORIGIN ).Get<Vector3>() );
+
+ actor.SetProperty( Actor::PARENT_ORIGIN, ParentOrigin::CENTER );
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_CHECK( ParentOrigin::CENTER == actor.GetProperty( Actor::PARENT_ORIGIN ).Get<Vector3>() );
+ END_TEST;
+}
+
+int UtcDaliHandleSetProperty02(void)
+{
+ tet_infoline("Positive Test Dali::Handle::SetProperty()");
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ DALI_TEST_CHECK( !actor.IsPropertyWritable( Actor::WORLD_POSITION ) );
+
+ try
+ {
+ // World position is not writable
+ actor.SetProperty( Actor::WORLD_POSITION, Vector3(1,2,3) );
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "IsDefaultPropertyWritable(index) && \"Property is read-only\"", TEST_LOCATION);
+ }
+
+ END_TEST;
+}
+
+int UtcDaliHandleRegisterProperty(void)
+{
+ tet_infoline("Positive Test Dali::Handle::RegisterProperty()");
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ DALI_TEST_CHECK( ParentOrigin::TOP_LEFT == actor.GetProperty( Actor::PARENT_ORIGIN ).Get<Vector3>() );
+
+ END_TEST;
+}
+
+int UtcDaliHandleGetProperty(void)
+{
+ tet_infoline("Positive Test Dali::Handle::GetProperty()");
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ DALI_TEST_CHECK( ParentOrigin::TOP_LEFT == actor.GetProperty( Actor::PARENT_ORIGIN ).Get<Vector3>() );
+ DALI_TEST_CHECK( AnchorPoint::CENTER == actor.GetProperty( Actor::ANCHOR_POINT ).Get<Vector3>() );
+ DALI_TEST_CHECK( Vector3::ZERO == actor.GetProperty( Actor::SIZE ).Get<Vector3>() );
+ DALI_TEST_CHECK( Vector3::ZERO == actor.GetProperty( Actor::POSITION ).Get<Vector3>() );
+ DALI_TEST_CHECK( Vector3::ONE == actor.GetProperty( Actor::SCALE ).Get<Vector3>() );
+ DALI_TEST_CHECK( true == actor.GetProperty( Actor::VISIBLE ).Get<bool>() );
+ DALI_TEST_CHECK( Color::WHITE == actor.GetProperty( Actor::COLOR ).Get<Vector4>() );
+ END_TEST;
+}
+
+int UtcDaliHandleDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Handle::DownCast()");
+
+ Actor actor = Actor::New();
+
+ BaseHandle baseHandle = actor;
+
+ Handle handle = Handle::DownCast(baseHandle);
+
+ DALI_TEST_CHECK( handle );
+
+ baseHandle = BaseHandle();
+
+ handle = Handle::DownCast(baseHandle);
+
+ DALI_TEST_CHECK( !handle );
+
+ END_TEST;
+}
+
+int UtcDaliHandleCreateProperty(void)
+{
+ TestApplication application;
+ tet_infoline("Testing PropertyTypes::GetName()");
+
+ Property::Type type = Property::NONE;
+ CheckTypeName(type);
+ // Value(Value&) ctor and Value(Type&) ctor
+ DALI_TEST_CHECK( Property::Value(Property::Value(type)).GetType() == type );
+ DALI_TEST_CHECK( Property::NONE == type );
+
+ // PropertyTypes
+ type = Property::BOOLEAN;
+ CheckTypeName(type);
+ DALI_TEST_CHECK( Property::Value(Property::Value(type)).GetType() == type );
+ DALI_TEST_CHECK( PropertyTypes::Get<bool>() == type );
+
+ type = Property::FLOAT;
+ CheckTypeName(type);
+ DALI_TEST_CHECK( Property::Value(Property::Value(type)).GetType() == type );
+ DALI_TEST_CHECK( PropertyTypes::Get<float>() == type );
+
+ type = Property::INTEGER;
+ CheckTypeName(type);
+ DALI_TEST_CHECK( Property::Value(Property::Value(type)).GetType() == type );
+ DALI_TEST_CHECK( PropertyTypes::Get<int>() == type );
+
+ type = Property::UNSIGNED_INTEGER;
+ CheckTypeName(type);
+ DALI_TEST_CHECK( Property::Value(Property::Value(type)).GetType() == type );
+ DALI_TEST_CHECK( PropertyTypes::Get<unsigned int>() == type );
+
+ type = Property::VECTOR2;
+ CheckTypeName(type);
+ DALI_TEST_CHECK( Property::Value(Property::Value(type)).GetType() == type );
+ DALI_TEST_CHECK( PropertyTypes::Get<Vector2>() == type );
+
+ type = Property::VECTOR3;
+ CheckTypeName(type);
+ DALI_TEST_CHECK( Property::Value(Property::Value(type)).GetType() == type );
+ DALI_TEST_CHECK( PropertyTypes::Get<Vector3>() == type );
+
+ type = Property::VECTOR4;
+ CheckTypeName(type);
+ DALI_TEST_CHECK( Property::Value(Property::Value(type)).GetType() == type );
+ DALI_TEST_CHECK( PropertyTypes::Get<Vector4>() == type );
+
+ type = Property::MATRIX3;
+ CheckTypeName(type);
+ DALI_TEST_CHECK( Property::Value(Property::Value(type)).GetType() == type );
+ DALI_TEST_CHECK( PropertyTypes::Get<Matrix3>() == type );
+
+ type = Property::MATRIX;
+ CheckTypeName(type);
+ DALI_TEST_CHECK( Property::Value(Property::Value(type)).GetType() == type );
+ DALI_TEST_CHECK( PropertyTypes::Get<Matrix>() == type );
+
+ typedef Dali::Rect<int> Rectangle;
+ type = Property::RECTANGLE;
+ CheckTypeName(type);
+ DALI_TEST_CHECK( Property::Value(Property::Value(type)).GetType() == type );
+ DALI_TEST_CHECK( PropertyTypes::Get<Rectangle>() == type );
+
+ type = Property::ROTATION;
+ CheckTypeName(type);
+ DALI_TEST_CHECK( Property::Value(Property::Value(type)).GetType() == type );
+ DALI_TEST_CHECK( PropertyTypes::Get<Quaternion>() == type );
+
+ type = Property::ROTATION;
+ CheckTypeName(type);
+ DALI_TEST_CHECK( Property::Value(Property::Value(type)).GetType() == type );
+ DALI_TEST_CHECK( PropertyTypes::Get<AngleAxis>() == type );
+
+ type = Property::STRING;
+ CheckTypeName(type);
+ DALI_TEST_CHECK( Property::Value(Property::Value(type)).GetType() == type );
+ DALI_TEST_CHECK( PropertyTypes::Get<std::string>() == type );
+
+ type = Property::ARRAY;
+ CheckTypeName(type);
+ DALI_TEST_CHECK( Property::Value(Property::Value(type)).GetType() == type );
+ DALI_TEST_CHECK( PropertyTypes::Get<Property::Array>() == type );
+
+ type = Property::MAP;
+ CheckTypeName(type);
+ DALI_TEST_CHECK( Property::Value(Property::Value(type)).GetType() == type );
+ DALI_TEST_CHECK( PropertyTypes::Get<Property::Map>() == type );
+ END_TEST;
+}
+
+int UtcDaliHandleGetPropertyGet(void)
+{
+ TestApplication application;
+ tet_infoline("Testing PropertyTypes::GetName()");
+
+ Property::Value value;
+
+ bool b = false;
+ value = Property::Value(true);
+ value.Get(b);
+ DALI_TEST_CHECK( true == b );
+
+ float f = 5.f;
+ value = Property::Value(10.f);
+ value.Get(f);
+ DALI_TEST_CHECK( Dali::Equals(10.f, f) );
+
+ int i = 5;
+ value = Property::Value(10);
+ value.Get(i);
+ DALI_TEST_CHECK( 10 == i );
+
+ unsigned int ui = 5;
+ value = Property::Value(10U);
+ value.Get(ui);
+ DALI_TEST_CHECK( 10 == ui );
+
+ Vector2 v2 = Vector2(0,0);
+ value = Property::Value( Vector2(1,1) );
+ value.Get(v2);
+ DALI_TEST_CHECK( Vector2(1,1) == v2 );
+
+ Vector3 v3 = Vector3(0.f,0.f,0.f);
+ value = Property::Value( Vector3(1.f,1.f,1.f) );
+ value.Get(v3);
+ DALI_TEST_CHECK( Vector3(1.f,1.f,1.f) == v3 );
+
+ Vector4 v4 = Vector4(0,0,0,0);
+ value = Property::Value( Vector4(1,1,1,1) );
+ value.Get(v4);
+ DALI_TEST_CHECK( Vector4(1,1,1,1) == v4 );
+
+ Matrix3 m3 = Matrix3(0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f);
+ value = Property::Value( Matrix3::IDENTITY );
+ value.Get(m3);
+ DALI_TEST_CHECK( Matrix3::IDENTITY == m3 );
+
+ Matrix m = Matrix(true);
+ value = Property::Value( Matrix::IDENTITY );
+ value.Get(m);
+ DALI_TEST_CHECK( Matrix::IDENTITY == m );
+
+ typedef Dali::Rect<int> Rectangle;
+ Rectangle r = Rectangle(0,0,0,0);
+ value = Property::Value( Rectangle(1,1,1,1) );
+ value.Get(r);
+ DALI_TEST_CHECK( Rectangle(1,1,1,1) == r );
+
+ Quaternion q = Quaternion(0,0,0,0);
+ value = Property::Value( Quaternion(1,1,1,1) );
+ value.Get(q);
+ DALI_TEST_CHECK( Quaternion(1,1,1,1) == q );
+
+ AngleAxis aa = AngleAxis( Degree(0), Vector3(0.f,0.f,0.f) );
+ value = Property::Value( AngleAxis( Radian(Math::PI_2), Vector3::XAXIS ));
+ value.Get(aa);
+ Quaternion r8(Radian(Degree(aa.angle)), aa.axis);
+ DALI_TEST_EQUALS(r8, Quaternion(Math::PI_2, Vector3::XAXIS), 0.001, TEST_LOCATION);
+
+ std::string s = "no";
+ value = Property::Value("yes");
+ value.Get(s);
+ DALI_TEST_CHECK( "yes" == s );
+
+ Property::Array array;
+ value = Property::Value(Property::ARRAY);
+ value.AppendItem(10);
+ value.Get(array);
+ int getItem = 0;
+ array[0].Get(getItem);
+ DALI_TEST_CHECK( getItem == 10 );
+
+ Property::Map map;
+ value = Property::Value(Property::MAP);
+ value.SetValue("key", "value");
+ value.Get(map);
+ DALI_TEST_CHECK( map[0].first == "key" );
+
+ END_TEST;
+}
+
+int UtcDaliHandleGetPropertyIndices(void)
+{
+ TestApplication application;
+ Property::IndexContainer indices;
+
+ // Actor
+ Actor actor = Actor::New();
+ actor.GetPropertyIndices( indices );
+ DALI_TEST_CHECK( ! indices.empty() );
+ DALI_TEST_EQUALS( indices.size(), actor.GetPropertyCount(), TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <algorithm>
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+#include <test-native-image.h>
+
+using namespace Dali;
+
+void utc_dali_image_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_image_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+static const char* gTestImageFilename = "icon_wrt.png";
+
+
+// 1.1
+int UtcDaliImageNew01(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliImageNew01 - Image::New(const std::string&)");
+
+ // invoke default handle constructor
+ Image image;
+
+ DALI_TEST_CHECK( !image );
+
+ // initialise handle
+ image = Image::New(gTestImageFilename);
+
+ DALI_TEST_CHECK( image );
+ END_TEST;
+}
+
+// 1.2
+int UtcDaliImageNew02(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliImageNew02 - Image::New(const std::string&, const ImageAttributes&)");
+
+ // invoke default handle constructor
+ Image image;
+
+ DALI_TEST_CHECK( !image );
+
+ // initialise handle
+ Dali::ImageAttributes imageAttributes;
+ imageAttributes.SetSize(128, 256);
+ imageAttributes.SetScalingMode(Dali::ImageAttributes::FitHeight);
+ image = Image::New(gTestImageFilename, imageAttributes);
+
+ DALI_TEST_CHECK( image );
+ END_TEST;
+}
+
+// 1.3
+int UtcDaliImageNew03(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliImageNew03 - Image::New(NativeImage&)");
+
+ // invoke default handle constructor
+ Image image;
+ TestNativeImagePointer nativeImage = TestNativeImage::New(16, 16);
+
+ DALI_TEST_CHECK( !image );
+
+ // initialise handle
+ image = Image::New(*(nativeImage.Get()));
+
+ DALI_TEST_CHECK( image );
+ END_TEST;
+}
+
+// 1.4
+int UtcDaliImageNewWithPolicies01(void)
+{
+ TestApplication application;
+
+ // testing delayed loading
+ tet_infoline("UtcDaliImageNewWithPolicies01 - Load image with LoadPolicy::OnDemand, ReleasePolicy::Never");
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+ Image image = Image::New(gTestImageFilename, Image::OnDemand, Image::Never);
+
+ DALI_TEST_CHECK( image );
+
+ application.SendNotification();
+ application.Render(16);
+
+ // request file loading only when actor added to stage
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+
+ ImageActor actor = ImageActor::New(image);
+
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+
+ // testing ReleasePolicy::Never
+ // fake loading image
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource(bitmap);
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
+
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
+ }
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
+
+ // never discard texture
+ Stage::GetCurrent().Remove(actor);
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
+ END_TEST;
+}
+
+// 1.5
+int UtcDaliImageNewWithPolicies02(void)
+{
+ TestApplication application;
+
+ // testing resource deletion when taken off stage
+ tet_infoline("UtcDaliImageNewWithPolicies02 - Load image with LoadPolicy::OnDemand, ReleasePolicy::Unused");
+
+ Image image = Image::New(gTestImageFilename, Image::OnDemand, Image::Unused);
+
+ DALI_TEST_CHECK( image );
+
+ application.SendNotification();
+ application.Render(16);
+
+ // request file loading only when actor added to stage
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+
+ ImageActor actor = ImageActor::New(image);
+
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+
+ // testing ReleasePolicy::Unused
+ // fake loading image
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource(bitmap);
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
+
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
+ }
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
+
+ // discard texture when actor comes off stage
+ Stage::GetCurrent().Remove(actor);
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ DALI_TEST_CHECK ( application.GetGlAbstraction().CheckTextureDeleted(23) );
+ END_TEST;
+}
+
+// 1.6
+int UtcDaliImageNewWithPolicies03(void)
+{
+ TestApplication application;
+
+ // load immediately -> resource deletion when taken off stage -> put actor back on stage -> load resource again
+ tet_infoline("UtcDaliImageNewWithPolicies03 - Load image with LoadPolicy::Immediate, ReleasePolicy::Unused");
+
+ Image image = Image::New(gTestImageFilename, Image::Immediate, Image::Unused);
+
+ DALI_TEST_CHECK( image );
+
+ application.SendNotification();
+ application.Render(16);
+
+ // request file loading immediately
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+
+ ImageActor actor = ImageActor::New(image);
+
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+
+ // testing ReleasePolicy::Unused
+ // fake loading image
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource(bitmap);
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
+
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
+ }
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
+
+ // discard texture when actor comes off stage
+ Stage::GetCurrent().Remove(actor);
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ DALI_TEST_CHECK ( application.GetGlAbstraction().CheckTextureDeleted(23) );
+
+ // check load request when actor added back to stage
+ application.GetPlatform().ResetTrace();
+
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+ END_TEST;
+}
+
+// 1.7
+int UtcDaliImageNewWithPolicies04(void)
+{
+ TestApplication application;
+
+ // load immediately, don't release texture when off stage
+ tet_infoline("UtcDaliImageNewWithPolicies03 - Load image with LoadPolicy::Immediate, ReleasePolicy::Never");
+
+ Image image = Image::New(gTestImageFilename, Image::Immediate, Image::Never);
+
+ DALI_TEST_CHECK( image );
+
+ application.SendNotification();
+ application.Render(16);
+
+ // request file loading immediately
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+
+ ImageActor actor = ImageActor::New(image);
+
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+
+ // testing ReleasePolicy::Never
+ // fake loading image
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource(bitmap);
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
+
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
+ }
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
+
+ // texture is not discarded
+ Stage::GetCurrent().Remove(actor);
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
+
+ // no load request when actor added back to stage
+ application.GetPlatform().ResetTrace();
+
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+ END_TEST;
+}
+
+// 1.8
+int UtcDaliImageNewDistanceField(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliImageNewDistanceField - Image::NewDistanceField(const std::string&)");
+
+ // invoke default handle constructor
+ Image image;
+
+ DALI_TEST_CHECK( !image );
+
+ // initialise handle
+ image = Image::NewDistanceField(gTestImageFilename);
+
+ DALI_TEST_CHECK( image );
+ END_TEST;
+}
+
+// 1.9
+int UtcDaliImageNewDistanceFieldWithPolicies01(void)
+{
+ TestApplication application;
+
+ // testing delayed loading
+ tet_infoline("UtcDaliImageNewDistanceFieldWithPolicies01 - Load image with LoadPolicy::OnDemand, ReleasePolicy::Never");
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+ Image image = Image::NewDistanceField(gTestImageFilename, Image::OnDemand, Image::Never);
+
+ DALI_TEST_CHECK( image );
+
+ application.SendNotification();
+ application.Render(16);
+
+ // request file loading only when actor added to stage
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+
+ ImageActor actor = ImageActor::New(image);
+
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+
+ // testing ReleasePolicy::Never
+ // fake loading image
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource(bitmap);
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
+
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
+ }
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
+
+ // never discard texture
+ Stage::GetCurrent().Remove(actor);
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
+ END_TEST;
+}
+
+// 1.10
+int UtcDaliImageNewDistanceFieldWithPolicies02(void)
+{
+ TestApplication application;
+
+ // testing resource deletion when taken off stage
+ tet_infoline("UtcDaliImageNewDistanceFieldWithPolicies02 - Load image with LoadPolicy::OnDemand, ReleasePolicy::Unused");
+
+ Image image = Image::NewDistanceField(gTestImageFilename, Image::OnDemand, Image::Unused);
+
+ DALI_TEST_CHECK( image );
+
+ application.SendNotification();
+ application.Render(16);
+
+ // request file loading only when actor added to stage
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+
+ ImageActor actor = ImageActor::New(image);
+
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+
+ // testing ReleasePolicy::Unused
+ // fake loading image
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource(bitmap);
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
+
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
+ }
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
+
+ // discard texture when actor comes off stage
+ Stage::GetCurrent().Remove(actor);
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ DALI_TEST_CHECK ( application.GetGlAbstraction().CheckTextureDeleted(23) );
+ END_TEST;
+}
+
+// 1.11
+int UtcDaliImageNewDistanceFieldWithPolicies03(void)
+{
+ TestApplication application;
+
+ // load immediately -> resource deletion when taken off stage -> put actor back on stage -> load resource again
+ tet_infoline("UtcDaliImageNewDistanceFieldWithPolicies03 - Load image with LoadPolicy::Immediate, ReleasePolicy::Unused");
+
+ Image image = Image::NewDistanceField(gTestImageFilename, Image::Immediate, Image::Unused);
+
+ DALI_TEST_CHECK( image );
+
+ application.SendNotification();
+ application.Render(16);
+
+ // request file loading immediately
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+
+ ImageActor actor = ImageActor::New(image);
+
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+
+ // testing ReleasePolicy::Unused
+ // fake loading image
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource(bitmap);
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
+
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
+ }
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
+
+ // discard texture when actor comes off stage
+ Stage::GetCurrent().Remove(actor);
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ DALI_TEST_CHECK ( application.GetGlAbstraction().CheckTextureDeleted(23) );
+
+ // check load request when actor added back to stage
+ application.GetPlatform().ResetTrace();
+
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+ END_TEST;
+}
+
+// 1.12
+int UtcDaliImageNewDistanceFieldWithPolicies04(void)
+{
+ TestApplication application;
+
+ // load immediately, don't release texture when off stage
+ tet_infoline("UtcDaliImageNewDistanceFieldWithPolicies04 - Load image with LoadPolicy::Immediate, ReleasePolicy::Never");
+
+ Image image = Image::NewDistanceField(gTestImageFilename, Image::Immediate, Image::Never);
+
+ DALI_TEST_CHECK( image );
+
+ application.SendNotification();
+ application.Render(16);
+
+ // request file loading immediately
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+
+ ImageActor actor = ImageActor::New(image);
+
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+
+ // testing ReleasePolicy::Never
+ // fake loading image
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource(bitmap);
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
+
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
+ }
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
+
+ // texture is not discarded
+ Stage::GetCurrent().Remove(actor);
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
+
+ // no load request when actor added back to stage
+ application.GetPlatform().ResetTrace();
+
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+ END_TEST;
+}
+
+// 1.13
+int UtcDaliImageNewDistanceFieldWithAttributes(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliImageNewDistanceFieldWithAttributes - Image::NewDistanceField(const std::string&, const ImageAttributes& attributes)");
+
+ // invoke default handle constructor
+ Image image;
+ Dali::ImageAttributes imageAttributes = Dali::ImageAttributes::NewDistanceField(6.0f, 12);
+
+ DALI_TEST_CHECK( !image );
+
+ // initialise handle
+ image = Image::NewDistanceField(gTestImageFilename, imageAttributes);
+
+ DALI_TEST_CHECK( image );
+ END_TEST;
+}
+
+// 1.14
+int UtcDaliImageNewDistanceFieldWithAttrandPol(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliImageNewDistanceFieldWithAttrandPol - Load image with LoadPolicy::OnDemand, ReleasePolicy::Unused");
+
+ Dali::ImageAttributes imageAttributes = Dali::ImageAttributes::NewDistanceField(6.0f, 12);
+
+ Image image = Image::NewDistanceField(gTestImageFilename, imageAttributes, Image::OnDemand, Image::Unused);
+
+ DALI_TEST_CHECK( image );
+
+ application.SendNotification();
+ application.Render(16);
+
+ // request file loading only when actor added to stage
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+
+ ImageActor actor = ImageActor::New(image);
+
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+
+ // testing ReleasePolicy::Unused
+ // fake loading image
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource(bitmap);
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
+
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
+ }
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
+
+ // discard texture when actor comes off stage
+ Stage::GetCurrent().Remove(actor);
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ DALI_TEST_CHECK ( application.GetGlAbstraction().CheckTextureDeleted(23) );
+ END_TEST;
+}
+
+// 1.15
+int UtcDaliImageDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Image::DownCast()");
+
+ Image image = Image::New(gTestImageFilename);
+
+ BaseHandle object(image);
+
+ Image image2 = Image::DownCast(object);
+ DALI_TEST_CHECK(image2);
+
+ Image image3 = DownCast< Image >(object);
+ DALI_TEST_CHECK(image3);
+
+ BaseHandle unInitializedObject;
+ Image image4 = Image::DownCast(unInitializedObject);
+ DALI_TEST_CHECK(!image4);
+
+ Image image5 = DownCast< Image >(unInitializedObject);
+ DALI_TEST_CHECK(!image5);
+ END_TEST;
+}
+
+// 1.16
+int UtcDaliImageGetImageSize(void)
+{
+ TestApplication application;
+ TestPlatformAbstraction& platform = application.GetPlatform();
+
+ tet_infoline("UtcDaliImageGetImageSize - Image::GetImageSize()");
+
+ Vector2 testSize(8.0f, 16.0f);
+ platform.SetClosestImageSize(testSize);
+
+ Vector2 size = Image::GetImageSize(gTestImageFilename);
+
+ DALI_TEST_CHECK( application.GetPlatform().GetTrace().FindMethod("GetClosestImageSize"));
+ DALI_TEST_EQUALS( size, testSize, TEST_LOCATION);
+ END_TEST;
+}
+
+// 1.17
+int UtcDaliImageGetFilename(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliImageGetFilename");
+
+ // invoke default handle constructor
+ Image image;
+
+ DALI_TEST_CHECK( !image );
+
+ // initialise handle
+ image = Image::New(gTestImageFilename);
+
+ DALI_TEST_EQUALS( image.GetFilename(), gTestImageFilename, TEST_LOCATION);
+ END_TEST;
+}
+
+// 1.18
+int UtcDaliImageGetLoadingState01(void)
+{
+ TestApplication application;
+ tet_infoline("UtcDaliImageGetLoadingState01");
+
+ Image image = Image::New(gTestImageFilename);
+ DALI_TEST_CHECK(image.GetLoadingState() == ResourceLoading);
+ application.SendNotification();
+ application.Render(16);
+
+ // simulate load success
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource(bitmap);
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
+
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
+ }
+ application.Render(16);
+ application.SendNotification();
+
+ // Test state == ResourceLoadingSucceeded
+ DALI_TEST_CHECK(image.GetLoadingState() == ResourceLoadingSucceeded);
+ END_TEST;
+}
+
+// 1.19
+int UtcDaliImageGetLoadingState02(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliImageGetLoadingState02");
+
+ // invoke default handle constructor
+ Image image;
+
+ DALI_TEST_CHECK( !image );
+
+ // initialise handle
+ image = Image::New(gTestImageFilename);
+
+ // Test state == ResourceLoading
+ DALI_TEST_CHECK(image.GetLoadingState() == ResourceLoading);
+ application.SendNotification();
+ application.Render(16);
+
+ // simulate load failure
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoadFailed(request->GetId(), Integration::FailureUnknown);
+ }
+ application.Render(16);
+ application.SendNotification();
+
+ // Test state == ResourceLoadingFailed
+ DALI_TEST_CHECK(image.GetLoadingState() == ResourceLoadingFailed);
+ END_TEST;
+}
+
+// 1.20
+int UtcDaliImageGetReleasePolicy(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliImageGetReleasePolicy");
+
+ Image image = Image::New(gTestImageFilename, Image::Immediate, Image::Unused);
+
+ DALI_TEST_CHECK( image );
+
+ DALI_TEST_CHECK( Image::Unused == image.GetReleasePolicy() );
+
+ END_TEST;
+}
+
+// 1.21
+int UtcDaliImageGetLoadPolicy(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliImageGetLoadPolicy");
+
+ Image image = Image::New(gTestImageFilename, Image::OnDemand, Image::Never);
+
+ DALI_TEST_CHECK( image );
+
+ DALI_TEST_CHECK( Image::OnDemand == image.GetLoadPolicy());
+ END_TEST;
+}
+
+static bool SignalLoadFlag = false;
+
+static void SignalLoadHandler(Image image)
+{
+ tet_infoline("Received image load finished signal");
+
+ SignalLoadFlag = true;
+}
+
+static bool SignalUploadedFlag = false;
+
+static void SignalUploadedHandler(Image image)
+{
+ tet_infoline("Received image uploaded signal");
+
+ SignalUploadedFlag = true;
+}
+
+// 1.22
+int UtcDaliImageSignalLoadingFinished(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliImageSignalLoadingFinished");
+
+ SignalLoadFlag = false;
+
+ Image image = Image::New(gTestImageFilename);
+
+ image.LoadingFinishedSignal().Connect( SignalLoadHandler );
+ application.SendNotification();
+ application.Render(16);
+
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true)));
+ }
+
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK( SignalLoadFlag == true );
+ END_TEST;
+}
+
+// 1.23
+int UtcDaliImageSignalUploaded(void)
+{
+ TestApplication application;
+ tet_infoline("UtcDaliImageSignalUploaded - Image::SignalUploaded()");
+
+ // set up image in fake platform abstraction
+ Vector2 testSize(80.0f, 80.0f);
+ application.GetPlatform().SetClosestImageSize(testSize);
+
+ Image image = Image::New(gTestImageFilename);
+ image.LoadingFinishedSignal().Connect( SignalLoadHandler );
+
+ // Load image
+ application.SendNotification();
+ application.Render(16);
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource(bitmap);
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
+ }
+ application.Render(16);
+ application.SendNotification();
+
+ image.UploadedSignal().Connect( SignalUploadedHandler );
+
+ Dali::ImageActor imageActor = ImageActor::New(image);
+ Stage::GetCurrent().Add(imageActor);
+ imageActor.SetSize(80, 80);
+ imageActor.SetVisible(true);
+
+ application.SendNotification();
+ application.Render(0);
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK( SignalLoadFlag == true );
+ DALI_TEST_CHECK( SignalUploadedFlag == true );
+ SignalLoadFlag = false;
+ SignalUploadedFlag = false;
+
+ image.Reload();
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 160, 160, 160, 160);
+
+ application.SendNotification();
+ application.Render(16);
+ application.Render(16);
+ application.SendNotification();
+ DALI_TEST_CHECK( SignalLoadFlag == true );
+
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ DALI_TEST_CHECK( SignalUploadedFlag == true );
+ END_TEST;
+}
+
+
+// 1.24
+int UtcDaliImageDiscard01(void)
+{
+ TestApplication application;
+ tet_infoline("UtcDaliImageDiscard01 - no actors");
+
+ {
+ Image image = Image::New(gTestImageFilename);
+
+ // Load image
+ application.SendNotification();
+ application.Render(16);
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource(bitmap);
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
+ }
+ application.Render(16);
+ application.SendNotification();
+ } // Drop image handle
+
+ application.SendNotification();
+ application.Render(16);
+ application.Render(16);
+ application.SendNotification();
+
+ // Shouldn't have been sent to GL...
+ const std::vector<GLuint>& texIds = application.GetGlAbstraction().GetNextTextureIds();
+ DALI_TEST_CHECK( texIds.size() == 1 );
+ DALI_TEST_CHECK( texIds[0] == 23 );
+ END_TEST;
+}
+
+// 1.25
+int UtcDaliImageDiscard02(void)
+{
+ TestApplication application;
+ tet_infoline("UtcDaliImageDiscard02 - one actor, tests TextureCache::DiscardTexture");
+
+ {
+ {
+ ImageActor actor;
+ {
+ Image image = Image::New(gTestImageFilename);
+ actor = ImageActor::New(image);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource(bitmap);
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
+ }
+ application.Render(16);
+ application.SendNotification();
+ } // lose image handle, actor should still keep one
+ application.SendNotification();
+ application.Render(16);
+
+ Stage::GetCurrent().Remove(actor);
+ application.SendNotification();
+ application.Render(16);
+ } // lose actor
+ application.SendNotification();
+ application.Render(16);
+ }
+
+ // Cleanup
+ application.SendNotification();
+ application.Render(16);
+ application.Render(16);
+ application.SendNotification();
+
+ // texture should have been removed:
+ DALI_TEST_CHECK( application.GetGlAbstraction().CheckTextureDeleted( 23 ));
+ END_TEST;
+}
+
+// 1.26
+int UtcDaliImageDiscard03(void)
+{
+ TestApplication application;
+ tet_infoline("UtcDaliImageDiscard03 - one actor, tests TextureCache::RemoveObserver");
+
+ Image image = Image::New(gTestImageFilename);
+ ImageActor actor = ImageActor::New(image);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource(bitmap);
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
+ }
+ application.Render(16);
+ application.SendNotification();
+ application.SendNotification();
+ application.Render(16);
+
+ const std::vector<GLuint>& texIds = application.GetGlAbstraction().GetNextTextureIds();
+ DALI_TEST_CHECK( texIds.size() == 0 );
+ const std::vector<GLuint>& boundTexIds = application.GetGlAbstraction().GetBoundTextures();
+ DALI_TEST_CHECK( boundTexIds[0] == 23 );
+
+ Stage::GetCurrent().Remove(actor);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16); // Should remove image renderer
+
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <stdlib.h>
+#include <dali/dali.h>
+#include "dali-test-suite-utils/dali-test-suite-utils.h"
+
+using namespace Dali;
+
+static const char* TestImageFilename = "icon_wrt.png";
+
+void image_actor_test_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void image_actor_test_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+int UtcDaliImageActorConstructorVoid(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::ImageActor::ImageActor()");
+
+ ImageActor actor;
+
+ DALI_TEST_CHECK(!actor);
+ END_TEST;
+}
+
+int UtcDaliImageActorDestructor(void)
+{
+ TestApplication application;
+
+ ImageActor* actor = new ImageActor();
+ delete actor;
+
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
+
+int UtcDaliImageActorNew01(void)
+{
+ TestApplication application;
+ tet_infoline("Positive test for Dali::ImageActor::New()");
+
+ Image image = Image::New(TestImageFilename);
+ ImageActor actor = ImageActor::New(image);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ DALI_TEST_CHECK(application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc));
+
+ DALI_TEST_CHECK(actor);
+ END_TEST;
+}
+
+int UtcDaliImageActorNew02(void)
+{
+ TestApplication application;
+ tet_infoline("Negative test for Dali::ImageActor::New()");
+
+ Image image = Image::New("hopefully-this-image-file-does-not-exist");
+ ImageActor actor = ImageActor::New(image);
+
+ DALI_TEST_CHECK(actor);
+ END_TEST;
+}
+
+int UtcDaliImageActorDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::ImageActor::DownCast()");
+
+ Image image = Image::New("IncorrectImageName");
+ ImageActor actor1 = ImageActor::New(image);
+ Actor anActor = Actor::New();
+ anActor.Add(actor1);
+
+ Actor child = anActor.GetChildAt(0);
+ ImageActor imageActor = DownCast< ImageActor >(child);
+
+ DALI_TEST_CHECK(imageActor);
+ END_TEST;
+}
+
+int UtcDaliImageActorDownCast2(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::ImageActor::DownCast()");
+
+ Actor actor1 = Actor::New();
+ Actor anActor = Actor::New();
+ anActor.Add(actor1);
+
+ Actor child = anActor.GetChildAt(0);
+ ImageActor imageActor = ImageActor::DownCast(child);
+ DALI_TEST_CHECK(!imageActor);
+
+ Actor unInitialzedActor;
+ imageActor = ImageActor::DownCast( unInitialzedActor );
+ DALI_TEST_CHECK(!imageActor);
+ END_TEST;
+}
+
+int UtcDaliImageActor9Patch(void)
+{
+ TestApplication application;
+ tet_infoline("Positive test for Dali::ImageActor:: 9 patch api");
+
+ Image image = Image::New(TestImageFilename);
+ ImageActor actor = ImageActor::New(image);
+
+ actor.SetStyle(ImageActor::STYLE_NINE_PATCH);
+ Vector4 border(0.1,0.2,0.3,0.4);
+ actor.SetNinePatchBorder(border);
+
+ DALI_TEST_EQUALS( 0.1f, actor.GetNinePatchBorder().x, TEST_LOCATION );
+ DALI_TEST_EQUALS( 0.2f, actor.GetNinePatchBorder().y, TEST_LOCATION );
+ DALI_TEST_EQUALS( 0.3f, actor.GetNinePatchBorder().z, TEST_LOCATION );
+ DALI_TEST_EQUALS( 0.4f, actor.GetNinePatchBorder().w, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliImageActorPixelArea(void)
+{
+ TestApplication application;
+ tet_infoline("Positive test for Dali::ImageActor::UtcDaliImageActorPixelArea");
+
+ BitmapImage img = BitmapImage::New( 10, 10 );
+ ImageActor actor = ImageActor::New( img );
+
+ DALI_TEST_CHECK( actor.IsPixelAreaSet() == false );
+
+ ImageActor::PixelArea area( 1, 2, 3, 4 );
+ actor.SetPixelArea( area );
+
+ DALI_TEST_CHECK( actor.IsPixelAreaSet() == true );
+
+ DALI_TEST_EQUALS( 1, actor.GetPixelArea().x, TEST_LOCATION );
+ DALI_TEST_EQUALS( 2, actor.GetPixelArea().y, TEST_LOCATION );
+ DALI_TEST_EQUALS( 3, actor.GetPixelArea().width, TEST_LOCATION );
+ DALI_TEST_EQUALS( 4, actor.GetPixelArea().height, TEST_LOCATION );
+
+ ImageActor actor2 = ImageActor::New( img, ImageActor::PixelArea( 5, 6, 7, 8 ) );
+ DALI_TEST_CHECK( actor2.IsPixelAreaSet() == true );
+
+ DALI_TEST_EQUALS( 5, actor2.GetPixelArea().x, TEST_LOCATION );
+ DALI_TEST_EQUALS( 6, actor2.GetPixelArea().y, TEST_LOCATION );
+ DALI_TEST_EQUALS( 7, actor2.GetPixelArea().width, TEST_LOCATION );
+ DALI_TEST_EQUALS( 8, actor2.GetPixelArea().height, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliImageActorGetCurrentImageSize01(void)
+{
+ TestApplication application;
+ tet_infoline("Positive test for Dali::ImageActor::GetCurrentImageSize");
+
+ Vector2 initialImageSize(100, 50);
+ BitmapImage image = BitmapImage::New( initialImageSize.width, initialImageSize.height );
+ ImageActor actor = ImageActor::New( image );
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), initialImageSize, TEST_LOCATION );
+
+ Vector2 size(200.0f, 200.0f);
+ actor.SetSize(size);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), size, TEST_LOCATION );
+
+ size.x = 200.0f;
+ size.y = 200.0f;
+ actor.SetSize(size);
+ application.Render(8);
+
+ // Test when a pixel area is set
+ ImageActor::PixelArea area(0, 0, 10, 10);
+ actor.SetPixelArea(area);
+ application.Render(9);
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), Vector2( area.width, area.height ), TEST_LOCATION );
+ END_TEST;
+}
+
+
+int UtcDaliImageActorGetCurrentImageSize02(void)
+{
+ TestApplication application;
+ tet_infoline("Positive test for Dali::ImageActor::GetCurrentImageSize - Test that using an image resource sets the actor size with it's natural size immediately rather than on load");
+
+ Vector2 initialImageSize(100, 50);
+
+ application.GetPlatform().SetClosestImageSize(initialImageSize);
+
+ Image image = Image::New("image.jpg");
+ ImageActor actor = ImageActor::New( image );
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), initialImageSize, TEST_LOCATION );
+
+ // Now complete the image load
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, initialImageSize.width,initialImageSize.height, initialImageSize.width,initialImageSize.height );
+
+ Integration::ResourcePointer resourcePtr(bitmap); // reference it
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+ application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
+ application.GetPlatform().ClearReadyResources(); //
+
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), initialImageSize, TEST_LOCATION );
+
+ Vector2 size(200.0f, 200.0f);
+ actor.SetSize(size);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), size, TEST_LOCATION );
+
+ actor.SetToNaturalSize();
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), initialImageSize, TEST_LOCATION );
+ END_TEST;
+}
+
+
+int UtcDaliImageActorGetCurrentImageSize03(void)
+{
+ TestApplication application;
+ tet_infoline("Positive test for Dali::ImageActor::GetCurrentImageSize - Test that using an image resource with a requested size sets the actor size with it's nearest size immediately rather than on load");
+
+ Vector2 closestImageSize( 80, 45);
+
+ application.GetPlatform().SetClosestImageSize(closestImageSize);
+
+ ImageAttributes attrs;
+ attrs.SetSize(40, 30);
+ Image image = Image::New("image.jpg", attrs);
+ ImageActor actor = ImageActor::New( image );
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION );
+
+ // Now complete the image load
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, closestImageSize.width, closestImageSize.height, closestImageSize.width, closestImageSize.height );
+
+ Integration::ResourcePointer resourcePtr(bitmap); // reference it
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+ application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
+ application.GetPlatform().ClearReadyResources(); //
+
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION );
+
+ // Test that setting a size on the actor can be 'undone' with SetNaturalSize()
+ Vector2 size(200.0f, 200.0f);
+ actor.SetSize(size);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), size, TEST_LOCATION );
+
+ actor.SetToNaturalSize();
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION );
+ END_TEST;
+}
+
+
+int UtcDaliImageActorGetCurrentImageSize04(void)
+{
+ TestApplication application;
+ tet_infoline("Positive test for Dali::ImageActor::GetCurrentImageSize - check a new image doesn't change a set actor size");
+
+ Vector2 closestImageSize( 80, 45);
+ application.GetPlatform().SetClosestImageSize(closestImageSize);
+
+ ImageAttributes attrs;
+ attrs.SetSize(40, 30); // Request a really small size we won't get.
+ Image image = Image::New("image.jpg", attrs);
+ ImageActor actor = ImageActor::New( image );
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION );
+
+ // Now complete the image load
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, closestImageSize.width, closestImageSize.height, closestImageSize.width, closestImageSize.height );
+
+ Integration::ResourcePointer resourcePtr(bitmap); // reference it
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+ application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
+ application.GetPlatform().ClearReadyResources(); //
+
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION );
+
+ Vector2 size(200.0f, 200.0f);
+ actor.SetSize(size);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), size, TEST_LOCATION );
+
+ // Load a different image
+
+ Vector2 image2ClosestSize = Vector2(240, 150); // The actual size image loader will return for the request below
+ application.GetPlatform().SetClosestImageSize(image2ClosestSize);
+
+ attrs.SetSize(100, 100);
+ Image image2 = Image::New("image2.jpg", attrs);
+ actor.SetImage(image2);
+
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+
+ // Ensure the actor size is kept
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), size, TEST_LOCATION );
+
+ // Now complete the image load
+ req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap2 = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap2->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, image2ClosestSize.width, image2ClosestSize.height, image2ClosestSize.width, image2ClosestSize.height );
+
+ Integration::ResourcePointer resourcePtr2(bitmap2); // reference it
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr2);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+ application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
+ application.GetPlatform().ClearReadyResources(); //
+
+ // Ensure the actor size is kept
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), size, TEST_LOCATION );
+
+ actor.SetToNaturalSize();
+ application.SendNotification();
+ application.Render();
+ // Ensure the actor size gets the new image's natural size
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), image2ClosestSize, TEST_LOCATION );
+ END_TEST;
+}
+
+
+int UtcDaliImageActorGetCurrentImageSize05(void)
+{
+ TestApplication application;
+ tet_infoline("Positive test for Dali::ImageActor::GetCurrentImageSize - check a new image doens't change actor size until load complete");
+
+ Vector2 closestImageSize( 80, 45);
+ application.GetPlatform().SetClosestImageSize(closestImageSize);
+
+ ImageAttributes attrs;
+ attrs.SetSize(40, 30); // Request a really small size we won't get.
+ Image image = Image::New("image.jpg", attrs);
+ ImageActor actor = ImageActor::New( image );
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION );
+
+ // Now complete the image load
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, closestImageSize.width, closestImageSize.height, closestImageSize.width, closestImageSize.height );
+
+ Integration::ResourcePointer resourcePtr(bitmap); // reference it
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+ application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
+ application.GetPlatform().ClearReadyResources(); //
+
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION );
+
+ // Load a different image
+
+ Vector2 image2ClosestSize = Vector2(240, 150);
+ application.GetPlatform().SetClosestImageSize(image2ClosestSize);
+
+ attrs.SetSize(100, 100);
+ Image image2 = Image::New("image2.jpg", attrs);
+ actor.SetImage(image2);
+
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+
+ // Ensure the actor size is kept
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION );
+
+ // Now complete the image load
+ req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap2 = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap2->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, image2ClosestSize.width, image2ClosestSize.height, image2ClosestSize.width, image2ClosestSize.height );
+
+ Integration::ResourcePointer resourcePtr2(bitmap2); // reference it
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr2);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+ application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
+ application.GetPlatform().ClearReadyResources(); //
+
+ application.SendNotification(); // Process event messages
+ application.Render(); // Process LoadComplete
+
+ // Ensure the actor size gets the new image's natural size
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), image2ClosestSize, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliImageActorNaturalPixelAreaSize01(void)
+{
+ TestApplication application;
+ tet_infoline("Positive test for Dali::ImageActor::GetCurrentImageSize - check a new image doens't change actor size until load complete");
+
+//If an image is loaded without setting size, then the actor gets the natural size of the image
+//Setting the pixel area will change the actor size to match the pixel area
+//Setting the actor size will not change pixel area, and will cause the partial image to stretch
+//to the new size.
+//Clearing the pixel area will not change actor size, and the actor will show the whole image.
+
+
+ Vector2 closestImageSize( 80, 45);
+ application.GetPlatform().SetClosestImageSize(closestImageSize);
+
+ ImageAttributes attrs;
+ attrs.SetSize(40, 30); // Request a really small size we won't get.
+ Image image = Image::New("image.jpg", attrs);
+ ImageActor actor = ImageActor::New( image );
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), closestImageSize, TEST_LOCATION );
+
+ // Now complete the image load
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, closestImageSize.width, closestImageSize.height, closestImageSize.width, closestImageSize.height );
+
+ Integration::ResourcePointer resourcePtr(bitmap); // reference it
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+ application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
+ application.GetPlatform().ClearReadyResources(); //
+
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), closestImageSize, TEST_LOCATION );
+
+ // Set a pixel area on a naturally sized actor - expect the actor to take the
+ // pixel area as size
+ actor.SetPixelArea(ImageActor::PixelArea(0, 0, 30, 30));
+ application.SendNotification(); // Process event messages
+ application.Render(); // Process LoadComplete
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), Vector2(30, 30), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), Vector2(30, 30), TEST_LOCATION );
+
+ // Set a size. Expect the partial image to stretch to fill the new size
+ actor.SetSize(100, 100);
+ application.SendNotification(); // Process event messages
+ application.Render(); // Process LoadComplete
+ application.Render(); // Process LoadComplete
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), Vector2(30, 30), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), Vector2(100, 100), TEST_LOCATION );
+
+ // Clear the pixel area. Expect the whole image to be shown, filling the set size.
+ actor.ClearPixelArea();
+ application.SendNotification(); // Process event messages
+ application.Render(); // Process LoadComplete
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), Vector2(100, 100), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), Vector2(100, 100), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliImageActorNaturalPixelAreaSize02(void)
+{
+ TestApplication application;
+ tet_infoline("Positive test for Dali::ImageActor::GetCurrentImageSize - check a new image doens't change actor size until load complete");
+
+//If an image is loaded without setting size, then the actor gets the natural size of the image
+//Setting the pixel area will change the actor size to match the pixel area
+//Setting the actor size will not change pixel area, and will cause the partial image to stretch
+//to the new size.
+//Clearing the pixel area will not change actor size, and the actor will show the whole image.
+
+
+ Vector2 closestImageSize( 80, 45);
+ application.GetPlatform().SetClosestImageSize(closestImageSize);
+
+ ImageAttributes attrs;
+ attrs.SetSize(40, 30); // Request a really small size we won't get.
+ Image image = Image::New("image.jpg", attrs);
+ ImageActor actor = ImageActor::New( image );
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification(); // Flush update messages
+ application.Render(); // Process resource request
+
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), closestImageSize, TEST_LOCATION );
+
+ // Now complete the image load
+ Integration::ResourceRequest* req = application.GetPlatform().GetRequest();
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, false );
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, closestImageSize.width, closestImageSize.height, closestImageSize.width, closestImageSize.height );
+
+ Integration::ResourcePointer resourcePtr(bitmap); // reference it
+ application.GetPlatform().SetResourceLoaded(req->GetId(), req->GetType()->id, resourcePtr);
+ application.Render(); // Process LoadComplete
+ application.SendNotification(); // Process event messages
+ application.GetPlatform().DiscardRequest(); // Ensure load request is discarded
+ application.GetPlatform().ClearReadyResources(); //
+
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), closestImageSize, TEST_LOCATION );
+
+ // Set a pixel area on a naturally sized actor - expect the actor to take the
+ // pixel area as size
+ actor.SetPixelArea(ImageActor::PixelArea(0, 0, 30, 30));
+ application.SendNotification(); // Process event messages
+ application.Render(); // Process LoadComplete
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), Vector2(30, 30), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), Vector2(30, 30), TEST_LOCATION );
+
+ // Clear the pixel area. Expect the whole image to be shown, changing actor size
+ actor.ClearPixelArea();
+ application.SendNotification(); // Process event messages
+ application.Render(); // Process LoadComplete
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), closestImageSize, TEST_LOCATION );
+
+ // Set a size. Expect the partial image to stretch to fill the new size
+ actor.SetSize(100, 100);
+ application.SendNotification(); // Process event messages
+ application.Render(); // Process LoadComplete
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), Vector2(100, 100), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), Vector2(100, 100), TEST_LOCATION );
+
+ // Set a pixel area, don't expect size to change
+ actor.SetPixelArea(ImageActor::PixelArea(0, 0, 40, 40));
+ application.SendNotification(); // Process event messages
+ application.Render(); // Process LoadComplete
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), Vector2(40, 40), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), Vector2(100, 100), TEST_LOCATION );
+
+ // Use natural size - expect actor to change to pixel area
+ actor.SetToNaturalSize();
+ application.SendNotification(); // Process event messages
+ application.Render(); // Process LoadComplete
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), Vector2(40, 40), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), Vector2(40, 40), TEST_LOCATION );
+
+ // Clearing pixel area should change actor size to image size
+ actor.ClearPixelArea();
+ application.SendNotification(); // Process event messages
+ application.Render(); // Process LoadComplete
+ DALI_TEST_EQUALS( actor.GetCurrentImageSize(), closestImageSize, TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2(actor.GetCurrentSize()), closestImageSize, TEST_LOCATION );
+ END_TEST;
+}
+
+
+
+int UtcDaliImageActorDefaultProperties(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::ImageActor DefaultProperties");
+
+ BitmapImage img = BitmapImage::New( 10, 10 );
+ ImageActor actor = ImageActor::New( img );
+
+ std::vector<Property::Index> indices;
+ indices.push_back(ImageActor::PIXEL_AREA );
+ indices.push_back(ImageActor::FADE_IN );
+ indices.push_back(ImageActor::FADE_IN_DURATION);
+ indices.push_back(ImageActor::STYLE );
+ indices.push_back(ImageActor::BORDER );
+ indices.push_back(ImageActor::IMAGE );
+
+ DALI_TEST_CHECK(actor.GetPropertyCount() == ( Actor::New().GetPropertyCount() + indices.size() ) );
+
+ for(std::vector<Property::Index>::iterator iter = indices.begin(); iter != indices.end(); ++iter)
+ {
+ DALI_TEST_CHECK( *iter == actor.GetPropertyIndex(actor.GetPropertyName(*iter)) );
+ DALI_TEST_CHECK( actor.IsPropertyWritable(*iter) );
+ DALI_TEST_CHECK( !actor.IsPropertyAnimatable(*iter) );
+ DALI_TEST_CHECK( actor.GetPropertyType(*iter) == actor.GetPropertyType(*iter) ); // just checking call succeeds
+ }
+
+ // set/get one of them
+ actor.SetPixelArea(ImageActor::PixelArea( 0, 0, 0, 0 ));
+
+ ImageActor::PixelArea area( 1, 2, 3, 4 );
+ actor.SetProperty(ImageActor::PIXEL_AREA, Property::Value(Rect<int>(area)));
+
+ DALI_TEST_CHECK(Property::RECTANGLE == actor.GetPropertyType(ImageActor::PIXEL_AREA));
+
+ Property::Value v = actor.GetProperty(ImageActor::PIXEL_AREA);
+
+ DALI_TEST_CHECK(v.Get<Rect<int> >() == area);
+
+ END_TEST;
+}
+
+int UtcDaliImageActorUseImageAlpha01(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::RenderableActor::SetUseImageAlpha()");
+
+ BitmapImage image = BitmapImage::New( 100, 50 );
+ ImageActor actor = ImageActor::New( image );
+ actor.SetBlendMode( BlendingMode::ON );
+ actor.SetSize(100, 50);
+ application.GetGlAbstraction().EnableCullFaceCallTrace(true); // For Enable(GL_BLEND)
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+
+ const TraceCallStack& callTrace = application.GetGlAbstraction().GetCullFaceTrace();
+ DALI_TEST_EQUALS( BlendEnabled( callTrace), true, TEST_LOCATION );
+ DALI_TEST_EQUALS( BlendDisabled( callTrace ), false, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliImageActorUseImageAlpha02(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::RenderableActor::SetUseImageAlpha()");
+
+ BitmapImage image = BitmapImage::New( 100, 50 );
+ ImageActor actor = ImageActor::New( image );
+ actor.SetBlendMode( BlendingMode::OFF );
+ actor.SetSize(100, 50);
+ application.GetGlAbstraction().EnableCullFaceCallTrace(true); // For Enable(GL_BLEND)
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+
+ const TraceCallStack& callTrace = application.GetGlAbstraction().GetCullFaceTrace();
+ DALI_TEST_EQUALS( BlendDisabled( callTrace ), false, TEST_LOCATION );
+ DALI_TEST_EQUALS( BlendEnabled( callTrace), false, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliImageActorUseImageAlpha03(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::RenderableActor::SetUseImageAlpha()");
+
+ BitmapImage image = BitmapImage::New( 100, 50 );
+ ImageActor actor = ImageActor::New( image );
+ actor.SetBlendMode( BlendingMode::AUTO );
+ actor.SetColor(Vector4(1.0, 1.0, 1.0, 0.5));
+ actor.SetSize(100, 50);
+ application.GetGlAbstraction().EnableCullFaceCallTrace(true); // For Enable(GL_BLEND)
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+
+ const TraceCallStack& callTrace = application.GetGlAbstraction().GetCullFaceTrace();
+ DALI_TEST_EQUALS( BlendDisabled( callTrace ), false, TEST_LOCATION );
+ DALI_TEST_EQUALS( BlendEnabled( callTrace), true, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliImageActorUseImageAlpha04(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::RenderableActor::SetUseImageAlpha()");
+
+ FrameBufferImage image = FrameBufferImage::New( 100, 50, Pixel::RGBA8888 );
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+ RenderTask task = taskList.GetTask( 0u );
+ task.SetTargetFrameBuffer( image ); // To ensure frame buffer is connected
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ application.SendNotification();
+ application.Render(0);
+
+ ImageActor actor = ImageActor::New( image );
+ application.SendNotification();
+ application.Render(0);
+
+ actor.SetBlendMode( BlendingMode::ON );
+ actor.SetColor(Vector4(1.0, 1.0, 1.0, 1.0));
+ actor.SetSize(100, 50);
+ application.GetGlAbstraction().EnableCullFaceCallTrace(true); // For Enable(GL_BLEND)
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+
+ const TraceCallStack& callTrace = application.GetGlAbstraction().GetCullFaceTrace();
+ DALI_TEST_EQUALS( BlendDisabled( callTrace ), false, TEST_LOCATION );
+ DALI_TEST_EQUALS( BlendEnabled( callTrace), true, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliImageActorUseImageAlpha05(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::RenderableActor::SetUseImageAlpha()");
+
+ BitmapImage image = BitmapImage::New( 100, 50, Pixel::RGB888 );
+ ImageActor actor = ImageActor::New( image );
+ actor.SetBlendMode( BlendingMode::AUTO );
+ actor.SetColor(Vector4(1.0, 1.0, 1.0, 1.0));
+ actor.SetSize(100, 50);
+ application.GetGlAbstraction().EnableCullFaceCallTrace(true); // For Enable(GL_BLEND)
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+
+ const TraceCallStack& callTrace = application.GetGlAbstraction().GetCullFaceTrace();
+ DALI_TEST_EQUALS( BlendDisabled( callTrace ), false, TEST_LOCATION );
+ DALI_TEST_EQUALS( BlendEnabled( callTrace), false, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliImageActorClearPixelArea(void)
+{
+ TestApplication application;
+
+ BitmapImage img = BitmapImage::New( 10, 10 );
+ ImageActor actor = ImageActor::New( img );
+
+ DALI_TEST_CHECK( actor.IsPixelAreaSet() == false );
+
+ ImageActor::PixelArea area( 1, 2, 3, 4 );
+ actor.SetPixelArea( area );
+
+ DALI_TEST_CHECK( actor.IsPixelAreaSet() == true );
+
+ actor.ClearPixelArea();
+
+ DALI_TEST_CHECK( actor.IsPixelAreaSet() == false );
+ END_TEST;
+}
+
+int UtcDaliImageGetStyle(void)
+{
+ TestApplication application;
+
+ Image image = Image::New(TestImageFilename);
+ ImageActor actor = ImageActor::New(image);
+
+ actor.SetStyle(ImageActor::STYLE_NINE_PATCH);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( ImageActor::STYLE_NINE_PATCH, actor.GetStyle(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliImageSetNinePatchBorder(void)
+{
+ TestApplication application;
+
+ Image image = Image::New(TestImageFilename);
+ ImageActor actor = ImageActor::New(image);
+
+ actor.SetStyle(ImageActor::STYLE_NINE_PATCH);
+ actor.SetNinePatchBorder(Vector4( 1.0f, 2.0f, 3.0f, 4.0f));
+
+ DALI_TEST_EQUALS( 1.0f, actor.GetNinePatchBorder().x, TEST_LOCATION );
+ DALI_TEST_EQUALS( 2.0f, actor.GetNinePatchBorder().y, TEST_LOCATION );
+ DALI_TEST_EQUALS( 3.0f, actor.GetNinePatchBorder().z, TEST_LOCATION );
+ DALI_TEST_EQUALS( 4.0f, actor.GetNinePatchBorder().w, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliImageSetFadeIn(void)
+{
+ TestApplication application;
+
+ Image image = Image::New(TestImageFilename);
+ ImageActor actor = ImageActor::New(image);
+
+ actor.SetFadeIn(true);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( true, actor.GetFadeIn(), TEST_LOCATION );
+
+ actor.SetFadeIn(false);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( false, actor.GetFadeIn(), TEST_LOCATION );
+ END_TEST;
+}
+
+
+int UtcDaliImageSetFadeInDuration(void)
+{
+ TestApplication application;
+
+ Image image = Image::New(TestImageFilename);
+ ImageActor actor = ImageActor::New(image);
+
+ actor.SetFadeInDuration( 1.0f );
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( 1.0f, actor.GetFadeInDuration(), TEST_LOCATION );
+
+ actor.SetFadeInDuration( 3.0f );
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( 3.0f, actor.GetFadeInDuration(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliImageActorNewNull(void)
+{
+ TestApplication application;
+
+ ImageActor actor = ImageActor::New(Image());
+
+ DALI_TEST_CHECK(actor);
+ END_TEST;
+}
+
+int UtcDaliImageActorNewNullWithArea(void)
+{
+ TestApplication application;
+
+ ImageActor::PixelArea area( 1, 2, 3, 4 );
+
+ ImageActor actor = ImageActor::New(Image(), area);
+
+ DALI_TEST_CHECK(actor);
+ END_TEST;
+}
+
+int UtcDaliImageActorSetImage(void)
+{
+ TestApplication application;
+
+ ImageActor actor = ImageActor::New(Image());
+
+ DALI_TEST_CHECK(actor);
+
+ actor.SetImage( Image() );
+
+ DALI_TEST_CHECK(!actor.GetImage());
+ END_TEST;
+}
+
+int UtcDaliImageActorPropertyIndices(void)
+{
+ TestApplication application;
+ Actor basicActor = Actor::New();
+ ImageActor imageActor = ImageActor::New();
+
+ Property::IndexContainer indices;
+ imageActor.GetPropertyIndices( indices );
+ DALI_TEST_CHECK( indices.size() > basicActor.GetPropertyCount() );
+ DALI_TEST_EQUALS( indices.size(), imageActor.GetPropertyCount(), TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <algorithm>
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using std::max;
+using namespace Dali;
+
+void utc_dali_image_attributes_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_image_attributes_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+int UtcDaliImageAttributesConstructor(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliImageAttributesConstructor");
+
+ // invoke default handle constructor
+ ImageAttributes imageAttributes;
+
+ DALI_TEST_CHECK( imageAttributes.GetWidth() == 0);
+ END_TEST;
+}
+
+int UtcDaliImageAttributesLessThan(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliImageAttributesLessThan");
+
+ // invoke default handle constructor
+ ImageAttributes imageAttributes;
+
+ ImageAttributes imageAttributesWidth;
+ imageAttributesWidth.SetSize(2,1);
+ DALI_TEST_CHECK(imageAttributes < imageAttributesWidth);
+
+ ImageAttributes imageAttributesHeight;
+ imageAttributesHeight.SetSize(1,2);
+ DALI_TEST_CHECK(imageAttributes < imageAttributesHeight);
+
+ imageAttributesWidth.SetSize(Size(2,1));
+ DALI_TEST_CHECK(imageAttributes < imageAttributesWidth);
+
+ imageAttributesHeight.SetSize(Size(1,2));
+ DALI_TEST_CHECK(imageAttributes < imageAttributesHeight);
+
+ ImageAttributes imageAttributesCrop;
+ imageAttributesCrop.SetCrop(Rect<float>(0.0f, 0.0f, 8.0f, 8.0f));
+ DALI_TEST_CHECK(imageAttributes < imageAttributesCrop);
+
+ ImageAttributes imageAttributesFormat;
+ imageAttributesFormat.SetPixelFormat(Pixel::BGRA8888);
+ DALI_TEST_CHECK(imageAttributes < imageAttributesFormat);
+
+ ImageAttributes imageAttributesScaling;
+ imageAttributesScaling.SetScalingMode(ImageAttributes::FitHeight);
+ DALI_TEST_CHECK(imageAttributes < imageAttributesScaling);
+ END_TEST;
+}
+
+int UtcDaliImageAttributesEquality(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliImageAttributesEquality");
+
+ // invoke default handle constructor
+ ImageAttributes imageAttributes01;
+ ImageAttributes imageAttributes02;
+
+ DALI_TEST_CHECK(imageAttributes02 == imageAttributes01);
+ END_TEST;
+}
+
+int UtcDaliImageAttributesInEquality(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliImageAttributesInEquality");
+
+ // invoke default handle constructor
+ ImageAttributes imageAttributes01;
+ ImageAttributes imageAttributes02;
+
+ DALI_TEST_CHECK((imageAttributes02 != imageAttributes01) == false);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/integration-api/events/key-event-integ.h>
+
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_key_event_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_key_event_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+// Key Event Test references
+const static int SHIFT_MODIFIER = 0x1;
+const static int CTRL_MODIFIER = 0x2;
+const static int ALT_MODIFIER = 0x4;
+const static int SHIFT_AND_CTRL_MODIFIER = SHIFT_MODIFIER | CTRL_MODIFIER;
+const static int SHIFT_AND_ALT_MODIFIER = SHIFT_MODIFIER | ALT_MODIFIER;
+const static int CTRL_AND_ALT_MODIFIER = CTRL_MODIFIER | ALT_MODIFIER;
+
+const static char* TEST_STRING_1 = "alpha";
+
+
+// Stores data that is populated in the callback and will be read by the TET cases
+struct SignalData
+{
+ SignalData()
+ : functorCalled(false)
+ {}
+
+ void Reset()
+ {
+ functorCalled = false;
+
+ receivedKeyEvent.keyModifier = 0;
+ receivedKeyEvent.keyPressedName.clear();
+ receivedKeyEvent.keyPressed.clear();
+
+ keyedActor = NULL;
+ }
+
+ bool functorCalled;
+ KeyEvent receivedKeyEvent;
+ Actor keyedActor;
+};
+
+// Functor that sets the data when called
+struct KeyEventReceivedFunctor
+{
+ KeyEventReceivedFunctor( SignalData& data ) : signalData( data ) { }
+
+ bool operator()( Actor actor, const KeyEvent& keyEvent )
+ {
+ signalData.functorCalled = true;
+ signalData.receivedKeyEvent = keyEvent;
+ signalData.keyedActor = actor;
+
+ return true;
+ }
+
+ SignalData& signalData;
+};
+
+} // anon namespace
+
+int UtcDaliKeyEventConstructor(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ KeyEvent event(TEST_STRING_1,"i", 99, SHIFT_MODIFIER, 0, KeyEvent::Down); // set name to test, key string to i and modifier to shift
+
+ DALI_TEST_EQUALS(TEST_STRING_1, event.keyPressedName, TEST_LOCATION); // check key name
+ DALI_TEST_EQUALS("i", event.keyPressed, TEST_LOCATION); // check key string
+ DALI_TEST_EQUALS(99, event.keyCode, TEST_LOCATION); // check keyCode
+ DALI_TEST_EQUALS(SHIFT_MODIFIER, event.keyModifier, TEST_LOCATION); // check modifier
+ DALI_TEST_EQUALS(KeyEvent::Down, event.state, TEST_LOCATION); // check state
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliKeyEventIsShiftModifier(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ KeyEvent event;
+ DALI_TEST_EQUALS(0, event.keyModifier, TEST_LOCATION);
+
+ event.keyModifier = SHIFT_MODIFIER; // Set to Shift Modifier
+
+ DALI_TEST_EQUALS(SHIFT_MODIFIER, event.keyModifier, TEST_LOCATION); // check able to set
+
+ DALI_TEST_EQUALS(true, event.IsShiftModifier(), TEST_LOCATION); // check IsShiftModifier
+
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliKeyEventIsCtrlModifier(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ KeyEvent event;
+ DALI_TEST_EQUALS(0, event.keyModifier, TEST_LOCATION);
+
+ event.keyModifier = CTRL_MODIFIER; // Set to Ctrl Modifier
+
+ DALI_TEST_EQUALS(CTRL_MODIFIER, event.keyModifier, TEST_LOCATION); // check able to set
+
+ DALI_TEST_EQUALS(true, event.IsCtrlModifier(), TEST_LOCATION); // check IsCtrlModifier
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliKeyEventIsAltModifier(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ KeyEvent event;
+ DALI_TEST_EQUALS(0, event.keyModifier, TEST_LOCATION);
+
+ event.keyModifier = ALT_MODIFIER; // Set to Alt Modifier
+
+ DALI_TEST_EQUALS(ALT_MODIFIER, event.keyModifier, TEST_LOCATION); // check able to set
+
+ DALI_TEST_EQUALS(true, event.IsAltModifier(), TEST_LOCATION); // IsAltModifier
+ END_TEST;
+}
+
+// Positive fail test case for a method
+int UtcDaliKeyEventIsNotShiftModifier(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ KeyEvent event("i","i", 0, CTRL_MODIFIER, 0, KeyEvent::Down);
+
+ DALI_TEST_EQUALS(CTRL_MODIFIER, event.keyModifier, TEST_LOCATION); // check different modifier used
+
+ DALI_TEST_EQUALS(false, event.IsShiftModifier(), TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive fail test case for a method
+int UtcDaliKeyEventIsNotCtrlModifier(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ KeyEvent event("i","i", 0, ALT_MODIFIER, 0, KeyEvent::Up);
+
+ DALI_TEST_EQUALS(ALT_MODIFIER, event.keyModifier, TEST_LOCATION); // check different modifier used
+
+ DALI_TEST_EQUALS(false, event.IsCtrlModifier(), TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive fail test case for a method
+int UtcDaliKeyEventIsNotAltModifier(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ KeyEvent event("i","i", 0, SHIFT_MODIFIER, 0, KeyEvent::Up);
+
+ DALI_TEST_EQUALS(SHIFT_MODIFIER, event.keyModifier, TEST_LOCATION); // check different modifier used
+
+ DALI_TEST_EQUALS(false, event.IsAltModifier(), TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliKeyEventANDModifer(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ KeyEvent event("i","i", 0, SHIFT_AND_CTRL_MODIFIER, 0, KeyEvent::Down);
+ DALI_TEST_EQUALS(true, event.IsCtrlModifier() & event.IsShiftModifier(), TEST_LOCATION);
+
+ event.keyModifier = SHIFT_MODIFIER;
+
+ DALI_TEST_EQUALS(false, event.IsCtrlModifier() & event.IsShiftModifier(), TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliKeyEventORModifer(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ KeyEvent event("i","i", 0, SHIFT_AND_CTRL_MODIFIER, 0, KeyEvent::Down);
+ DALI_TEST_EQUALS(true, event.IsCtrlModifier() | event.IsAltModifier(), TEST_LOCATION);
+
+ event.keyModifier = SHIFT_MODIFIER;
+
+ DALI_TEST_EQUALS(false, event.IsCtrlModifier() & event.IsAltModifier(), TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliKeyEventState(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ KeyEvent event("i","i", 0, SHIFT_AND_CTRL_MODIFIER, 0, KeyEvent::Down);
+ DALI_TEST_EQUALS(true, event.IsCtrlModifier() | event.IsAltModifier(), TEST_LOCATION);
+
+ event.keyModifier = SHIFT_MODIFIER;
+
+ DALI_TEST_EQUALS(false, event.IsCtrlModifier() & event.IsAltModifier(), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliIntegrationKeyEvent(void)
+{
+ TestApplication application;
+
+ {
+ Integration::KeyEvent keyEvent;
+ DALI_TEST_EQUALS( keyEvent.type, Integration::Event::Key, TEST_LOCATION );
+ DALI_TEST_CHECK( keyEvent.keyName == std::string() );
+ DALI_TEST_CHECK( keyEvent.keyString == std::string() );
+ DALI_TEST_EQUALS( keyEvent.keyCode, -1, TEST_LOCATION );
+ DALI_TEST_EQUALS( keyEvent.keyModifier, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( keyEvent.time, 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( keyEvent.state, Integration::KeyEvent::Down, TEST_LOCATION);
+ }
+
+ {
+ const std::string keyName("keyName");
+ const std::string keyString("keyString");
+ const int keyCode(333);
+ const int keyModifier(312);
+ const unsigned long timeStamp(132);
+ const Integration::KeyEvent::State keyState(Integration::KeyEvent::Up);
+
+ Integration::KeyEvent keyEvent(keyName, keyString, keyCode, keyModifier, timeStamp, keyState);
+ DALI_TEST_EQUALS( keyEvent.type, Integration::Event::Key, TEST_LOCATION );
+ DALI_TEST_CHECK( keyEvent.keyName == keyName );
+ DALI_TEST_CHECK( keyEvent.keyString == keyString );
+ DALI_TEST_EQUALS( keyEvent.keyCode, keyCode, TEST_LOCATION );
+ DALI_TEST_EQUALS( keyEvent.keyModifier, keyModifier, TEST_LOCATION );
+ DALI_TEST_EQUALS( keyEvent.time, timeStamp, TEST_LOCATION );
+ DALI_TEST_EQUALS( keyEvent.state, keyState, TEST_LOCATION);
+ }
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+
+#include <dali/dali.h>
+
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void layer_test_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void layer_test_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+int UtcDaliLayerNew(void)
+{
+ TestApplication application;
+ Layer layer = Layer::New();
+
+ DALI_TEST_CHECK(layer);
+ END_TEST;
+}
+
+int UtcDaliLayerDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Layer::DownCast()");
+
+ Layer actor1 = Layer::New();
+ Actor anActor = Actor::New();
+ anActor.Add(actor1);
+
+ Actor child = anActor.GetChildAt(0);
+ Layer layer = DownCast< Layer >(child);
+
+ DALI_TEST_CHECK(layer);
+ END_TEST;
+}
+
+int UtcDaliLayerDownCast2(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Layer::DownCast()");
+
+ Actor actor1 = Actor::New();
+ Actor anActor = Actor::New();
+ anActor.Add(actor1);
+
+ Actor child = anActor.GetChildAt(0);
+ Layer layer = DownCast< Layer >(child);
+ DALI_TEST_CHECK(!layer);
+
+ Actor unInitialzedActor;
+ layer = Layer::DownCast( unInitialzedActor );
+ DALI_TEST_CHECK(!layer);
+ END_TEST;
+}
+
+
+int UtcDaliLayerGetDepth(void)
+{
+ tet_infoline("Testing Dali::Layer::GetDepth()");
+ TestApplication application;
+ Layer layer1 = Layer::New();
+ Layer layer2 = Layer::New();
+
+ // layers are not on stage
+ DALI_TEST_EQUALS(layer1.GetDepth(), 0u, TEST_LOCATION);
+ DALI_TEST_EQUALS(layer2.GetDepth(), 0u, TEST_LOCATION);
+
+ // root depth is 0
+ Layer root = Stage::GetCurrent().GetLayer( 0 );
+ DALI_TEST_EQUALS(root.GetDepth(), 0u, TEST_LOCATION);
+
+ Stage::GetCurrent().Add(layer1);
+ Stage::GetCurrent().Add(layer2);
+
+ DALI_TEST_EQUALS( root.GetDepth(), 0u, TEST_LOCATION);
+ DALI_TEST_EQUALS(layer1.GetDepth(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(layer2.GetDepth(), 2u, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLayerRaise(void)
+{
+ tet_infoline("Testing Dali::Layer::Raise()");
+ TestApplication application;
+ Layer layer1 = Layer::New();
+ Layer layer2 = Layer::New();
+
+ Stage::GetCurrent().Add(layer1);
+ Stage::GetCurrent().Add(layer2);
+ DALI_TEST_EQUALS(layer1.GetDepth(), 1u, TEST_LOCATION);
+
+ layer1.Raise();
+ DALI_TEST_EQUALS(layer1.GetDepth(), 2u, TEST_LOCATION);
+
+ // get root
+ Layer root = Stage::GetCurrent().GetLayer( 0 );
+ DALI_TEST_EQUALS( root.GetDepth(), 0u, TEST_LOCATION);
+ root.Raise();
+ DALI_TEST_EQUALS( root.GetDepth(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(layer1.GetDepth(), 2u, TEST_LOCATION);
+ DALI_TEST_EQUALS(layer2.GetDepth(), 0u, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLayerLower(void)
+{
+ tet_infoline("Testing Dali::Layer::Lower()");
+ TestApplication application;
+ Layer layer1 = Layer::New();
+ Layer layer2 = Layer::New();
+
+ Stage::GetCurrent().Add(layer1);
+ Stage::GetCurrent().Add(layer2);
+ DALI_TEST_EQUALS(layer2.GetDepth(), 2u, TEST_LOCATION);
+
+ layer2.Lower();
+ DALI_TEST_EQUALS(layer2.GetDepth(), 1u, TEST_LOCATION);
+
+ // get root
+ Layer root = Stage::GetCurrent().GetLayer( 0 );
+ root.Lower();
+ DALI_TEST_EQUALS( root.GetDepth(), 0u, TEST_LOCATION);
+ layer2.Lower();
+ DALI_TEST_EQUALS( root.GetDepth(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(layer2.GetDepth(), 0u, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLayerRaiseToTop(void)
+{
+ tet_infoline("Testing Dali::Layer::RaiseToTop()");
+ TestApplication application;
+ Layer layer1 = Layer::New();
+ Layer layer2 = Layer::New();
+ Layer layer3 = Layer::New();
+
+ Stage::GetCurrent().Add(layer1);
+ Stage::GetCurrent().Add(layer2);
+ Stage::GetCurrent().Add(layer3);
+ Layer root = Stage::GetCurrent().GetLayer( 0 );
+
+ DALI_TEST_EQUALS( root.GetDepth(), 0u, TEST_LOCATION);
+ DALI_TEST_EQUALS(layer1.GetDepth(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(layer2.GetDepth(), 2u, TEST_LOCATION);
+ DALI_TEST_EQUALS(layer3.GetDepth(), 3u, TEST_LOCATION);
+
+ layer1.RaiseToTop();
+ DALI_TEST_EQUALS(layer1.GetDepth(), 3u, TEST_LOCATION);
+
+ root.RaiseToTop();
+ DALI_TEST_EQUALS( root.GetDepth(), 3u, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLayerLowerToBottom(void)
+{
+ tet_infoline("Testing Dali::Layer::LowerToBottom()");
+ TestApplication application;
+ Layer layer1 = Layer::New();
+ Layer layer2 = Layer::New();
+ Layer layer3 = Layer::New();
+
+ Stage::GetCurrent().Add(layer1);
+ Stage::GetCurrent().Add(layer2);
+ Stage::GetCurrent().Add(layer3);
+
+ DALI_TEST_EQUALS(layer1.GetDepth(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(layer2.GetDepth(), 2u, TEST_LOCATION);
+ DALI_TEST_EQUALS(layer3.GetDepth(), 3u, TEST_LOCATION);
+
+ layer3.LowerToBottom();
+ DALI_TEST_EQUALS(layer3.GetDepth(), 0u, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLayerSetClipping(void)
+{
+ tet_infoline("Testing Dali::Layer::SetClipping()");
+ TestApplication application;
+
+ Layer layer = Layer::New();
+ DALI_TEST_CHECK(!layer.IsClipping());
+
+ layer.SetClipping(true);
+ DALI_TEST_CHECK(layer.IsClipping());
+ END_TEST;
+}
+
+int UtcDaliLayerIsClipping(void)
+{
+ tet_infoline("Testing Dali::Layer::IsClipping()");
+ TestApplication application;
+
+ Layer layer = Layer::New();
+ DALI_TEST_CHECK(!layer.IsClipping());
+ END_TEST;
+}
+
+int UtcDaliLayerSetClippingBox(void)
+{
+ tet_infoline("Testing Dali::Layer::SetClippingBox()");
+ TestApplication application;
+
+ ClippingBox testBox(5,6, 77,83);
+
+ Layer layer = Layer::New();
+ DALI_TEST_CHECK(layer.GetClippingBox() != testBox);
+
+ layer.SetClippingBox(5,6, 77,83);
+ DALI_TEST_CHECK(layer.GetClippingBox() == testBox);
+ END_TEST;
+}
+
+int UtcDaliLayerGetClippingBox(void)
+{
+ tet_infoline("Testing Dali::Layer::GetClippingBox()");
+ TestApplication application;
+
+ Layer layer = Layer::New();
+ DALI_TEST_CHECK(layer.GetClippingBox() == ClippingBox(0,0,0,0));
+ END_TEST;
+}
+
+static int gTestSortFunctionCalled;
+
+static float TestSortFunction(const Vector3& /*position*/, float /*sortModifier*/)
+{
+ ++gTestSortFunctionCalled;
+ return 0.0f;
+}
+
+int UtcDaliLayerSetSortFunction(void)
+{
+ tet_infoline("Testing Dali::Layer::SetSortFunction()");
+ TestApplication application;
+ BitmapImage img = BitmapImage::New( 1,1 );
+ // create two transparent actors so there is something to sort
+ ImageActor actor = ImageActor::New( img );
+ ImageActor actor2 = ImageActor::New( img );
+ actor.SetSize(1,1);
+ actor.SetColor( Vector4(1, 1, 1, 0.5f ) ); // 50% transparent
+ actor2.SetSize(1,1);
+ actor2.SetColor( Vector4(1, 1, 1, 0.5f ) ); // 50% transparent
+
+ // add to stage
+ Stage::GetCurrent().Add( actor );
+ Stage::GetCurrent().Add( actor2 );
+
+ Layer root = Stage::GetCurrent().GetLayer( 0 );
+ gTestSortFunctionCalled = 0;
+ root.SetSortFunction(TestSortFunction);
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK( gTestSortFunctionCalled > 0 );
+ END_TEST;
+}
+
+
+int UtcDaliLayerRaiseAbove(void)
+{
+ tet_infoline("Testing Dali::Layer::RaiseAbove()");
+ TestApplication application;
+ Layer layer = Layer::New();
+ // try to raise above root layer
+ Layer root = Stage::GetCurrent().GetLayer( 0 );
+ layer.RaiseAbove( root );
+ // layer depth is zero as its not on stage
+ DALI_TEST_EQUALS( layer.GetDepth(), 0u, TEST_LOCATION );
+ // add to stage
+ Stage::GetCurrent().Add( layer );
+ layer.RaiseAbove( root );
+ DALI_TEST_EQUALS( layer.GetDepth(), 1u, TEST_LOCATION );
+ root.RaiseAbove( layer );
+ DALI_TEST_EQUALS( layer.GetDepth(), 0u, TEST_LOCATION );
+ layer.RaiseAbove( layer );
+ DALI_TEST_EQUALS( layer.GetDepth(), 0u, TEST_LOCATION );
+
+ // make another layer on the stage
+ Layer layer2 = Layer::New();
+ Stage::GetCurrent().Add( layer2 );
+ layer.RaiseAbove( layer2 );
+ DALI_TEST_GREATER( layer.GetDepth(), layer2.GetDepth(), TEST_LOCATION );
+ layer2.RaiseAbove( layer );
+ DALI_TEST_GREATER( layer2.GetDepth(), layer.GetDepth(), TEST_LOCATION );
+ root.RaiseAbove( layer2 );
+ DALI_TEST_GREATER( root.GetDepth(), layer2.GetDepth(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliLayerRaiseBelow(void)
+{
+ tet_infoline("Testing Dali::Layer::RaiseBelow()");
+ TestApplication application;
+ Layer layer = Layer::New();
+ // try to lower below root layer
+ Layer root = Stage::GetCurrent().GetLayer( 0 );
+ layer.LowerBelow( root );
+ // layer depth is zero as its not on stage
+ DALI_TEST_EQUALS( layer.GetDepth(), 0u, TEST_LOCATION );
+ // add to stage
+ Stage::GetCurrent().Add( layer );
+ DALI_TEST_EQUALS( layer.GetDepth(), 1u, TEST_LOCATION );
+ layer.LowerBelow( root );
+ DALI_TEST_EQUALS( layer.GetDepth(), 0u, TEST_LOCATION );
+ root.LowerBelow( layer );
+ DALI_TEST_EQUALS( layer.GetDepth(), 1u, TEST_LOCATION );
+ layer.LowerBelow( layer );
+ DALI_TEST_EQUALS( layer.GetDepth(), 1u, TEST_LOCATION );
+
+ // make another layer on the stage
+ Layer layer2 = Layer::New();
+ Stage::GetCurrent().Add( layer2 );
+ layer.LowerBelow( layer2 );
+ DALI_TEST_GREATER( layer2.GetDepth(), layer.GetDepth(), TEST_LOCATION );
+ layer2.LowerBelow( layer );
+ DALI_TEST_GREATER( layer.GetDepth(), layer2.GetDepth(), TEST_LOCATION );
+ root.LowerBelow( layer2 );
+ DALI_TEST_GREATER( layer2.GetDepth(), root.GetDepth(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliLayerMoveAbove(void)
+{
+ tet_infoline("Testing Dali::Layer::MoveAbove()");
+ TestApplication application;
+ Layer layer = Layer::New();
+ // try to raise above root layer
+ Layer root = Stage::GetCurrent().GetLayer( 0 );
+ layer.MoveAbove( root );
+ // layer depth is zero as its not on stage
+ DALI_TEST_EQUALS( layer.GetDepth(), 0u, TEST_LOCATION );
+ root.MoveAbove( layer );
+ // root depth is zero as layer is not on stage
+ DALI_TEST_EQUALS( layer.GetDepth(), 0u, TEST_LOCATION );
+ // add to stage
+ Stage::GetCurrent().Add( layer );
+ layer.MoveAbove( root );
+ DALI_TEST_EQUALS( layer.GetDepth(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( root.GetDepth(), 0u, TEST_LOCATION );
+ root.MoveAbove( layer );
+ DALI_TEST_EQUALS( layer.GetDepth(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( root.GetDepth(), 1u, TEST_LOCATION );
+
+ // make another layer on the stage
+ Layer layer2 = Layer::New();
+ Stage::GetCurrent().Add( layer2 );
+ layer.MoveAbove( layer2 );
+ DALI_TEST_EQUALS( layer.GetDepth(), layer2.GetDepth() + 1u, TEST_LOCATION );
+ layer2.MoveAbove( root );
+ DALI_TEST_EQUALS( layer2.GetDepth(), root.GetDepth() + 1u, TEST_LOCATION );
+ root.MoveAbove( layer );
+ DALI_TEST_EQUALS( root.GetDepth(), layer.GetDepth() + 1u, TEST_LOCATION );
+
+ Layer layer3 = Layer::New();
+ Stage::GetCurrent().Add( layer3 );
+ DALI_TEST_EQUALS( layer3.GetDepth(), 3u, TEST_LOCATION );
+ root.MoveAbove( layer3 );
+ DALI_TEST_EQUALS( root.GetDepth(), 3u, TEST_LOCATION );
+ DALI_TEST_EQUALS( layer3.GetDepth(), 2u, TEST_LOCATION );
+ DALI_TEST_EQUALS( Stage::GetCurrent().GetLayer( 0 ).GetDepth(), 0u, TEST_LOCATION );
+ layer3.MoveAbove( Stage::GetCurrent().GetLayer( 0 ) );
+ DALI_TEST_EQUALS( layer3.GetDepth(), 1u, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliLayerMoveBelow(void)
+{
+ tet_infoline("Testing Dali::Layer::MoveBelow()");
+ TestApplication application;
+ Layer layer = Layer::New();
+ // try to raise above root layer
+ Layer root = Stage::GetCurrent().GetLayer( 0 );
+ layer.MoveBelow( root );
+ // layer depth is zero as its not on stage
+ DALI_TEST_EQUALS( layer.GetDepth(), 0u, TEST_LOCATION );
+ root.MoveBelow( layer );
+ // root depth is zero as layer is not on stage
+ DALI_TEST_EQUALS( layer.GetDepth(), 0u, TEST_LOCATION );
+ // add to stage
+ Stage::GetCurrent().Add( layer );
+ layer.MoveBelow( root );
+ DALI_TEST_EQUALS( layer.GetDepth(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( root.GetDepth(), 1u, TEST_LOCATION );
+ root.MoveBelow( layer );
+ DALI_TEST_EQUALS( layer.GetDepth(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( root.GetDepth(), 0u, TEST_LOCATION );
+
+ // make another layer on the stage
+ Layer layer2 = Layer::New();
+ Stage::GetCurrent().Add( layer2 );
+ layer.MoveBelow( layer2 );
+ DALI_TEST_EQUALS( layer.GetDepth(), layer2.GetDepth() - 1u, TEST_LOCATION );
+ layer2.MoveBelow( root );
+ DALI_TEST_EQUALS( layer2.GetDepth(), root.GetDepth() - 1u, TEST_LOCATION );
+ root.MoveBelow( layer );
+ DALI_TEST_EQUALS( root.GetDepth(), layer.GetDepth() - 1u, TEST_LOCATION );
+
+ Layer layer3 = Layer::New();
+ Stage::GetCurrent().Add( layer3 );
+ DALI_TEST_EQUALS( layer3.GetDepth(), 3u, TEST_LOCATION );
+ root.MoveBelow( layer3 );
+ DALI_TEST_EQUALS( root.GetDepth(), 2u, TEST_LOCATION );
+ DALI_TEST_EQUALS( layer3.GetDepth(), 3u, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliLayerDefaultProperties(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Layer DefaultProperties");
+
+ Layer actor = Layer::New();
+
+ std::vector<Property::Index> indices ;
+ indices.push_back(Layer::CLIPPING_ENABLE );
+ indices.push_back(Layer::CLIPPING_BOX );
+
+ DALI_TEST_CHECK(actor.GetPropertyCount() == ( Actor::New().GetPropertyCount() + indices.size() ) );
+
+ for(std::vector<Property::Index>::iterator iter = indices.begin(); iter != indices.end(); ++iter)
+ {
+ DALI_TEST_CHECK( *iter == actor.GetPropertyIndex(actor.GetPropertyName(*iter)) );
+ DALI_TEST_CHECK( actor.IsPropertyWritable(*iter) );
+ DALI_TEST_CHECK( !actor.IsPropertyAnimatable(*iter) );
+ DALI_TEST_CHECK( actor.GetPropertyType(*iter) == actor.GetPropertyType(*iter) ); // just checking call succeeds
+ }
+
+ // set/get one of them
+ actor.SetClippingBox(0,0,0,0);
+
+ ClippingBox testBox(10,20,30,40);
+ DALI_TEST_CHECK(actor.GetClippingBox() != testBox);
+
+ actor.SetProperty(Layer::CLIPPING_BOX, Property::Value(Rect<int>(testBox)));
+
+ DALI_TEST_CHECK(Property::RECTANGLE == actor.GetPropertyType(Layer::CLIPPING_BOX)) ;
+
+ Property::Value v = actor.GetProperty(Layer::CLIPPING_BOX);
+
+ DALI_TEST_CHECK(v.Get<Rect<int> >() == testBox);
+
+ // set the same boundaries, but through a clipping box object
+ actor.SetClippingBox( testBox );
+
+ DALI_TEST_CHECK( actor.GetClippingBox() == testBox );
+
+ END_TEST;
+}
+
+int UtcDaliLayerSetDepthTestDisabled(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::Layer::SetDepthTestDisabled() ");
+
+ Layer actor = Layer::New();
+
+ DALI_TEST_CHECK( !actor.IsDepthTestDisabled() );
+
+ actor.SetDepthTestDisabled( true );
+ DALI_TEST_CHECK( actor.IsDepthTestDisabled() );
+ END_TEST;
+}
+
+int UtcDaliLayerCreateDestroy(void)
+{
+ tet_infoline("Testing Dali::Layer::CreateDestroy() ");
+ Layer* layer = new Layer;
+ DALI_TEST_CHECK( layer );
+ delete layer;
+ END_TEST;
+}
+
+int UtcDaliLayerPropertyIndices(void)
+{
+ TestApplication application;
+ Actor basicActor = Actor::New();
+ Layer layer = Layer::New();
+
+ Property::IndexContainer indices;
+ layer.GetPropertyIndices( indices );
+ DALI_TEST_CHECK( indices.size() > basicActor.GetPropertyCount() );
+ DALI_TEST_EQUALS( indices.size(), layer.GetPropertyCount(), TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_long_press_gesture_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_long_press_gesture_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+// Positive test case for a method
+int UtcDaliLongPressGestureConstructor(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ LongPressGesture gesture( Gesture::Started );
+ DALI_TEST_EQUALS(1u, gesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::LongPress, gesture.type, TEST_LOCATION);
+
+ // Test Copy constructor
+ gesture.numberOfTouches = 5u;
+
+ LongPressGesture gesture2(gesture);
+ DALI_TEST_EQUALS(5u, gesture2.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::LongPress, gesture2.type, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Started, gesture2.state, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureAssignment(void)
+{
+ // Test Assignment operator
+ LongPressGesture gesture( Gesture::Started );
+ DALI_TEST_EQUALS(1u, gesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::LongPress, gesture.type, TEST_LOCATION);
+
+ gesture.numberOfTouches = 5u;
+
+ LongPressGesture gesture2( Gesture::Finished );
+ DALI_TEST_EQUALS(Gesture::Finished, gesture2.state, TEST_LOCATION);
+ gesture2 = gesture;
+ DALI_TEST_EQUALS(5u, gesture2.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::LongPress, gesture2.type, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Started, gesture2.state, TEST_LOCATION);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/integration-api/events/touch-event-integ.h>
+#include <dali/integration-api/events/long-press-gesture-event.h>
+#include <dali/integration-api/system-overlay.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_long_press_gesture_detector_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_long_press_gesture_detector_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace
+{
+
+// Stores data that is populated in the callback and will be read by the TET cases
+struct SignalData
+{
+ SignalData()
+ : functorCalled( false ),
+ voidFunctorCalled( false ),
+ receivedGesture( Gesture::Clear ),
+ pressedActor()
+ {}
+
+ void Reset()
+ {
+ functorCalled = false;
+ voidFunctorCalled = false;
+
+ receivedGesture.numberOfTouches = 0u;
+ receivedGesture.screenPoint = Vector2(0.0f, 0.0f);
+ receivedGesture.localPoint = Vector2(0.0f, 0.0f);
+
+ pressedActor = NULL;
+ }
+
+ bool functorCalled;
+ bool voidFunctorCalled;
+ LongPressGesture receivedGesture;
+ Actor pressedActor;
+};
+
+// Functor that sets the data when called
+struct GestureReceivedFunctor
+{
+ GestureReceivedFunctor(SignalData& data) : signalData(data) { }
+
+ void operator()(Actor actor, LongPressGesture longPress)
+ {
+ signalData.functorCalled = true;
+ signalData.receivedGesture = longPress;
+ signalData.pressedActor = actor;
+ }
+
+ void operator()()
+ {
+ signalData.voidFunctorCalled = true;
+ }
+
+ SignalData& signalData;
+};
+
+// Functor that removes the gestured actor from stage
+struct UnstageActorFunctor : public GestureReceivedFunctor
+{
+ UnstageActorFunctor( SignalData& data, Gesture::State& stateToUnstage )
+ : GestureReceivedFunctor( data ),
+ stateToUnstage( stateToUnstage )
+ {
+ }
+
+ void operator()( Actor actor, LongPressGesture longPress )
+ {
+ GestureReceivedFunctor::operator()( actor, longPress );
+
+ if ( longPress.state == stateToUnstage )
+ {
+ Stage::GetCurrent().Remove( actor );
+ }
+ }
+
+ Gesture::State& stateToUnstage;
+};
+
+// Functor for receiving a touch event
+struct TouchEventFunctor
+{
+ bool operator()(Actor actor, const TouchEvent& touch)
+ {
+ //For line coverage
+ unsigned int points = touch.GetPointCount();
+ if( points > 0)
+ {
+ const TouchPoint& touchPoint = touch.GetPoint(0);
+ tet_printf("Touch Point state = %d\n", touchPoint.state);
+ }
+ return false;
+ }
+};
+
+// Generate a LongPressGestureEvent to send to Core
+Integration::LongPressGestureEvent GenerateLongPress(
+ Gesture::State state,
+ unsigned int numberOfTouches,
+ Vector2 point)
+{
+ Integration::LongPressGestureEvent longPress( state );
+
+ longPress.numberOfTouches = numberOfTouches;
+ longPress.point = point;
+
+ return longPress;
+}
+
+} // anon namespace
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+// Positive test case for a method
+int UtcDaliLongPressGestureDetectorConstructor(void)
+{
+ TestApplication application;
+
+ LongPressGestureDetector detector;
+ DALI_TEST_CHECK(!detector);
+ END_TEST;
+}
+
+
+int UtcDaliLongPressGestureDetectorNew(void)
+{
+ TestApplication application;
+
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ DALI_TEST_CHECK(detector);
+ DALI_TEST_EQUALS(1u, detector.GetMinimumTouchesRequired(), TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, detector.GetMaximumTouchesRequired(), TEST_LOCATION);
+
+ LongPressGestureDetector detector2 = LongPressGestureDetector::New(5u);
+ DALI_TEST_CHECK(detector2);
+ DALI_TEST_EQUALS(5u, detector2.GetMinimumTouchesRequired(), TEST_LOCATION);
+ DALI_TEST_EQUALS(5u, detector2.GetMaximumTouchesRequired(), TEST_LOCATION);
+
+ LongPressGestureDetector detector3 = LongPressGestureDetector::New(5u, 7u);
+ DALI_TEST_CHECK(detector2);
+ DALI_TEST_EQUALS(5u, detector3.GetMinimumTouchesRequired(), TEST_LOCATION);
+ DALI_TEST_EQUALS(7u, detector3.GetMaximumTouchesRequired(), TEST_LOCATION);
+
+ //Scoped test to test destructor
+ {
+ LongPressGestureDetector detector4 = LongPressGestureDetector::New();
+ DALI_TEST_CHECK(detector4);
+ }
+
+ // Attach an actor and emit a touch event on the actor to ensure complete line coverage
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ detector.Attach(actor);
+
+ TouchEventFunctor touchFunctor;
+ actor.TouchedSignal().Connect(&application, touchFunctor);
+
+ Integration::TouchEvent touchEvent(1);
+ TouchPoint point(1, TouchPoint::Down, 20.0f, 20.0f);
+ touchEvent.AddPoint(point);
+ application.ProcessEvent(touchEvent);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // For line coverage, Initialise default constructor
+ TouchEvent touchEvent2;
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureDetectorDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::LongPressGestureDetector::DownCast()");
+
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+
+ BaseHandle object(detector);
+
+ LongPressGestureDetector detector2 = LongPressGestureDetector::DownCast(object);
+ DALI_TEST_CHECK(detector2);
+
+ LongPressGestureDetector detector3 = DownCast< LongPressGestureDetector >(object);
+ DALI_TEST_CHECK(detector3);
+
+ BaseHandle unInitializedObject;
+ LongPressGestureDetector detector4 = LongPressGestureDetector::DownCast(unInitializedObject);
+ DALI_TEST_CHECK(!detector4);
+
+ LongPressGestureDetector detector5 = DownCast< LongPressGestureDetector >(unInitializedObject);
+ DALI_TEST_CHECK(!detector5);
+
+ GestureDetector detector6 = LongPressGestureDetector::New();
+ LongPressGestureDetector detector7 = LongPressGestureDetector::DownCast(detector6);
+ DALI_TEST_CHECK(detector7);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureSetTouchesRequired01(void)
+{
+ TestApplication application;
+
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+
+ unsigned int touches = 3;
+
+ DALI_TEST_CHECK(touches != detector.GetMinimumTouchesRequired());
+ DALI_TEST_CHECK(touches != detector.GetMaximumTouchesRequired());
+
+ detector.SetTouchesRequired(touches);
+
+ DALI_TEST_EQUALS(touches, detector.GetMinimumTouchesRequired(), TEST_LOCATION);
+ DALI_TEST_EQUALS(touches, detector.GetMaximumTouchesRequired(), TEST_LOCATION);
+
+ // Attach an actor and change the required touches
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ TestGestureManager& gestureManager = application.GetGestureManager();
+ gestureManager.Initialize();
+
+ detector.SetTouchesRequired(4);
+
+ // Gesture detection should have been updated only
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+
+ // Reset values
+ gestureManager.Initialize();
+
+ // Create a second gesture detector that requires even less maximum touches
+ LongPressGestureDetector secondDetector = LongPressGestureDetector::New();
+ secondDetector.Attach(actor);
+
+ // Gesture detection should have been updated
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureSetTouchesRequired02(void)
+{
+ TestApplication application;
+
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+
+ unsigned int min = 3;
+ unsigned int max = 5;
+
+ DALI_TEST_CHECK(min != detector.GetMinimumTouchesRequired());
+ DALI_TEST_CHECK(max != detector.GetMaximumTouchesRequired());
+
+ detector.SetTouchesRequired(min, max);
+
+ DALI_TEST_EQUALS(min, detector.GetMinimumTouchesRequired(), TEST_LOCATION);
+ DALI_TEST_EQUALS(max, detector.GetMaximumTouchesRequired(), TEST_LOCATION);
+
+ // Attach an actor and change the maximum touches
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ TestGestureManager& gestureManager = application.GetGestureManager();
+ gestureManager.Initialize();
+
+ detector.SetTouchesRequired(4, 5);
+
+ // Gesture detection should have been updated only
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+
+ // Reset values
+ gestureManager.Initialize();
+
+ // Create a second gesture detector that requires even less maximum touches
+ LongPressGestureDetector secondDetector = LongPressGestureDetector::New();
+ secondDetector.Attach(actor);
+
+ // Gesture detection should have been updated
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureGetMinimumTouchesRequired(void)
+{
+ TestApplication application;
+
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ DALI_TEST_EQUALS(1u, detector.GetMinimumTouchesRequired(), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureGetMaximumTouchesRequired(void)
+{
+ TestApplication application;
+
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ DALI_TEST_EQUALS(1u, detector.GetMaximumTouchesRequired(), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureSignalReceptionNegative(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Do a long press outside actor's area
+ application.ProcessEvent( GenerateLongPress( Gesture::Possible, 1u, Vector2(112.0f, 112.0f ) ) );
+ application.ProcessEvent( GenerateLongPress( Gesture::Started, 1u, Vector2(112.0f, 112.0f ) ) );
+ application.ProcessEvent( GenerateLongPress( Gesture::Finished, 1u, Vector2(112.0f, 112.0f ) ) );
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureSignalReceptionPositive(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Do a long press inside actor's area
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 50.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 50.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS( Vector2(50.0f, 50.0f), data.receivedGesture.localPoint, 0.1, TEST_LOCATION);
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 50.0f)));
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureSignalReceptionDetach(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Start long press within the actor's area
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(20.0f, 20.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS( Vector2(20.0f, 20.0f), data.receivedGesture.localPoint, 0.1, TEST_LOCATION);
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(20.0f, 20.0f)));
+
+ // repeat the long press within the actor's area - we should still receive the signal
+ data.Reset();
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 50.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 50.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS( Vector2(50.0f, 50.0f), data.receivedGesture.localPoint, 0.1, TEST_LOCATION);
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 50.0f)));
+
+ // Detach actor
+ detector.DetachAll();
+
+ // Ensure we are no longer signalled
+ data.Reset();
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(20.0f, 20.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 50.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureSignalReceptionActorDestroyedDuringLongPress(void)
+{
+ TestApplication application;
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Actor lifetime is scoped
+ {
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ detector.Attach(actor);
+
+ // Start long press within the actor's area
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(20.0f, 20.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Remove the actor from stage and reset the data
+ Stage::GetCurrent().Remove(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+ }
+
+ // Actor should now have been destroyed
+
+ data.Reset();
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureSignalReceptionRotatedActor(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetRotation(Dali::Degree(90.0f), Vector3::ZAXIS);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Do a long press
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(5.0f, 5.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(5.0f, 5.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(5.0f, 5.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS( Vector2(5.0f, 5.0f), data.receivedGesture.screenPoint, 0.1, TEST_LOCATION);
+
+ // Rotate actor again and render
+ actor.SetRotation(Dali::Degree(180.0f), Vector3::ZAXIS);
+ application.SendNotification();
+ application.Render();
+
+ // Do another long press, should still receive event
+ data.Reset();
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(5.0f, 5.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(5.0f, 5.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(5.0f, 5.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS( Vector2(5.0f, 5.0f), data.receivedGesture.screenPoint, 0.1, TEST_LOCATION);
+
+ // Rotate actor again and render
+ actor.SetRotation(Dali::Degree(90.0f), Vector3::YAXIS);
+ application.SendNotification();
+ application.Render();
+
+ // Do a long press, inside where the actor used to be, Should not receive the event
+ data.Reset();
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(70.0f, 70.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(70.0f, 70.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(70.0f, 70.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureSignalReceptionChildHit(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ parent.SetSize(100.0f, 100.0f);
+ parent.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(parent);
+
+ // Set child to completely cover parent.
+ // Change rotation of child to be different from parent so that we can check if our local coordinate
+ // conversion of the parent actor is correct.
+ Actor child = Actor::New();
+ child.SetSize(100.0f, 100.0f);
+ child.SetAnchorPoint(AnchorPoint::CENTER);
+ child.SetParentOrigin(ParentOrigin::CENTER);
+ child.SetRotation(Dali::Degree(90.0f), Vector3::ZAXIS);
+ parent.Add(child);
+
+ TouchEventFunctor touchFunctor;
+ child.TouchedSignal().Connect(&application, touchFunctor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ detector.Attach(parent);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Do long press - hits child area but parent should still receive it
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 50.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 50.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 50.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, parent == data.pressedActor, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(50.0f, 50.0f), data.receivedGesture.screenPoint, 0.01f, TEST_LOCATION);
+
+ // Attach child and generate same touch points
+ // (Also proves that you can detach and then re-attach another actor)
+ detector.Attach(child);
+ detector.Detach(parent);
+
+ // Do an entire long press, only check finished value
+ data.Reset();
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(51.0f, 51.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(51.0f, 51.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(51.0f, 51.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, child == data.pressedActor, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(51.0f, 51.0f), data.receivedGesture.screenPoint, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureSignalReceptionAttachDetachMany(void)
+{
+ TestApplication application;
+
+ Actor first = Actor::New();
+ first.SetSize(100.0f, 100.0f);
+ first.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(first);
+
+ Actor second = Actor::New();
+ second.SetSize(100.0f, 100.0f);
+ second.SetX(100.0f);
+ second.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(second);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ detector.Attach(first);
+ detector.Attach(second);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // LongPress within second actor's area
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(120.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(120.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(120.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, second == data.pressedActor, TEST_LOCATION);
+
+ // LongPress within first actor's area
+ data.Reset();
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(20.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(20.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, first == data.pressedActor, TEST_LOCATION);
+
+ // Detach the second actor
+ detector.Detach(second);
+
+ // second actor shouldn't receive event
+ data.Reset();
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(120.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(120.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(120.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // first actor should continue receiving event
+ data.Reset();
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(20.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(20.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureSignalReceptionActorBecomesUntouchable(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // LongPress in actor's area
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Actor becomes invisible - actor should not receive the next long press
+ actor.SetVisible(false);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // LongPress in the same area, shouldn't receive event
+ data.Reset();
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureSignalReceptionMultipleGestureDetectors(void)
+{
+ TestApplication application;
+ Dali::TestGestureManager& gestureManager = application.GetGestureManager();
+
+ Actor first = Actor::New();
+ first.SetSize(100.0f, 100.0f);
+ first.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(first);
+
+ Actor second = Actor::New();
+ second.SetSize(100.0f, 100.0f);
+ second.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ second.SetX(100.0f);
+ first.Add(second);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ LongPressGestureDetector firstDetector = LongPressGestureDetector::New();
+ firstDetector.Attach(first);
+ firstDetector.DetectedSignal().Connect(&application, functor);
+
+ // secondDetector is scoped
+ {
+ // Reset gestureManager statistics
+ gestureManager.Initialize();
+
+ LongPressGestureDetector secondDetector = LongPressGestureDetector::New();
+ secondDetector.SetTouchesRequired(2);
+ secondDetector.Attach(second);
+ secondDetector.DetectedSignal().Connect(&application, functor);
+
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+
+ // LongPress within second actor's area
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 2u, Vector2(150.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 2u, Vector2(150.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 2u, Vector2(150.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, second == data.pressedActor, TEST_LOCATION);
+
+ // LongPress continues as single touch gesture - we should not receive any gesture
+ data.Reset();
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(150.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(150.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(150.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Single touch long press starts - first actor should receive gesture
+ data.Reset();
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, first == data.pressedActor, TEST_LOCATION);
+
+ // long press changes to double-touch - we shouldn't receive event
+ data.Reset();
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 2u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 2u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 2u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Reset gesture manager statistics
+ gestureManager.Initialize();
+ }
+
+ // secondDetector has now been deleted. Gesture detection should have been updated only
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureSignalReceptionMultipleDetectorsOnActor(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to one detector
+ SignalData firstData;
+ GestureReceivedFunctor firstFunctor(firstData);
+ LongPressGestureDetector firstDetector = LongPressGestureDetector::New();
+ firstDetector.Attach(actor);
+ firstDetector.DetectedSignal().Connect(&application, firstFunctor);
+
+ // Attach actor to another detector
+ SignalData secondData;
+ GestureReceivedFunctor secondFunctor(secondData);
+ LongPressGestureDetector secondDetector = LongPressGestureDetector::New();
+ secondDetector.Attach(actor);
+ secondDetector.DetectedSignal().Connect(&application, secondFunctor);
+
+ // LongPress in actor's area - both detector's functors should be called
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, firstData.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, secondData.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureSignalReceptionDifferentPossible(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // LongPress possible in actor's area.
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Move actor somewhere else
+ actor.SetPosition( 100.0f, 100.0f );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Emit Started event, we should not receive the long press.
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // LongPress possible in empty area.
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Move actor in to the long press position.
+ actor.SetPosition( 0.0f, 0.0f );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Emit Started event, we should not receive the long press.
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Normal long press in actor's area for completeness.
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureEmitIncorrecteStateClear(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Try a Clear state
+ try
+ {
+ application.ProcessEvent(GenerateLongPress(Gesture::Clear, 1u, Vector2(50.0f, 10.0f)));
+ tet_result(TET_FAIL);
+ }
+ catch ( Dali::DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "false", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureEmitIncorrectStateContinuing(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Try a Continuing state
+ try
+ {
+ application.ProcessEvent(GenerateLongPress(Gesture::Continuing, 1u, Vector2(50.0f, 10.0f)));
+ tet_result(TET_FAIL);
+ }
+ catch ( Dali::DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "false", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureRepeatedState(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Two possibles
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // ... Send some finished states, still no signal
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Send two Started states, should be signalled
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+
+ // Send two cancelled states, should not be signalled
+ application.ProcessEvent(GenerateLongPress(Gesture::Cancelled, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ application.ProcessEvent(GenerateLongPress(Gesture::Cancelled, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGesturePossibleCancelled(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Send a possible followed by a cancel, we should not be signalled
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ application.ProcessEvent(GenerateLongPress(Gesture::Cancelled, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureDetachAfterStarted(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Emit initial signal
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+
+ // Detach actor
+ detector.Detach(actor);
+
+ // Emit Finished, no signal
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureActorUnstaged(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // State to remove actor in.
+ Gesture::State stateToUnstage( Gesture::Started );
+
+ // Attach actor to detector
+ SignalData data;
+ UnstageActorFunctor functor( data, stateToUnstage );
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Emit signals
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Re-add actor to stage
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Change state to Gesture::Continuing to remove
+ stateToUnstage = Gesture::Finished;
+
+ // Emit signals
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ tet_result( TET_PASS ); // If we get here then we have handled actor stage removal gracefully.
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureActorStagedAndDestroyed(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Create and add a second actor so that GestureDetector destruction does not come into play.
+ Actor dummyActor( Actor::New() );
+ dummyActor.SetSize( 100.0f, 100.0f );
+ dummyActor.SetPosition( 100.0f, 100.0f );
+ dummyActor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(dummyActor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // State to remove actor in.
+ Gesture::State stateToUnstage( Gesture::Started );
+
+ // Attach actor to detector
+ SignalData data;
+ UnstageActorFunctor functor( data, stateToUnstage );
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ detector.Attach(actor);
+ detector.Attach(dummyActor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Here we are testing a Started actor which is removed in the Started callback, but then added back
+ // before we get a finished state. As we were removed from the stage, even if we're at the same
+ // position, we should still not be signalled.
+
+ // Emit signals
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Re add to the stage, we should not be signalled
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Continue signal emission
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+
+ // Here we delete an actor in started, we should not receive any subsequent signalling.
+
+ // Emit signals
+ application.ProcessEvent(GenerateLongPress(Gesture::Possible, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateLongPress(Gesture::Started, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Delete actor as well
+ actor = NULL;
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Continue signal emission
+ application.ProcessEvent(GenerateLongPress(Gesture::Finished, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliLongPressGestureSystemOverlay(void)
+{
+ TestApplication application;
+ Dali::Integration::Core& core = application.GetCore();
+ Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() );
+ systemOverlay.GetOverlayRenderTasks().CreateTask();
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ systemOverlay.Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ LongPressGestureDetector detector = LongPressGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Do a long press inside actor's area
+ Vector2 screenCoords( 50.0f, 50.0f );
+ application.ProcessEvent( GenerateLongPress( Gesture::Possible, 1u, screenCoords ) );
+ application.ProcessEvent( GenerateLongPress( Gesture::Started, 1u, screenCoords ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+
+void utc_dali_material_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_material_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+static AnimatableMesh CreateMeshData(Material material)
+{
+ AnimatableMesh::Faces faces;
+ for(int i=0; i<10-3; i++)
+ {
+ faces.push_back(i);
+ faces.push_back(i+1);
+ faces.push_back(i+2);
+ }
+ return AnimatableMesh::New(10, faces, material);
+}
+
+}// anonymous namespace
+
+
+// Positive test case for a method
+int UtcDaliMaterialNew01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing constructors, New and destructors");
+
+ Material material;
+ DALI_TEST_CHECK( ! material );
+
+ material = Material::New("material");
+ DALI_TEST_CHECK( material );
+
+ Material* material2 = new Material();
+ DALI_TEST_CHECK( ! *material2 );
+ delete material2;
+
+ Material material3 = material;
+ Material material4;
+ material4 = material;
+ Material material5 = material;
+ END_TEST;
+}
+
+
+int UtcDaliMaterialDownCast(void)
+{
+ TestApplication application;
+
+ Material material = Material::New("material");
+ BaseHandle handle(material);
+
+ Material mat2 = Material::DownCast( handle );
+ DALI_TEST_CHECK( mat2 );
+ END_TEST;
+}
+
+int UtcDaliMaterialSettersAndGetters(void)
+{
+ TestApplication application;
+ Material material = Material::New("material");
+ DALI_TEST_EQUALS( material.GetName(), "material", TEST_LOCATION );
+ material.SetName( "AnotherMaterial" );
+ DALI_TEST_EQUALS( material.GetName(), "AnotherMaterial", TEST_LOCATION );
+
+ DALI_TEST_EQUALS( material.GetOpacity(), Material::DEFAULT_OPACITY, 0.001, TEST_LOCATION);
+ material.SetOpacity(0.38f);
+ DALI_TEST_EQUALS( material.GetOpacity(), 0.38f, 0.001, TEST_LOCATION);
+
+ DALI_TEST_EQUALS( material.GetShininess(), Material::DEFAULT_SHININESS, 0.001, TEST_LOCATION);
+ material.SetShininess(0.47f);
+ DALI_TEST_EQUALS( material.GetShininess(), 0.47f, 0.001, TEST_LOCATION);
+
+ DALI_TEST_EQUALS( material.GetAmbientColor(), Material::DEFAULT_AMBIENT_COLOR, 0.001, TEST_LOCATION);
+ material.SetAmbientColor(Color::BLACK);
+ DALI_TEST_EQUALS( material.GetAmbientColor(), Color::BLACK, 0.001, TEST_LOCATION);
+
+ DALI_TEST_EQUALS( material.GetDiffuseColor(), Material::DEFAULT_DIFFUSE_COLOR, 0.001, TEST_LOCATION);
+ material.SetDiffuseColor(Color::BLUE);
+ DALI_TEST_EQUALS( material.GetDiffuseColor(), Color::BLUE, 0.001, TEST_LOCATION);
+
+ DALI_TEST_EQUALS( material.GetSpecularColor(), Material::DEFAULT_SPECULAR_COLOR, 0.001, TEST_LOCATION);
+ material.SetSpecularColor(Color::GREEN);
+ DALI_TEST_EQUALS( material.GetSpecularColor(), Color::GREEN, 0.001, TEST_LOCATION);
+
+ DALI_TEST_EQUALS( material.GetEmissiveColor(), Material::DEFAULT_EMISSIVE_COLOR, 0.001, TEST_LOCATION);
+ material.SetEmissiveColor(Color::MAGENTA);
+ DALI_TEST_EQUALS( material.GetEmissiveColor(), Color::MAGENTA, 0.001, TEST_LOCATION);
+
+ material.SetDiffuseTextureFileName("diffuse-texture.png");
+ DALI_TEST_EQUALS( material.GetDiffuseFileName(), "diffuse-texture.png", TEST_LOCATION);
+
+ material.SetOpacityTextureFileName("opacity-texture.png");
+ DALI_TEST_EQUALS( material.GetOpacityTextureFileName(), "opacity-texture.png", TEST_LOCATION);
+
+ material.SetNormalMapFileName("normal-map.png");
+ DALI_TEST_EQUALS( material.GetNormalMapFileName(), "normal-map.png", TEST_LOCATION);
+
+ Image diffuseTexture = Image::New("diffuse-texture.png");
+ material.SetDiffuseTexture(diffuseTexture);
+ DALI_TEST_EQUALS( material.GetDiffuseTexture(), diffuseTexture, TEST_LOCATION );
+
+ Image opacityTexture = Image::New("opacity-texture.png");
+ material.SetOpacityTexture(opacityTexture);
+ DALI_TEST_EQUALS( material.GetOpacityTexture(), opacityTexture, TEST_LOCATION);
+
+ Image normalMap = Image::New("normal-map.png");
+ material.SetNormalMap(normalMap);
+ DALI_TEST_EQUALS( material.GetNormalMap(), normalMap, TEST_LOCATION);
+
+ DALI_TEST_EQUALS( material.GetMapU(), (unsigned int)Material::DEFAULT_MAPPING_MODE, TEST_LOCATION );
+ DALI_TEST_EQUALS( material.GetMapV(), (unsigned int)Material::DEFAULT_MAPPING_MODE, TEST_LOCATION );
+ material.SetMapU( Material::MAPPING_MODE_WRAP );
+ material.SetMapV( Material::MAPPING_MODE_MIRROR );
+ DALI_TEST_EQUALS( material.GetMapU(), (unsigned int)Material::MAPPING_MODE_WRAP, TEST_LOCATION );
+ DALI_TEST_EQUALS( material.GetMapV(), (unsigned int)Material::MAPPING_MODE_MIRROR, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( material.GetDiffuseUVIndex(), Material::DEFAULT_DIFFUSE_UV_INDEX, TEST_LOCATION );
+ material.SetDiffuseUVIndex( 1u );
+ DALI_TEST_EQUALS( material.GetDiffuseUVIndex(), 1u, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( material.GetOpacityUVIndex(), Material::DEFAULT_OPACITY_UV_INDEX, TEST_LOCATION );
+ material.SetOpacityUVIndex( 1u );
+ DALI_TEST_EQUALS( material.GetOpacityUVIndex(), 1u, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( material.GetNormalUVIndex(), Material::DEFAULT_NORMAL_UV_INDEX, TEST_LOCATION );
+ material.SetNormalUVIndex( 1u );
+ DALI_TEST_EQUALS( material.GetNormalUVIndex(), 1u, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( material.GetHasHeightMap(), Material::DEFAULT_HAS_HEIGHT_MAP, TEST_LOCATION );
+ material.SetHasHeightMap(true);
+ DALI_TEST_EQUALS( material.GetHasHeightMap(), true, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliMaterialStage01(void)
+{
+ TestApplication application;
+ TraceCallStack& textureTrace = application.GetGlAbstraction().GetTextureTrace();
+ textureTrace.Enable(true);
+ TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
+
+ {
+ Material material = Material::New("material");
+ Image image = Image::New( "image.png", Image::Immediate, Image::Never );
+ DALI_TEST_CHECK(image);
+ application.SendNotification();
+ application.Render(16);
+
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource(bitmap);
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ DALI_TEST_CHECK( request != NULL );
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
+ }
+
+ material.SetDiffuseTexture(image);
+ application.SendNotification();
+ application.Render();
+
+ AnimatableMesh mesh = CreateMeshData(material);
+
+ application.SendNotification();
+ application.Render();
+ {
+ MeshActor meshActor = MeshActor::New(mesh);
+ meshActor.SetSize(100, 100);
+ meshActor.SetAffectedByLighting(false);
+ Stage::GetCurrent().Add(meshActor);
+ application.SendNotification();
+ application.Render();
+
+ material.SetOpacity(0.5f);
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( material.GetOpacity(), 0.5f, 0.001f, TEST_LOCATION );
+
+ Stage::GetCurrent().Remove(meshActor);
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK( glAbstraction.CheckNoTexturesDeleted() );
+ DALI_TEST_CHECK( ! textureTrace.FindMethod( "DeleteTextures" ) );
+ }
+ application.SendNotification();
+ application.Render();
+
+ // Mesh should be destroyed, reducing connection count on material to zero.
+ // This should also reduce connection count on image to zero
+ DALI_TEST_EQUALS( material.GetOpacity(), 0.5f, 0.001f, TEST_LOCATION );
+ }
+ // SceneGraph::Material & SceneGraph::RenderMaterial should be destroyed
+ // Image should be destroyed
+ application.SendNotification();
+ application.Render();
+
+ application.Render();
+ DALI_TEST_CHECK( textureTrace.FindMethod( "DeleteTextures" ) );
+ DALI_TEST_CHECK( glAbstraction.CheckTextureDeleted( 23 ) );
+ END_TEST;
+}
+
+
+int UtcDaliMaterialStage01MemCheck(void)
+{
+ TestApplication application;
+ tet_result(TET_PASS);
+ END_TEST;
+}
+
+int UtcDaliMaterialStage02(void)
+{
+ TestApplication application;
+ TraceCallStack& textureTrace = application.GetGlAbstraction().GetTextureTrace();
+ textureTrace.Enable(true);
+ TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
+
+ {
+ Material material = Material::New("material");
+
+ Image image = Image::New( "image.png", Image::OnDemand, Image::Unused );
+ DALI_TEST_CHECK(image);
+ application.SendNotification();
+ application.Render(16);
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+ DALI_TEST_CHECK( application.GetPlatform().GetRequest() == NULL );
+
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+
+ material.SetDiffuseTexture(image);
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+ DALI_TEST_CHECK( application.GetPlatform().GetRequest() == NULL );
+
+ AnimatableMesh mesh = CreateMeshData(material);
+
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+ DALI_TEST_CHECK( application.GetPlatform().GetRequest() == NULL );
+
+ {
+ MeshActor meshActor = MeshActor::New(mesh);
+ meshActor.SetSize(100, 100);
+ meshActor.SetAffectedByLighting(false);
+ Stage::GetCurrent().Add(meshActor);
+ application.SendNotification();
+ application.Render();
+
+ // Image connection count should go to one - image should get loaded
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+ Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
+ DALI_TEST_CHECK( request != NULL );
+
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource(bitmap);
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
+ if(request)
+ {
+ application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
+ }
+ application.Render();
+
+ material.SetOpacity(0.5f);
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( material.GetOpacity(), 0.5f, 0.001f, TEST_LOCATION );
+
+ Stage::GetCurrent().Remove(meshActor);
+ application.SendNotification();
+ application.Render();
+
+ // This should reduce connection count on material to zero, freeing the texture:
+ DALI_TEST_CHECK( textureTrace.FindMethod( "DeleteTextures" ) );
+ DALI_TEST_CHECK( glAbstraction.CheckTextureDeleted( 23 ) );
+ }
+ application.SendNotification();
+ application.Render();
+
+ // Mesh should be destroyed, reducing connection count on material to zero.
+ // This should also reduce connection count on image to zero, freeing it
+ DALI_TEST_EQUALS( material.GetOpacity(), 0.5f, 0.001f, TEST_LOCATION );
+ }
+ application.SendNotification();
+ application.Render();
+
+ // SceneGraph::Material & SceneGraph::RenderMaterial should be destroyed
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_math_utils_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_math_utils_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+// Positive test case for a method
+int UtcDaliMathUtilsNextPowerOfTwo(void)
+{
+ Dali::TestApplication testApp;
+
+ DALI_TEST_EQUALS(NextPowerOfTwo(0), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(1), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(2), 2u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(3), 4u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(4), 4u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(5), 8u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(6), 8u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(7), 8u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(8), 8u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(255), 256u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(256), 256u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(257), 512u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(511), 512u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(512), 512u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(513), 1024u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(768), 1024u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(1023), 1024u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(1024), 1024u, TEST_LOCATION);
+ DALI_TEST_EQUALS(NextPowerOfTwo(1025), 2048u, TEST_LOCATION);
+ END_TEST;
+}
+
+
+// Positive test case for a method
+int UtcDaliMathUtilsIsPowerOfTwo(void)
+{
+ Dali::TestApplication testApp;
+
+ DALI_TEST_EQUALS(IsPowerOfTwo(0), false, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(IsPowerOfTwo(1), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(IsPowerOfTwo(2), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(IsPowerOfTwo(3), false, TEST_LOCATION);
+ DALI_TEST_EQUALS(IsPowerOfTwo(4), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(IsPowerOfTwo(5), false, TEST_LOCATION);
+ DALI_TEST_EQUALS(IsPowerOfTwo(6), false, TEST_LOCATION);
+ DALI_TEST_EQUALS(IsPowerOfTwo(7), false, TEST_LOCATION);
+ DALI_TEST_EQUALS(IsPowerOfTwo(8), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(IsPowerOfTwo(255), false, TEST_LOCATION);
+ DALI_TEST_EQUALS(IsPowerOfTwo(256), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(IsPowerOfTwo(257), false, TEST_LOCATION);
+ DALI_TEST_EQUALS(IsPowerOfTwo(511), false, TEST_LOCATION);
+ DALI_TEST_EQUALS(IsPowerOfTwo(512), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(IsPowerOfTwo(513), false, TEST_LOCATION);
+ DALI_TEST_EQUALS(IsPowerOfTwo(768), false, TEST_LOCATION);
+ DALI_TEST_EQUALS(IsPowerOfTwo(1023), false, TEST_LOCATION);
+ DALI_TEST_EQUALS(IsPowerOfTwo(1024), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(IsPowerOfTwo(1025), false, TEST_LOCATION);
+ END_TEST;
+}
+
+
+
+// Positive test case for a method
+int UtcDaliMathUtilsGetRangedEpsilon(void)
+{
+ Dali::TestApplication testApp;
+
+ DALI_TEST_EQUALS(GetRangedEpsilon(0.05f, 0.02f), Dali::Math::MACHINE_EPSILON_0, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(0.05f, 0.02f), Dali::Math::MACHINE_EPSILON_0, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(0.05f, 0.099f), Dali::Math::MACHINE_EPSILON_0, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(0.099f, 0.02f), Dali::Math::MACHINE_EPSILON_0, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(0.05f, 0.5f), Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(0.99f, 0.5f), Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(0.99f, 0.98f), Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(1.05f, 0.99f), Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(1.99f, 1.05f), Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(GetRangedEpsilon(2.0f, 1.99f), Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(0.05f, 2.0f), Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(1.0f, 3.0f), Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(9.99f, 0.5f), Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(9.99f, 1.5f), Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(9.99f, 9.99f), Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(9.99f, 10.0f), Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(19.99f, 10.0f), Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(GetRangedEpsilon(20.0f, 10.0f), Dali::Math::MACHINE_EPSILON_100, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(20.0f, 30.0f), Dali::Math::MACHINE_EPSILON_100, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(80.0f, 90.0f), Dali::Math::MACHINE_EPSILON_100, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(180.0f, 190.0f), Dali::Math::MACHINE_EPSILON_100, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(185.0f, 190.0f), Dali::Math::MACHINE_EPSILON_100, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(199.0f, 199.0f), Dali::Math::MACHINE_EPSILON_100, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(GetRangedEpsilon(200.0f, 190.0f), Dali::Math::MACHINE_EPSILON_1000, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(0.005f, 1999.0f), Dali::Math::MACHINE_EPSILON_1000, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(2000.0f, 190.0f), Dali::Math::MACHINE_EPSILON_10000, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(0.005f, 19999.0f), Dali::Math::MACHINE_EPSILON_10000, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(GetRangedEpsilon(1e07f, 0.99e09f), Dali::Math::MACHINE_EPSILON_10000, TEST_LOCATION);
+
+
+ DALI_TEST_EQUALS(GetRangedEpsilon(-0.05f, -0.02f), Dali::Math::MACHINE_EPSILON_0, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-0.05f, -0.02f), Dali::Math::MACHINE_EPSILON_0, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-0.05f, -0.099f), Dali::Math::MACHINE_EPSILON_0, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-0.099f, - 0.02f), Dali::Math::MACHINE_EPSILON_0, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-0.05f, -0.5f), Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-0.99f, -0.5f), Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-0.99f, -0.98f), Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-1.05f, -0.99f), Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-1.99f, -1.05f), Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(GetRangedEpsilon(-2.0f, - 1.99f), Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-0.05f, -2.0f), Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-1.0f, - 3.0f), Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-9.99f, -0.5f), Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-9.99f, -1.5f), Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-9.99f, -9.99f), Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-9.99f, -10.0f), Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-19.99f, -10.0f), Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(GetRangedEpsilon(-20.0f, -10.0f), Dali::Math::MACHINE_EPSILON_100, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-20.0f, -30.0f), Dali::Math::MACHINE_EPSILON_100, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-80.0f, -90.0f), Dali::Math::MACHINE_EPSILON_100, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-180.0f, -190.0f), Dali::Math::MACHINE_EPSILON_100, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-185.0f, -190.0f), Dali::Math::MACHINE_EPSILON_100, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-199.0f, -199.0f), Dali::Math::MACHINE_EPSILON_100, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(GetRangedEpsilon(-200.0f, -190.0f), Dali::Math::MACHINE_EPSILON_1000, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-0.005f, -1999.0f), Dali::Math::MACHINE_EPSILON_1000, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-2000.0f, -190.0f), Dali::Math::MACHINE_EPSILON_10000, TEST_LOCATION);
+ DALI_TEST_EQUALS(GetRangedEpsilon(-0.005f, -19999.0f), Dali::Math::MACHINE_EPSILON_10000, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(GetRangedEpsilon(-1e07f, -0.99e09f), Dali::Math::MACHINE_EPSILON_10000, TEST_LOCATION);
+
+
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliMathUtilsRound(void)
+{
+ Dali::TestApplication testApp;
+
+ DALI_TEST_EQUALS(Round(1.00001, 4), 1.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Round(0.99999f, 4), 1.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Round(-1.00001, 4), -1.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Round(-0.99999f, 4), -1.0f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliMathUtilsClamp(void)
+{
+ Dali::TestApplication testApp;
+
+ //floats
+ DALI_TEST_EQUALS(Clamp(-1.0f, 0.0f, 1.0f), 0.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Clamp(0.0f, -1.0f, 1.0f), 0.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Clamp(1.0f, 0.0f, 1.0f), 1.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Clamp(2.0f, 0.0f, 1.0f), 1.0f, TEST_LOCATION);
+
+ // integers
+ DALI_TEST_EQUALS(Clamp(-10, 0, 10), 0, TEST_LOCATION);
+ DALI_TEST_EQUALS(Clamp(0, -10, 10), 0, TEST_LOCATION);
+ DALI_TEST_EQUALS(Clamp(20, 0, 10), 10, TEST_LOCATION);
+
+ float value=-10.0f, min=-2.0f, max=4.0f;
+ ClampInPlace(value, min, max);
+ DALI_TEST_EQUALS(value, min, 0.001, TEST_LOCATION);
+
+ value = 10.0f;
+ ClampInPlace(value, min, max);
+ DALI_TEST_EQUALS(value, max, 0.001, TEST_LOCATION);
+
+ value = 3.0f;
+ ClampInPlace(value, min, max);
+ DALI_TEST_EQUALS(value, 3.0f, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliMathUtilsWrapInDomain(void)
+{
+ Dali::TestApplication testApp;
+
+ DALI_TEST_EQUALS(WrapInDomain(0.0f, 0.0f, 0.0f), 0.0f, Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(WrapInDomain(-5.0f, 0.0f, 0.0f), 0.0f, Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(WrapInDomain(5.0f, 0.0f, 0.0f), 0.0f, Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(WrapInDomain(0.0f, 0.0f, 10.0f), 0.0f, Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(WrapInDomain(-5.0f, 0.0f, 10.0f), 5.0f, Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(WrapInDomain(5.0f, 0.0f, 10.0f), 5.0f, Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(WrapInDomain(-2.5f, 0.0f, 10.0f), 7.5f, Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(WrapInDomain(2.5f, 0.0f, 10.0f), 2.5f, Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(WrapInDomain(2.5f, 0.0f, 1.0f), 0.5f, Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(WrapInDomain(2.5f, -2.0f, -1.0f), -1.5f, Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ DALI_TEST_EQUALS(WrapInDomain(-2.9f, -2.0f, -1.0f), -1.9f, Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(WrapInDomain(-1.1f, -2.0f, -1.0f), -1.1f, Dali::Math::MACHINE_EPSILON_1, TEST_LOCATION);
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliMathUtilsShortestDistanceInDomain(void)
+{
+ Dali::TestApplication testApp;
+
+ DALI_TEST_EQUALS(ShortestDistanceInDomain(1.0f, 8.0f, 0.0f, 10.0f), -3.0f, Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(ShortestDistanceInDomain(5.0f, 8.0f, 0.0f, 10.0f), 3.0f, Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(ShortestDistanceInDomain(5.0f, 8.0f, 4.0f, 9.0f), -2.0f, Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(ShortestDistanceInDomain(8.0f, 5.0f, 4.0f, 9.0f), 2.0f, Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(ShortestDistanceInDomain(0.65f, 0.1f, -1.0f, 1.0f), -0.55f, Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(ShortestDistanceInDomain(0.95f, -0.9f, -1.0f, 1.0f), 0.15f, Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ DALI_TEST_EQUALS(ShortestDistanceInDomain(0.0f, -0.9f, -1.0f, 1.0f), -0.9f, Dali::Math::MACHINE_EPSILON_10, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliMathUtilsEquals(void)
+{
+ float v=0.0f;
+
+ DALI_TEST_CHECK(EqualsZero(v));
+
+ v = Math::PI;
+ v -= (Math::PI_2 * 2.0f);
+ DALI_TEST_CHECK(EqualsZero(v));
+
+ float w=100.0f;
+ float x=w+1e-8f;
+ DALI_TEST_CHECK( Equals(w, x, GetRangedEpsilon( w, x )) );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <sstream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+
+void utc_dali_matrix_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_matrix_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+int UtcDaliMatrixCtor(void)
+{
+ // Test initialized startup
+ Matrix m1;
+
+ float r1[] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
+ float r2[] = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
+ Matrix mr1(r1);
+ Matrix mr2(r2);
+
+ DALI_TEST_EQUALS(m1, mr1, 0.001f, TEST_LOCATION);
+
+ // Test uninitialized startup
+ // Stack construct a matrix to non zero, then stack construct another matrix over the top of it.
+ float r3[] = { 1.0f, 2.0f, 3.0f, 4.0f, 1.0f, 2.0f, 3.0f, 4.0f, 1.0f, 2.0f, 3.0f, 4.0f, 1.0f, 2.0f, 3.0f, 4.0f};
+ {
+ Matrix m3(r3);
+ }
+ {
+ Matrix m2(false);
+
+ bool initialised = true;
+ {
+ float* els = m2.AsFloat();
+ for(size_t idx=0; idx<16; ++idx, ++els)
+ {
+ if(*els != 0.0f)
+ initialised = false;
+ }
+ }
+
+ DALI_TEST_EQUALS(initialised, false, TEST_LOCATION);
+ }
+
+ Matrix m4(true);
+ DALI_TEST_EQUALS(m4, mr1, 0.001f, TEST_LOCATION);
+
+ m4 = m4;
+ DALI_TEST_EQUALS(m4, mr1, 0.001f, TEST_LOCATION);
+
+ Matrix m5(false);
+ m5.SetIdentity();
+ Matrix m6 = m5;
+ DALI_TEST_EQUALS(m6, mr2, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+// OrthoNormalise fixes floating point errors from matrix rotations
+int UtcDaliMatrixOrthoNormalize0(void)
+{
+ Matrix m;
+ m.SetIdentity();
+
+ for (int i=0;i<1000;++i)
+ {
+ float f = i;
+ Vector4 axis(cosf(f*0.001f), cosf(f*0.02f), cosf(f*0.03f), 0.0f);
+ axis.Normalize();
+
+ m.SetTransformComponents( Vector3::ONE, Quaternion(1.0f, axis), Vector3::ZERO );
+ m.OrthoNormalize();
+ }
+
+ bool success = true;
+ success &= fabsf(m.GetXAxis().Dot(m.GetYAxis())) < 0.001f;
+ success &= fabsf(m.GetYAxis().Dot(m.GetXAxis())) < 0.001f;
+ success &= fabsf(m.GetZAxis().Dot(m.GetYAxis())) < 0.001f;
+
+ success &= fabsf(m.GetXAxis().Length() - 1.0f) < 0.001f;
+ success &= fabsf(m.GetYAxis().Length() - 1.0f) < 0.001f;
+ success &= fabsf(m.GetZAxis().Length() - 1.0f) < 0.001f;
+
+ DALI_TEST_CHECK(success);
+ END_TEST;
+}
+
+// OrthoNormalize is not flipping the axes and is maintaining the translation
+int UtcDaliMatrixOrthoNormalize1(void)
+{
+ for (int i=0;i<1000;++i)
+ {
+ float f = i;
+ Vector4 axis(cosf(f*0.001f), cosf(f*0.02f), cosf(f*0.03f), 0.0f);
+ axis.Normalize();
+ Vector3 center(10.0f, 15.0f, 5.0f);
+
+ Matrix m0;
+ m0.SetIdentity();
+ m0.SetTransformComponents( Vector3::ONE, Quaternion(1.0f, axis), center );
+
+ Matrix m1(m0);
+ m1.OrthoNormalize();
+
+ DALI_TEST_EQUALS(m0.GetXAxis(), m1.GetXAxis(), 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(m0.GetYAxis(), m1.GetYAxis(), 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(m0.GetZAxis(), m1.GetZAxis(), 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(m0.GetTranslation(), m1.GetTranslation(), 0.001f, TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+// Invert works
+int UtcDaliMatrixInvert01(void)
+{
+ // We're going to invert a whole load of different matrices to make sure we don't
+ // fail on particular orientations.
+ for (int i=0;i<1000;++i)
+ {
+ float f = i;
+ Vector4 axis(cosf(f*0.001f), cosf(f*0.02f), cosf(f*0.03f), 0.0f);
+ axis.Normalize();
+ Vector3 center(f, cosf(f) * 100.0f, cosf(f*0.5f) * 50.0f);
+
+ Matrix m0;
+ m0.SetIdentity();
+ m0.SetTransformComponents( Vector3::ONE, Quaternion(1.0f, axis), center );
+
+ Matrix m1(m0);
+ m1.Invert();
+
+ Matrix m2( false );
+ Matrix::Multiply( m2, m0, m1 );
+
+ DALI_TEST_EQUALS(m2, Matrix::IDENTITY, 0.001f, TEST_LOCATION);
+
+ m1.Invert(); // doube invert - should be back to m0
+
+ DALI_TEST_EQUALS(m0, m1, 0.001f, TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+int UtcDaliMatrixInvert02(void)
+{
+ Matrix m1 = Matrix::IDENTITY;
+ m1.SetXAxis(Vector3(0.0f, 0.0f, 0.0f));
+ DALI_TEST_EQUALS(m1.Invert(), false, TEST_LOCATION);
+ END_TEST;
+}
+
+
+// Invert transform works
+int UtcDaliMatrixInvertTransform01(void)
+{
+ for (int i=0;i<1000;++i)
+ {
+ float f = i;
+ Vector4 axis(cosf(f*0.001f), cosf(f*0.02f), cosf(f*0.03f), 0.0f);
+ axis.Normalize();
+ Vector3 center(f, cosf(f) * 100.0f, cosf(f*0.5f) * 50.0f);
+
+ Matrix m0;
+ m0.SetIdentity();
+ m0.SetTransformComponents( Vector3::ONE, Quaternion(1.0f, axis), center );
+
+ Matrix m1;
+ m0.InvertTransform(m1);
+
+ Matrix m2( false );
+ Matrix::Multiply( m2, m0, m1 );
+
+ DALI_TEST_EQUALS(m2, Matrix::IDENTITY, 0.001f, TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+// Invert transform works
+int UtcDaliMatrixInvertTransform02(void)
+{
+ std::string exceptionString( "EqualsZero( mMatrix[3] ) && EqualsZero( mMatrix[7] ) && EqualsZero( mMatrix[11] ) && Equals( mMatrix[15], 1.0f" );
+ try
+ {
+ float els[] = { 0.0f, 1.0f, 2.0f, 3.0f,
+ 4.0f, 5.0f, 6.0f, 7.0f,
+ 8.0f, 9.0f, 10.0f, 11.0f,
+ 12.0f, 13.0f, 14.0f, 15.0f };
+ Matrix m(els);
+
+ Matrix it;
+ m.InvertTransform(it);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, exceptionString, TEST_LOCATION );
+ }
+
+ try
+ {
+ float els[] = { 0.0f, 1.0f, 2.0f, 3.0f,
+ 4.0f, 5.0f, 6.0f, 7.0f,
+ 8.0f, 9.0f, 10.0f, 11.0f,
+ 12.0f, 13.0f, 14.0f, 15.0f };
+ Matrix m(els);
+
+ Matrix it;
+ m.InvertTransform(it);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, exceptionString, TEST_LOCATION );
+ }
+
+ try
+ {
+ float els[] = { 0.0f, 1.0f, 2.0f, 3.0f,
+ 4.0f, 5.0f, 6.0f, 7.0f,
+ 8.0f, 9.0f, 10.0f, 11.0f,
+ 12.0f, 13.0f, 14.0f, 15.0f };
+ Matrix m(els);
+
+ Matrix it;
+ m.InvertTransform(it);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, exceptionString, TEST_LOCATION );
+ }
+
+ try
+ {
+ float els[] = { 0.0f, 1.0f, 2.0f, 3.0f,
+ 4.0f, 5.0f, 6.0f, 7.0f,
+ 8.0f, 9.0f, 10.0f, 11.0f,
+ 12.0f, 13.0f, 14.0f, 15.0f };
+ Matrix m(els);
+
+ Matrix it;
+ m.InvertTransform(it);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, exceptionString, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+
+// GetXAxis
+int UtcDaliMatrixGetXAxis(void)
+{
+ float els[] = { 0.0f, 1.0f, 2.0f, 3.0f,
+ 4.0f, 5.0f, 6.0f, 7.0f,
+ 8.0f, 9.0f, 10.0f, 11.0f,
+ 12.0f, 13.0f, 14.0f, 15.0f };
+ Matrix m(els);
+
+ DALI_TEST_CHECK(m.GetXAxis() == Vector3(0.0f, 1.0f, 2.0f));
+ END_TEST;
+}
+
+// GetYAxis
+int UtcDaliMatrixGetYAxis(void)
+{
+ float els[] = { 0.0f, 1.0f, 2.0f, 3.0f,
+ 4.0f, 5.0f, 6.0f, 7.0f,
+ 8.0f, 9.0f, 10.0f, 11.0f,
+ 12.0f, 13.0f, 14.0f, 15.0f };
+ Matrix m(els);
+
+ DALI_TEST_CHECK(m.GetYAxis() == Vector3(4.0f, 5.0f, 6.0f));
+ END_TEST;
+}
+
+// GetZAxis
+int UtcDaliMatrixGetZAxis(void)
+{
+ float els[] = { 0.0f, 1.0f, 2.0f, 3.0f,
+ 4.0f, 5.0f, 6.0f, 7.0f,
+ 8.0f, 9.0f, 10.0f, 11.0f,
+ 12.0f, 13.0f, 14.0f, 15.0f };
+ Matrix m(els);
+
+ DALI_TEST_CHECK(m.GetZAxis() == Vector3(8.0f, 9.0f, 10.0f));
+ END_TEST;
+}
+
+// GetTranslation
+int UtcDaliMatrixGetTranslation(void)
+{
+ float els[] = { 0.0f, 1.0f, 2.0f, 3.0f,
+ 4.0f, 5.0f, 6.0f, 7.0f,
+ 8.0f, 9.0f, 10.0f, 11.0f,
+ 12.0f, 13.0f, 14.0f, 15.0f };
+ Matrix m(els);
+
+ DALI_TEST_EQUALS(m.GetTranslation(), Vector4(12.0f, 13.0f, 14.0f, 15.0f), TEST_LOCATION);
+ END_TEST;
+}
+
+// GetTranslation
+int UtcDaliMatrixGetTranslation3(void)
+{
+ float els[] = { 0.0f, 1.0f, 2.0f, 3.0f,
+ 4.0f, 5.0f, 6.0f, 7.0f,
+ 8.0f, 9.0f, 10.0f, 11.0f,
+ 12.0f, 13.0f, 14.0f, 15.0f };
+ Matrix m(els);
+
+ DALI_TEST_EQUALS(m.GetTranslation3(), Vector3(12.0f, 13.0f, 14.0f), TEST_LOCATION);
+ END_TEST;
+}
+
+// SetIdentity
+int UtcDaliMatrixSetIdentity(void)
+{
+ float els[] = { 0.0f, 1.0f, 2.0f, 3.0f,
+ 4.0f, 5.0f, 6.0f, 7.0f,
+ 8.0f, 9.0f, 10.0f, 11.0f,
+ 12.0f, 13.0f, 14.0f, 15.0f };
+ Matrix m(els);
+ m.SetIdentity();
+
+ DALI_TEST_EQUALS(m, Matrix::IDENTITY, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliMatrixSetIdentityAndScale(void)
+{
+ float els[] = { 0.0f, 1.0f, 2.0f, 3.0f,
+ 4.0f, 5.0f, 6.0f, 7.0f,
+ 8.0f, 9.0f, 10.0f, 11.0f,
+ 12.0f, 13.0f, 14.0f, 15.0f };
+ Matrix m(els);
+ m.SetIdentityAndScale(Vector3(4.0f, 4.0f, 4.0f));
+
+ float els2[] = { 4.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 4.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 4.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f };
+ Matrix r(els2);
+
+ DALI_TEST_EQUALS(m, r, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+// SetXAxis
+int UtcDaliMatrixSetXAxis(void)
+{
+ Matrix m;
+ Vector3 v(2.0f, 3.0f, 4.0f);
+ m.SetXAxis(v);
+
+ DALI_TEST_CHECK(m.GetXAxis() == v);
+ END_TEST;
+}
+
+// SetYAxis
+int UtcDaliMatrixSetYAxis(void)
+{
+ Matrix m;
+ Vector3 v(2.0f, 3.0f, 4.0f);
+ m.SetYAxis(v);
+
+ DALI_TEST_CHECK(m.GetYAxis() == v);
+ END_TEST;
+}
+
+// SetZAxis
+int UtcDaliMatrixSetZAxis(void)
+{
+ Matrix m;
+ Vector3 v(2.0f, 3.0f, 4.0f);
+ m.SetZAxis(v);
+
+ DALI_TEST_CHECK(m.GetZAxis() == v);
+ END_TEST;
+}
+
+// SetTranslation
+int UtcDaliMatrixSetTranslation(void)
+{
+ Matrix m;
+ Vector4 v(2.0f, 3.0f, 4.0f, 5.0f);
+ m.SetTranslation(v);
+
+ DALI_TEST_CHECK(m.GetTranslation() == v);
+ END_TEST;
+}
+
+// SetTranslation
+int UtcDaliMatrixSetTranslation3(void)
+{
+ Matrix m;
+ Vector3 v(2.0f, 3.0f, 4.0f);
+ m.SetTranslation(v);
+
+ DALI_TEST_CHECK(m.GetTranslation3() == v);
+ END_TEST;
+}
+
+
+
+// Transpose
+int UtcDaliMatrixTranspose(void)
+{
+ float floats[] =
+ { 0.0f, 1.0f, 2.0f, 3.0f,
+ 4.0f, 5.0f, 6.0f, 7.0f,
+ 8.0f, 9.0f, 10.0f, 11.0f,
+ 12.0f, 13.0f, 14.0f, 15.0f
+ };
+
+ Matrix m(floats);
+ m.Transpose();
+
+ bool success = true;
+
+ for (int x=0;x<4;++x)
+ {
+ for (int y=0;y<4;++y)
+ {
+ success &= (m.AsFloat()[x+y*4] == floats[x*4+y]);
+ }
+ }
+
+ DALI_TEST_CHECK(success);
+ END_TEST;
+}
+
+int UtcDaliMatrixOStreamOperator(void)
+{
+ std::ostringstream oss;
+
+ Matrix matrix;
+ matrix.SetIdentity();
+
+ oss << matrix;
+
+ std::string expectedOutput = "[ [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1] ]";
+
+ DALI_TEST_EQUALS( oss.str(), expectedOutput, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliMatrixMultiply(void)
+{
+ Matrix m1 = Matrix::IDENTITY;
+
+ float els[] = { 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.707f, 0.707f, 0.0f,
+ 0.0f, -0.707f, 0.707f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f };
+ Matrix result(els);
+
+ Quaternion q(Radian(Degree(45.0f)), Vector3::XAXIS);
+ Matrix m2(false);
+ Matrix::Multiply(m2, m1, q);
+
+ DALI_TEST_EQUALS(m2, result, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliMatrixOperatorMultiply(void)
+{
+ Vector4 v1(2.0f, 5.0f, 4.0f, 0.0f);
+
+ float els[] = {2.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 3.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 4.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f };
+ Matrix m1(els);
+
+ Vector4 v2 = m1 * v1;
+ Vector4 r1(4.0f, 15.0f, 16.0f, 0.0f);
+ DALI_TEST_EQUALS(v2, r1, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliMatrixOperatorMultiply02(void)
+{
+ TestApplication application;
+
+ Vector3 position ( 30.f, 40.f, 50.f);
+
+ Matrix m1(false);
+ m1.SetIdentity();
+ m1.SetTranslation(-position);
+
+ Vector4 positionV4(position);
+ positionV4.w=1.0f;
+ Vector4 output = m1 * positionV4;
+
+ output.w = 0.0f;
+ DALI_TEST_EQUALS(output, Vector4::ZERO, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliMatrixOperatorEquals(void)
+{
+ Matrix m1 = Matrix::IDENTITY;
+
+ float els[] = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
+ Matrix r2(els);
+ DALI_TEST_EQUALS(m1 == r2, true, TEST_LOCATION);
+
+ float *f = m1.AsFloat();
+ for(size_t i=0; i<16; i++)
+ {
+ f[15-i] = 1.2f;
+ DALI_TEST_EQUALS(m1 == r2, false, TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+int UtcDaliMatrixOperatorNotEquals(void)
+{
+ Matrix m1 = Matrix::IDENTITY;
+ float els[] = {2.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 3.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 4.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f };
+ Matrix r1(els);
+
+ DALI_TEST_CHECK(m1 != r1);
+ DALI_TEST_CHECK(!(m1 != m1));
+ END_TEST;
+}
+
+int UtcDaliMatrixGetTransformComponents01(void)
+{
+ Matrix m2(Matrix::IDENTITY.AsFloat());
+ Vector3 pos2;
+ Vector3 scale2;
+ Quaternion q2;
+ m2.GetTransformComponents(pos2, q2, scale2);
+ DALI_TEST_EQUALS(Vector3(0.0f, 0.0f, 0.0f), pos2, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector3(1.0f, 1.0f, 1.0f), scale2, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(Quaternion(), q2, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliMatrixGetTransformComponents02(void)
+{
+ // Create an arbitrary vector
+ for( float x=-1.0f; x<=1.0f; x+=0.1f )
+ {
+ for( float y=-1.0f; y<1.0f; y+=0.1f )
+ {
+ for( float z=-1.0f; z<1.0f; z+=0.1f )
+ {
+ Vector3 vForward(x, y, z);
+ vForward.Normalize();
+
+ for( float angle = 5.0f; angle <= 360.0f; angle += 15.0f)
+ {
+ Quaternion rotation1(Radian(Degree(angle)), vForward);
+ Vector3 scale1(2.0f, 3.0f, 4.0f);
+ Vector3 position1(1.0f, 2.0f, 3.0f);
+
+ Matrix m1(false);
+ m1.SetTransformComponents(scale1, rotation1, position1);
+
+ Vector3 position2;
+ Quaternion rotation2;
+ Vector3 scale2;
+ m1.GetTransformComponents(position2, rotation2, scale2);
+
+ DALI_TEST_EQUALS(position1, position2, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(scale1, scale2, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(rotation1, rotation2, 0.001, TEST_LOCATION);
+ }
+ }
+ }
+ }
+ END_TEST;
+}
+
+int UtcDaliMatrixSetTransformComponents01(void)
+{
+ // Create an arbitrary vector
+ for( float x=-1.0f; x<=1.0f; x+=0.1f )
+ {
+ for( float y=-1.0f; y<1.0f; y+=0.1f )
+ {
+ for( float z=-1.0f; z<1.0f; z+=0.1f )
+ {
+ Vector3 vForward(x, y, z);
+ vForward.Normalize();
+
+ for( float angle = 5.0f; angle <= 360.0f; angle += 15.0f)
+ {
+ Quaternion rotation1(Radian(Degree(angle)), vForward);
+
+ Matrix m1(rotation1);
+ Matrix result1(false);
+ Vector4 vForward4(vForward.x, vForward.y, vForward.z, 0.0f);
+ result1.SetTransformComponents( Vector3::ONE, Quaternion(Radian(Degree(angle)), vForward4), Vector3::ZERO );
+
+ DALI_TEST_EQUALS(m1, result1, 0.001, TEST_LOCATION);
+
+ Matrix m2(false);
+ m2.SetTransformComponents(vForward, Quaternion::IDENTITY, Vector3::ZERO);
+
+ Matrix result2a(Matrix::IDENTITY);
+ result2a.SetXAxis(result2a.GetXAxis() * vForward[0]);
+ result2a.SetYAxis(result2a.GetYAxis() * vForward[1]);
+ result2a.SetZAxis(result2a.GetZAxis() * vForward[2]);
+
+ DALI_TEST_EQUALS(m2, result2a, 0.001, TEST_LOCATION);
+
+ Matrix m3(false);
+ m3.SetTransformComponents(vForward, rotation1, Vector3::ZERO);
+
+ Matrix result3(Matrix::IDENTITY);
+ result3.SetXAxis(result3.GetXAxis() * vForward[0]);
+ result3.SetYAxis(result3.GetYAxis() * vForward[1]);
+ result3.SetZAxis(result3.GetZAxis() * vForward[2]);
+
+ Matrix::Multiply(result3, result3, m1);
+ DALI_TEST_EQUALS(m3, result3, 0.001, TEST_LOCATION);
+ }
+ }
+ }
+ }
+ END_TEST;
+}
+
+
+int UtcDaliMatrixSetInverseTransformComponent01(void)
+{
+ // Create an arbitrary vector
+ for( float x=-1.0f; x<=1.0f; x+=0.1f )
+ {
+ for( float y=-1.0f; y<1.0f; y+=0.1f )
+ {
+ for( float z=-1.0f; z<1.0f; z+=0.1f )
+ {
+ Vector3 vForward(x, y, z);
+ vForward.Normalize();
+
+ for( float angle = 5.0f; angle <= 360.0f; angle += 15.0f)
+ {
+ Quaternion rotation1(Radian(Degree(angle)), vForward);
+ Vector3 scale1(2.0f, 3.0f, 4.0f);
+ Vector3 position1(1.0f, 2.0f, 3.0f);
+
+ Matrix m1(false);
+ m1.SetTransformComponents(scale1, rotation1, position1);
+
+ Matrix m2(false);
+ m2.SetInverseTransformComponents(scale1, rotation1, position1);
+
+ Matrix result;
+ Matrix::Multiply(result, m1, m2);
+
+ DALI_TEST_EQUALS(result, Matrix::IDENTITY, 0.001, TEST_LOCATION);
+ }
+ }
+ }
+ }
+ END_TEST;
+}
+
+int UtcDaliMatrixSetInverseTransformComponent02(void)
+{
+ // Create an arbitrary vector
+ for( float x=-1.0f; x<=1.0f; x+=0.1f )
+ {
+ for( float y=-1.0f; y<1.0f; y+=0.1f )
+ {
+ for( float z=-1.0f; z<1.0f; z+=0.1f )
+ {
+ Vector3 vForward(x, y, z);
+ vForward.Normalize();
+
+ for( float angle = 5.0f; angle <= 360.0f; angle += 15.0f)
+ {
+ Quaternion rotation1(Radian(Degree(angle)), vForward);
+ Matrix rotationMatrix(rotation1); // TEST RELIES ON THIS METHOD WORKING!!!
+
+ Vector3 position1(5.0f, -6.0f, 7.0f);
+
+ Matrix m1(false);
+ m1.SetTransformComponents( Vector3::ONE, rotation1, position1 );
+
+ Matrix m2(false);
+ m2.SetInverseTransformComponents( rotationMatrix.GetXAxis(),
+ rotationMatrix.GetYAxis(),
+ rotationMatrix.GetZAxis(),
+ position1 );
+
+ Matrix result;
+ Matrix::Multiply(result, m1, m2);
+
+ DALI_TEST_EQUALS(result, Matrix::IDENTITY, 0.001, TEST_LOCATION);
+ }
+ }
+ }
+ }
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+
+using namespace Dali;
+
+void utc_dali_matrix3_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_matrix3_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+Matrix3 m1(
+ -18.6f, 1.88e-09f, -6.85e-09f,
+ 0.0f,13.2f, 13.2f,
+ -1.36e-08f,13.2f, -13.2f);
+
+Matrix3 m2(
+ -18.6f,6.91e-06f, 6.76e-06f,
+ 8.04e-09f,13.2f, 13.2f,
+ 3.01e-06f,13.2f, -13.2f);
+
+Matrix3 m3(
+ 6.24f,-12.4f, -12.4f,
+ -17.6f,-4.46f, -4.37f,
+ -0.0641f,13.2f, -13.2f);
+
+Matrix3 m4(
+ -16.3f,6.42f, 6.38f,
+ 9.05f,11.6f, 11.4f,
+ -0.0371f,13.1f, -13.3f);
+
+Matrix3 m5(
+ -2.43f,13.2f, 12.9f,
+ 18.5f,1.92f, 1.51f,
+ -0.257f,13.0f, -13.4f);
+
+Matrix3 m6(
+ -2.43f, -13.2f, -200.9f,
+ 18.5f, 1.92f, 1.51f,
+ 0.257f, 13.0f, 13.4f);
+
+
+Matrix3 i1(
+ -0.05, -0.00, 0.00,
+ -0.00, 0.04, 0.04,
+ 0.00, 0.04, -0.04);
+
+Matrix3 i2(
+ -0.05, 0.00, -0.00,
+ 0.00, 0.04, 0.04,
+ 0.00, 0.04, -0.04);
+
+Matrix3 i3(
+ 0.02, -0.05, -0.00,
+ -0.04, -0.01, 0.04,
+ -0.04, -0.01, -0.04);
+
+Matrix3 i4(
+ -0.05, 0.03, -0.00,
+ 0.02, 0.03, 0.04,
+ 0.02, 0.03, -0.04);
+
+Matrix3 i5(
+ -0.01, 0.05, -0.00,
+ 0.04, 0.01, 0.04,
+ 0.04, 0.00, -0.04);
+
+
+
+Matrix3 t1(
+ -18.6f, 0.0f, -1.36e-08f,
+ 1.88e-09f,13.2f, 13.2f,
+ -6.85e-09f,13.2f, -13.2f);
+
+Matrix3 t2(
+ -18.6f,8.04e-09f, 3.01e-06f,
+ 6.91e-06f,13.2f, 13.2f,
+ 6.76e-06f,13.2f, -13.2f);
+
+Matrix3 t3(
+ 6.24f,-17.6f, -0.0641f,
+ -12.4f,-4.46f, 13.2f,
+ -12.4f, -4.37f, -13.2f);
+
+Matrix3 t4(
+ -16.3f,9.05f, -0.0371f,
+ 6.42f, 11.6f, 13.1f,
+ 6.38f,11.4f, -13.3f);
+
+Matrix3 t5(
+ -2.43f,18.5f, -0.257f,
+ 13.2f, 1.92f, 13.0f,
+ 12.9f, 1.51f, -13.4f);
+
+
+
+Matrix3* matrices[5] = { &m1, &m2, &m3, &m4, &m5 };
+Matrix3* inverseMatrices[5] = { &i1, &i2, &i3, &i4, &i5 };
+Matrix3* transposeMatrices[5] = { &t1, &t2, &t3, &t4, &t5 };
+
+} // anonymous namespace
+
+int UtcDaliMatrix3FromMatrix(void)
+{
+ float els0[] = { 0.0f, 1.0f, 2.0f, 3.0f,
+ 4.0f, 5.0f, 6.0f, 7.0f,
+ 8.0f, 9.0f, 10.0f, 11.0f,
+ 12.0f, 13.0f, 14.0f, 15.0f};
+ Matrix m0(els0);
+ Matrix3 m1(0.0f, 1.0f, 2.0f,
+ 4.0f, 5.0f, 6.0f,
+ 8.0f, 9.0f, 10.0f);
+
+ Matrix3 m2(m0);
+
+ DALI_TEST_EQUALS(m1, m2, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliMatrix3OperatorAssign01(void)
+{
+ float els0[] = { 0.0f, 1.0f, 2.0f, 3.0f,
+ 4.0f, 5.0f, 6.0f, 7.0f,
+ 8.0f, 9.0f, 10.0f, 11.0f,
+ 12.0f, 13.0f, 14.0f, 15.0f};
+ Matrix m0(els0);
+
+ Matrix3 m1(0.0f, 1.0f, 2.0f,
+ 4.0f, 5.0f, 6.0f,
+ 8.0f, 9.0f, 10.0f);
+
+ Matrix3 m2;
+ m2 = m0;
+ m2 = m2; // Test branch
+
+ DALI_TEST_EQUALS(m1, m2, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliMatrix3OperatorAssign02(void)
+{
+ Matrix3 m0(0.0f, 1.0f, 2.0f,
+ 4.0f, 5.0f, 6.0f,
+ 8.0f, 9.0f, 10.0f);
+
+ Matrix3 m1(0.0f, 1.0f, 2.0f,
+ 4.0f, 5.0f, 6.0f,
+ 8.0f, 9.0f, 10.0f);
+
+ Matrix3 m2;
+ m2 = m0;
+
+ DALI_TEST_EQUALS(m1, m2, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+
+
+// AsFloat
+int UtcDaliMatrix3AsFloat(void)
+{
+ float values[] = {0.0f, 1.0f, 2.0f,
+ 4.0f, 5.0f, 6.0f,
+ 8.0f, 9.0f, 10.0f };
+
+ Matrix3 m1(values[0], values[1], values[2], values[3],values[4], values[5], values[6], values[7],values[8]);
+
+ for (int i=0;i<9;++i)
+ {
+ DALI_TEST_EQUALS(m1.AsFloat()[i], values[i], TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+
+// Invert works
+int UtcDaliMatrix3Invert(void)
+{
+ // We're going to invert a whole load of different matrices to make sure we don't
+ // fail on particular orientations.
+ for (int i=0;i<5;++i)
+ {
+ Matrix3 m = *matrices[i];
+ Matrix3 inverseResult1 = *inverseMatrices[i];
+
+ // Convert to Mat4, perform inverse, and convert back to Mat3
+ float* mf = m.AsFloat();
+ float els[] = { mf[0], mf[1], mf[2], 0.0f,
+ mf[3], mf[4], mf[5], 0.0f,
+ mf[6], mf[7], mf[8], 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f };
+ Matrix mat4(els);
+ mat4.Invert();
+ Matrix3 inverseResult2 = mat4;
+
+ Matrix3 mInv = m;
+ mInv.Invert();
+
+ DALI_TEST_EQUALS(mInv, inverseResult1, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(mInv, inverseResult2, 0.01f, TEST_LOCATION);
+
+ Matrix3 m2 = mInv;
+ m2.Invert(); // double invert - should be back to m
+
+ DALI_TEST_EQUALS(m, m2, 0.01f, TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliMatrix3Transpose(void)
+{
+ for (int i=0;i<5;++i)
+ {
+ Matrix3 m0 = *matrices[i];
+ Matrix3 trans = *transposeMatrices[i];
+
+ Matrix3 m1 = m0;
+ m1.Transpose();
+
+ DALI_TEST_EQUALS(m1, trans, 0.001f, TEST_LOCATION);
+
+ Matrix3 m2 = m1;
+ m2.Transpose();
+
+ DALI_TEST_EQUALS(m0, m2, 0.001f, TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+// SetIdentity
+int UtcDaliMatrix3SetIdentity(void)
+{
+ Matrix3 m( 0.0f, 1.0f, 2.0f,
+ 4.0f, 5.0f, 6.0f,
+ 8.0f, 9.0f, 10.0f);
+ m.SetIdentity();
+
+ DALI_TEST_EQUALS(m, Matrix3::IDENTITY, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliMatrix3Scale(void)
+{
+ Matrix3 m1( 0.0f, 1.0f, 2.0f,
+ 4.0f, 5.0f, 6.0f,
+ 8.0f, 9.0f, 10.0f);
+
+ Matrix3 m2( 0.0f, 3.0f, 6.0f,
+ 12.0f, 15.0f, 18.0f,
+ 24.0f, 27.0f, 30.0f);
+
+ m1.Scale(3.0f);
+
+ DALI_TEST_EQUALS(m1, m2, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliMatrix3Magnitude(void)
+{
+ Matrix3 m1( 0.0f, 1.0f, -2.0f,
+ 3.0f, -4.0f, 5.0f,
+ -6.0f, 7.0f, 8.0f);
+
+ DALI_TEST_EQUALS(Matrix3::IDENTITY.Magnitude(), 1.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(m1.Magnitude(), 12.0f, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+
+int UtcDaliMatrix3ScaleInverseTranspose(void)
+{
+ Matrix3* matrices[6] = { &m1, &m2, &m3, &m4, &m5, &m6 };
+
+
+ for (int i=0;i<6;++i)
+ {
+ Matrix3 m0 = *matrices[i];
+
+ Matrix3 m1 = m0;
+ m1.Invert();
+ m1.Transpose();
+ m1.Scale(3.0f/(m1.Magnitude()));
+
+ Matrix3 m2 = m0;
+ m2.ScaledInverseTranspose();
+
+ DALI_TEST_EQUALS(m1, m2, 0.001f, TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliMatrix3OStreamOperator(void)
+{
+ std::ostringstream oss;
+
+ Matrix3 matrix( 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f );
+
+ oss << matrix;
+
+ std::string expectedOutput = "[ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]";
+
+ DALI_TEST_EQUALS( oss.str(), expectedOutput, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliMatrix3Multiply(void)
+{
+ Matrix3 m1( 0.0f, 3.0f, 6.0f,
+ 12.0f, 15.0f, 18.0f,
+ 24.0f, 27.0f, 30.0f);
+
+ Matrix3 m2( 0.0f, 1.0f, 0.0f,
+ -1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f);
+
+ Matrix3 m3( -3.0f, 0.0f, 6.0f,
+ -15.0f, 12.0f, 18.0f,
+ -27.0f, 24.0f, 30.0f);
+
+ Matrix3 result;
+ Matrix3::Multiply(result, m1, m2);
+
+ DALI_TEST_EQUALS(m3, result, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliMatrix3EqualityOperator(void)
+{
+ Matrix3 m1( 0.0f, 3.0f, 6.0f,
+ 12.0f, 15.0f, 18.0f,
+ 24.0f, 27.0f, 30.0f);
+
+ Matrix3 m2( 0.0f, 3.0f, 6.0f,
+ 12.0f, 15.0f, 18.0f,
+ 24.0f, 27.0f, 30.0f);
+
+ DALI_TEST_CHECK(m1 == m2);
+ END_TEST;
+}
+
+int UtcDaliMatrix3InequalityOperator(void)
+{
+ Matrix3 m1( 1.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f);
+
+ Matrix3 m2( 0.0f, 3.0f, 6.0f,
+ 12.0f, 15.0f, 18.0f,
+ 24.0f, 27.0f, 30.0f);
+
+ DALI_TEST_CHECK(m1 != m2);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+
+void mesh_actor_test_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void mesh_actor_test_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+static AnimatableMesh NewMesh()
+{
+ AnimatableMesh::Faces faces;
+ faces.push_back(0);
+ faces.push_back(1);
+ faces.push_back(2);
+
+ Material customMaterial = Material::New("CustomMaterial");
+ customMaterial.SetOpacity(.76f);
+ customMaterial.SetDiffuseColor(Vector4(0.8f, 0.0f, 0.4f, 1.0f));
+ customMaterial.SetAmbientColor(Vector4(0.2f, 1.0f, 0.6f, 1.0f));
+ customMaterial.SetSpecularColor(Vector4(0.5f, 0.6f, 0.7f, 1.0f));
+
+ AnimatableMesh mesh = AnimatableMesh::New( 10u, faces, customMaterial );
+ return mesh;
+}
+} // anonymous namespace
+
+int UtcDaliMeshActorConstructorVoid(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::MeshActor()");
+
+ MeshActor actor;
+ DALI_TEST_CHECK(!actor);
+ END_TEST;
+}
+
+int UtcDaliMeshActorNew01(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::MeshActor::New()");
+
+ AnimatableMesh mesh = NewMesh();
+ MeshActor actor = MeshActor::New(mesh);
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.SendNotification();
+
+ DALI_TEST_CHECK(actor);
+ END_TEST;
+}
+
+int UtcDaliMeshActorIndices(void)
+{
+ TestApplication application;
+ Actor basicActor = Actor::New();
+ AnimatableMesh mesh = NewMesh();
+ MeshActor meshActor = MeshActor::New(mesh);
+
+ Property::IndexContainer indices;
+ meshActor.GetPropertyIndices( indices );
+ DALI_TEST_CHECK( indices.size() == basicActor.GetPropertyCount() ); // Mesh Actor does not have any properties
+ DALI_TEST_EQUALS( indices.size(), meshActor.GetPropertyCount(), TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_pan_gesture_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_pan_gesture_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+
+int UtcDaliPanGestureConstructor(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ PanGesture gesture(Gesture::Started);
+ DALI_TEST_EQUALS(Gesture::Started, gesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, gesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Pan, gesture.type, TEST_LOCATION);
+
+ PanGesture gesture2(Gesture::Continuing);
+ DALI_TEST_EQUALS(Gesture::Continuing, gesture2.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, gesture2.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Pan, gesture2.type, TEST_LOCATION);
+
+ PanGesture gesture3(Gesture::Finished);
+ DALI_TEST_EQUALS(Gesture::Finished, gesture3.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, gesture3.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Pan, gesture3.type, TEST_LOCATION);
+
+ // Test copy constructor
+ gesture3.numberOfTouches = 3u;
+
+ PanGesture pan(gesture3);
+ DALI_TEST_EQUALS(Gesture::Finished, pan.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(3u, pan.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Pan, pan.type, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureAssignment(void)
+{
+ // Test Assignment operator
+ PanGesture gesture(Gesture::Started);
+ DALI_TEST_EQUALS(Gesture::Started, gesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, gesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Pan, gesture.type, TEST_LOCATION);
+
+ PanGesture gesture2(Gesture::Continuing);
+ DALI_TEST_EQUALS(Gesture::Continuing, gesture2.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, gesture2.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Pan, gesture2.type, TEST_LOCATION);
+
+ gesture2.numberOfTouches = 3u;
+
+ gesture = gesture2;
+ DALI_TEST_EQUALS(Gesture::Continuing, gesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(3u, gesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Pan, gesture.type, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureGetSpeed(void)
+{
+ PanGesture gesture(Gesture::Started);
+ DALI_TEST_EQUALS(0.0f, gesture.GetSpeed(), TEST_LOCATION);
+
+ gesture.velocity = Vector2(3.0f, -4.0f);
+
+ DALI_TEST_EQUALS(5.0f, gesture.GetSpeed(), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureGetDistance(void)
+{
+ PanGesture gesture(Gesture::Started);
+ DALI_TEST_EQUALS(0.0f, gesture.GetDistance(), TEST_LOCATION);
+
+ gesture.displacement = Vector2(-30.0f, -40.0f);
+
+ DALI_TEST_EQUALS(50.0f, gesture.GetDistance(), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureGetScreenSpeed(void)
+{
+ PanGesture gesture(Gesture::Started);
+ DALI_TEST_EQUALS(0.0f, gesture.GetScreenSpeed(), TEST_LOCATION);
+
+ gesture.screenVelocity = Vector2(3.0f, -4.0f);
+
+ DALI_TEST_EQUALS(5.0f, gesture.GetScreenSpeed(), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureGetScreenDistance(void)
+{
+ PanGesture gesture(Gesture::Started);
+ DALI_TEST_EQUALS(0.0f, gesture.GetScreenDistance(), TEST_LOCATION);
+
+ gesture.screenDisplacement = Vector2(-30.0f, -40.0f);
+
+ DALI_TEST_EQUALS(50.0f, gesture.GetScreenDistance(), TEST_LOCATION);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/integration-api/events/touch-event-integ.h>
+#include <dali/integration-api/events/pan-gesture-event.h>
+#include <dali/integration-api/system-overlay.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_pan_gesture_detector_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_pan_gesture_detector_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace
+{
+typedef Dali::PanGestureDetector::AngleContainer::size_type AngleSizeType;
+
+
+// Stores data that is populated in the callback and will be read by the TET cases
+struct SignalData
+{
+ SignalData()
+ : functorCalled(false),
+ voidFunctorCalled(false),
+ receivedGesture(Gesture::Clear)
+ {}
+
+ void Reset()
+ {
+ functorCalled = false;
+ voidFunctorCalled = false;
+
+ receivedGesture.state = Gesture::Clear;
+ receivedGesture.velocity = Vector2(0.0f, 0.0f);
+ receivedGesture.displacement = Vector2(0.0f, 0.0f);
+ receivedGesture.position = Vector2(0.0f, 0.0f);
+ receivedGesture.screenPosition = Vector2(0.0f, 0.0f);
+ receivedGesture.numberOfTouches = 0;
+
+ pannedActor = NULL;
+ }
+
+ bool functorCalled;
+ bool voidFunctorCalled;
+ PanGesture receivedGesture;
+ Actor pannedActor;
+};
+
+// Functor that sets the data when called
+struct GestureReceivedFunctor
+{
+ GestureReceivedFunctor(SignalData& data) : signalData(data) { }
+
+ void operator()(Actor actor, PanGesture pan)
+ {
+ signalData.functorCalled = true;
+ signalData.receivedGesture = pan;
+ signalData.pannedActor = actor;
+ }
+
+ void operator()()
+ {
+ signalData.voidFunctorCalled = true;
+ }
+
+ SignalData& signalData;
+};
+
+// Functor that removes the gestured actor from stage
+struct UnstageActorFunctor : public GestureReceivedFunctor
+{
+ UnstageActorFunctor( SignalData& data, Gesture::State& stateToUnstage )
+ : GestureReceivedFunctor( data ),
+ stateToUnstage( stateToUnstage )
+ {
+ }
+
+ void operator()( Actor actor, PanGesture pan )
+ {
+ GestureReceivedFunctor::operator()( actor, pan );
+
+ if ( pan.state == stateToUnstage )
+ {
+ Stage::GetCurrent().Remove( actor );
+ }
+ }
+
+ Gesture::State& stateToUnstage;
+};
+
+// Functor for receiving a touch event
+struct TouchEventFunctor
+{
+ bool operator()(Actor actor, const TouchEvent& touch)
+ {
+ return false;
+ }
+};
+
+// Data for constraints
+struct ConstraintData
+{
+ ConstraintData()
+ : called(false)
+ {
+ }
+
+ Vector2 screenPosition;
+ Vector2 screenDisplacement;
+ Vector2 localPosition;
+ Vector2 localDisplacement;
+ bool called;
+
+ void Reset()
+ {
+ screenPosition = screenDisplacement = localPosition = localDisplacement = Vector2::ZERO;
+ called = false;
+ }
+};
+
+// Constraint used with panning properties
+struct PanConstraint
+{
+ PanConstraint( ConstraintData& data ) : constraintData(data) { }
+
+ Vector3 operator()(const Vector3& current,
+ const PropertyInput& screenPositionProperty,
+ const PropertyInput& screenDisplacementProperty,
+ const PropertyInput& localPositionProperty,
+ const PropertyInput& localDisplacementProperty)
+ {
+ constraintData.screenPosition = screenPositionProperty.GetVector2();
+ constraintData.screenDisplacement = screenDisplacementProperty.GetVector2();
+ constraintData.localPosition = localPositionProperty.GetVector2();
+ constraintData.localDisplacement = localDisplacementProperty.GetVector2();
+ constraintData.called = true;
+ return Vector3::ZERO;
+ }
+
+ ConstraintData& constraintData;
+};
+
+// Generate a PanGestureEvent to send to Core
+Integration::PanGestureEvent GeneratePan(
+ Gesture::State state,
+ Vector2 previousPosition,
+ Vector2 currentPosition,
+ unsigned long timeDelta,
+ unsigned int numberOfTouches = 1,
+ unsigned int time = 1u)
+{
+ Integration::PanGestureEvent pan(state);
+
+ pan.previousPosition = previousPosition;
+ pan.currentPosition = currentPosition;
+ pan.timeDelta = timeDelta;
+ pan.numberOfTouches = numberOfTouches;
+ pan.time = time;
+
+ return pan;
+}
+
+// Generate a PanGesture
+PanGesture GeneratePan( unsigned int time,
+ Gesture::State state,
+ Vector2 screenPosition,
+ Vector2 localPosition,
+ Vector2 screenDisplacement = Vector2::ONE,
+ Vector2 localDisplacement = Vector2::ONE,
+ Vector2 velocity = Vector2::ONE,
+ unsigned int numberOfTouches = 1 )
+{
+ PanGesture pan( state );
+
+ pan.time = time;
+
+ pan.screenPosition = screenPosition;
+ pan.position = localPosition;
+
+ pan.screenDisplacement = screenDisplacement;
+ pan.displacement = localDisplacement;
+
+ pan.screenVelocity = pan.velocity = velocity;
+ pan.numberOfTouches = numberOfTouches;
+
+ return pan;
+}
+
+} // anon namespace
+
+///////////////////////////////////////////////////////////////////////////////
+
+// Positive test case for a method
+int UtcDaliPanGestureDetectorConstructor(void)
+{
+ TestApplication application;
+
+ PanGestureDetector detector;
+ DALI_TEST_CHECK(!detector);
+ END_TEST;
+}
+
+
+// Negative test case for a method
+int UtcDaliPanGestureDetectorNew(void)
+{
+ TestApplication application;
+
+ PanGestureDetector detector = PanGestureDetector::New();
+
+ DALI_TEST_CHECK(detector);
+
+ DALI_TEST_EQUALS(1u, detector.GetMinimumTouchesRequired(), TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, detector.GetMaximumTouchesRequired(), TEST_LOCATION);
+
+ // Attach an actor and emit a touch event on the actor to ensure complete line coverage
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ detector.Attach(actor);
+
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ Integration::TouchEvent touchEvent(1);
+ TouchPoint point(1, TouchPoint::Down, 20.0f, 20.0f);
+ touchEvent.AddPoint(point);
+ application.ProcessEvent(touchEvent);
+ END_TEST;
+}
+
+int UtcDaliPanGestureDetectorDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::GestureDetector::DownCast()");
+
+ PanGestureDetector detector = PanGestureDetector::New();
+
+ BaseHandle object(detector);
+
+ PanGestureDetector detector2 = PanGestureDetector::DownCast(object);
+ DALI_TEST_CHECK(detector2);
+
+ PanGestureDetector detector3 = DownCast< PanGestureDetector >(object);
+ DALI_TEST_CHECK(detector3);
+
+ BaseHandle unInitializedObject;
+ PanGestureDetector detector4 = PanGestureDetector::DownCast(unInitializedObject);
+ DALI_TEST_CHECK(!detector4);
+
+ PanGestureDetector detector5 = DownCast< PanGestureDetector >(unInitializedObject);
+ DALI_TEST_CHECK(!detector5);
+
+ GestureDetector detector6 = PanGestureDetector::New();
+ PanGestureDetector detector7 = PanGestureDetector::DownCast(detector6);
+ DALI_TEST_CHECK(detector7);
+ END_TEST;
+}
+
+int UtcDaliPanGestureSetMinimumTouchesRequired(void)
+{
+ TestApplication application;
+
+ PanGestureDetector detector = PanGestureDetector::New();
+
+ unsigned int min = 2;
+
+ DALI_TEST_CHECK(min != detector.GetMinimumTouchesRequired());
+
+ detector.SetMinimumTouchesRequired(min);
+
+ DALI_TEST_EQUALS(min, detector.GetMinimumTouchesRequired(), TEST_LOCATION);
+
+ // Attach an actor and change the minimum touches
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ TestGestureManager& gestureManager = application.GetGestureManager();
+ gestureManager.Initialize();
+
+ detector.SetMinimumTouchesRequired(3);
+
+ // Gesture detection should have been updated only
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+
+ // Reset values
+ gestureManager.Initialize();
+
+ // Create a second gesture detector that requires even less minimum touches
+ PanGestureDetector secondDetector = PanGestureDetector::New();
+ secondDetector.Attach(actor);
+
+ // Gesture detection should have been updated only
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureSetMaximumTouchesRequired(void)
+{
+ TestApplication application;
+
+ PanGestureDetector detector = PanGestureDetector::New();
+
+ unsigned int max = 3;
+
+ DALI_TEST_CHECK(max != detector.GetMaximumTouchesRequired());
+
+ detector.SetMaximumTouchesRequired(max);
+
+ DALI_TEST_EQUALS(max, detector.GetMaximumTouchesRequired(), TEST_LOCATION);
+
+ // Attach an actor and change the maximum touches
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ TestGestureManager& gestureManager = application.GetGestureManager();
+ gestureManager.Initialize();
+
+ detector.SetMaximumTouchesRequired(4);
+
+ // Gesture detection should have been updated only
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+
+ // Reset values
+ gestureManager.Initialize();
+
+ // Create a second gesture detector that requires even less maximum touches
+ PanGestureDetector secondDetector = PanGestureDetector::New();
+ secondDetector.Attach(actor);
+
+ // Gesture detection should NOT have been updated
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureGetMinimumTouchesRequired(void)
+{
+ TestApplication application;
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ DALI_TEST_EQUALS(1u, detector.GetMinimumTouchesRequired(), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureGetMaximumTouchesRequired(void)
+{
+ TestApplication application;
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ DALI_TEST_EQUALS(1u, detector.GetMaximumTouchesRequired(), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureSignalReceptionNegative(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Do a pan outside actor's area
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(110.0f, 110.0f), Vector2(112.0f, 112.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(110.0f, 110.0f), Vector2(112.0f, 112.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Continue pan into actor's area - we should still not receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(112.0f, 112.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Stop panning - we should still not receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(20.0f, 20.0f), Vector2(12.0f, 12.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureSignalReceptionDownMotionLeave(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Start pan within the actor's area
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Started, data.receivedGesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(10.0f, 0.0f), data.receivedGesture.displacement, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(1.0f, 0.0f), data.receivedGesture.velocity, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(10.0f, data.receivedGesture.GetDistance(), 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(1.0f, data.receivedGesture.GetSpeed(), 0.01f, TEST_LOCATION);
+
+ // Continue the pan within the actor's area - we should still receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(20.0f, 20.0f), Vector2(20.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Continuing, data.receivedGesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(0.0f, -10.0f), data.receivedGesture.displacement, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(0.0f, -1.0f), data.receivedGesture.velocity, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(10.0f, data.receivedGesture.GetDistance(), 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(1.0f, data.receivedGesture.GetSpeed(), 0.01f, TEST_LOCATION);
+
+ // Pan Gesture leaves actor's area - we should still receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(20.0f, 10.0f), Vector2(320.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Continuing, data.receivedGesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(300.0f, 0.0f), data.receivedGesture.displacement, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(30.0f, 0.0f), data.receivedGesture.velocity, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(300.0f, data.receivedGesture.GetDistance(), 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(30.0f, data.receivedGesture.GetSpeed(), 0.01f, TEST_LOCATION);
+
+ // Gesture ends - we would receive a finished state
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(320.0f, 10.0f), Vector2(310.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Finished, data.receivedGesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(-10.0f, 0.0f), data.receivedGesture.displacement, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(-1.0f, 0.0f), data.receivedGesture.velocity, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(10.0f, data.receivedGesture.GetDistance(), 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(1.0f, data.receivedGesture.GetSpeed(), 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureSignalReceptionDownMotionUp(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Start pan within the actor's area
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Started, data.receivedGesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(10.0f, 0.0f), data.receivedGesture.displacement, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(1.0f, 0.0f), data.receivedGesture.velocity, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(10.0f, data.receivedGesture.GetDistance(), 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(1.0f, data.receivedGesture.GetSpeed(), 0.01f, TEST_LOCATION);
+
+ // Continue the pan within the actor's area - we should still receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(20.0f, 20.0f), Vector2(20.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Continuing, data.receivedGesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(0.0f, -10.0f), data.receivedGesture.displacement, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(0.0f, -1.0f), data.receivedGesture.velocity, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(10.0f, data.receivedGesture.GetDistance(), 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(1.0f, data.receivedGesture.GetSpeed(), 0.01f, TEST_LOCATION);
+
+ // Gesture ends within actor's area - we would receive a finished state
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(20.0f, 10.0f), Vector2(10.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Finished, data.receivedGesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(-10.0f, 0.0f), data.receivedGesture.displacement, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(-1.0f, 0.0f), data.receivedGesture.velocity, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(10.0f, data.receivedGesture.GetDistance(), 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(1.0f, data.receivedGesture.GetSpeed(), 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureSignalReceptionCancelled(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Start pan within the actor's area
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Started, data.receivedGesture.state, TEST_LOCATION);
+
+ // Continue the pan within the actor's area - we should still receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(20.0f, 20.0f), Vector2(20.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Continuing, data.receivedGesture.state, TEST_LOCATION);
+
+ // The gesture is cancelled
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Cancelled, Vector2(20.0f, 10.0f), Vector2(10.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Cancelled, data.receivedGesture.state, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureSignalReceptionDetach(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Start pan within the actor's area
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Continue the pan within the actor's area - we should still receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(20.0f, 20.0f), Vector2(20.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Gesture ends within actor's area
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(20.0f, 10.0f), Vector2(10.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Detach actor
+ detector.DetachAll();
+
+ // Ensure we are no longer signalled
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(20.0f, 20.0f), Vector2(20.0f, 10.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(20.0f, 10.0f), Vector2(10.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureSignalReceptionDetachWhilePanning(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Start pan within the actor's area
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Continue the pan within the actor's area - we should still receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(20.0f, 20.0f), Vector2(20.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Detach actor during the pan, we should not receive the next event
+ detector.DetachAll();
+
+ // Gesture ends within actor's area
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(20.0f, 10.0f), Vector2(10.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureSignalReceptionActorDestroyedWhilePanning(void)
+{
+ TestApplication application;
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Attach a temporary actor to stop detector being removed from PanGestureProcessor when main actor
+ // is destroyed.
+ Actor tempActor = Actor::New();
+ tempActor.SetSize(100.0f, 100.0f);
+ tempActor.SetAnchorPoint(AnchorPoint::BOTTOM_RIGHT);
+ Stage::GetCurrent().Add(tempActor);
+ detector.Attach(tempActor);
+
+ // Actor lifetime is scoped
+ {
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ detector.Attach(actor);
+
+ // Start pan within the actor's area
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Continue the pan within the actor's area - we should still receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(20.0f, 20.0f), Vector2(20.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Remove the actor from stage and reset the data
+ Stage::GetCurrent().Remove(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+ }
+
+ // Actor should now have been destroyed
+
+ // Gesture ends within the area where the actor used to be
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(20.0f, 10.0f), Vector2(10.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureSignalReceptionRotatedActor(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetRotation(Dali::Degree(90.0f), Vector3::ZAXIS);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Do an entire pan, only check finished value
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(11.0f, 12.0f), Vector2(22.0f, 12.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(11.0f, 12.0f), Vector2(22.0f, 12.0f), 10));
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(22.0f, 12.0f), Vector2(27.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(8.0f, -5.0f), data.receivedGesture.displacement, 0.01f, TEST_LOCATION); // Actor relative
+
+ // Rotate actor again and render a couple of times
+ actor.SetRotation(Dali::Degree(180.0f), Vector3::ZAXIS);
+ application.SendNotification();
+ application.Render();
+
+ // Do an entire pan, only check finished value
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(11.0f, 12.0f), Vector2(22.0f, 12.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(11.0f, 12.0f), Vector2(22.0f, 12.0f), 10));
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(22.0f, 12.0f), Vector2(27.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(-5.0f, -8.0f), data.receivedGesture.displacement, 0.01f, TEST_LOCATION); // Actor relative
+
+ // Rotate actor again and render a couple of times
+ actor.SetRotation(Dali::Degree(270.0f), Vector3::ZAXIS);
+ application.SendNotification();
+ application.Render();
+
+ // Do an entire pan, only check finished value
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(11.0f, 12.0f), Vector2(22.0f, 12.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(11.0f, 12.0f), Vector2(22.0f, 12.0f), 10));
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(22.0f, 12.0f), Vector2(27.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(-8.0f, 5.0f), data.receivedGesture.displacement, 0.01f, TEST_LOCATION); // Actor relative
+ END_TEST;
+}
+
+int UtcDaliPanGestureSignalReceptionChildHit(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ parent.SetSize(100.0f, 100.0f);
+ parent.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(parent);
+
+ // Set child to completely cover parent.
+ // Change rotation of child to be different from parent so that we can check if our local coordinate
+ // conversion of the parent actor is correct.
+ Actor child = Actor::New();
+ child.SetSize(100.0f, 100.0f);
+ child.SetAnchorPoint(AnchorPoint::CENTER);
+ child.SetParentOrigin(ParentOrigin::CENTER);
+ child.SetRotation(Dali::Degree(90.0f), Vector3::ZAXIS);
+ parent.Add(child);
+
+ TouchEventFunctor touchFunctor;
+ child.TouchedSignal().Connect(&application, touchFunctor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach(parent);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Do an entire pan, only check finished value - hits child area but parent should still receive it
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(11.0f, 12.0f), Vector2(22.0f, 12.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(11.0f, 12.0f), Vector2(22.0f, 12.0f), 10));
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(22.0f, 12.0f), Vector2(27.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, parent == data.pannedActor, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(5.0f, 8.0f), data.receivedGesture.displacement, 0.01f, TEST_LOCATION); // Actor relative
+
+ // Attach child and generate same touch points to yield a different displacement
+ // (Also proves that you can detach and then re-attach another actor)
+ detector.Attach(child);
+ detector.Detach(parent);
+
+ // Do an entire pan, only check finished value
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(11.0f, 12.0f), Vector2(22.0f, 12.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(11.0f, 12.0f), Vector2(22.0f, 12.0f), 10));
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(22.0f, 12.0f), Vector2(27.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, child == data.pannedActor, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(8.0f, -5.0f), data.receivedGesture.displacement, 0.01f, TEST_LOCATION); // Actor relative
+ END_TEST;
+}
+
+int UtcDaliPanGestureSignalReceptionAttachDetachMany(void)
+{
+ TestApplication application;
+
+ Actor first = Actor::New();
+ first.SetSize(100.0f, 100.0f);
+ first.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(first);
+
+ Actor second = Actor::New();
+ second.SetSize(100.0f, 100.0f);
+ second.SetX(100.0f);
+ second.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(second);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach(first);
+ detector.Attach(second);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Start pan within second actor's area
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(110.0f, 20.0f), Vector2(120.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(110.0f, 20.0f), Vector2(120.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, second == data.pannedActor, TEST_LOCATION);
+
+ // Pan moves into first actor's area - second actor should receive the pan
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(120.0f, 20.0f), Vector2(20.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, second == data.pannedActor, TEST_LOCATION);
+
+ // Detach the second actor during the pan, we should not receive the next event
+ detector.Detach(second);
+
+ // Gesture ends within actor's area
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(20.0f, 10.0f), Vector2(10.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureSignalReceptionActorBecomesUntouchable(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Start pan in actor's area
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Pan continues within actor's area
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(20.0f, 20.0f), Vector2(20.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Actor become invisible - actor should not receive the next pan
+ actor.SetVisible(false);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Gesture ends within actor's area
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(20.0f, 10.0f), Vector2(10.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureSignalReceptionMultipleGestureDetectors(void)
+{
+ TestApplication application;
+ Dali::TestGestureManager& gestureManager = application.GetGestureManager();
+
+ Actor first = Actor::New();
+ first.SetSize(100.0f, 100.0f);
+ first.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(first);
+
+ Actor second = Actor::New();
+ second.SetSize(100.0f, 100.0f);
+ second.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ first.Add(second);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PanGestureDetector firstDetector = PanGestureDetector::New();
+ firstDetector.Attach(first);
+ firstDetector.DetectedSignal().Connect(&application, functor);
+
+ // secondDetector is scoped
+ {
+ // Reset gestureManager statistics
+ gestureManager.Initialize();
+
+ PanGestureDetector secondDetector = PanGestureDetector::New();
+ secondDetector.SetMinimumTouchesRequired(2);
+ secondDetector.SetMaximumTouchesRequired(2);
+ secondDetector.Attach(second);
+ secondDetector.DetectedSignal().Connect(&application, functor);
+
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+
+ // Start pan within second actor's area
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10, 2));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10, 2));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, second == data.pannedActor, TEST_LOCATION);
+
+ // Two touch pan changes to single touch - we should receive a finished state
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(20.0f, 20.0f), Vector2(20.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Finished, data.receivedGesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, second == data.pannedActor, TEST_LOCATION);
+
+ // Pan continues as single touch gesture - we should not receive any gesture
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(20.0f, 10.0f), Vector2(30.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Pan ends - still no signal
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(30.0f, 10.0f), Vector2(30.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Single touch pan starts - first actor should be panned
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, first == data.pannedActor, TEST_LOCATION);
+
+ // Pan changes to double-touch - we should receive a finished state
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(20.0f, 20.0f), Vector2(20.0f, 10.0f), 10, 2));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Finished, data.receivedGesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, first == data.pannedActor, TEST_LOCATION);
+
+ // Pan continues as double touch gesture - we should not receive any gesture
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(20.0f, 10.0f), Vector2(30.0f, 10.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Pan ends - still no signal
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(30.0f, 10.0f), Vector2(30.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Reset gesture manager statistics
+ gestureManager.Initialize();
+ }
+
+ // secondDetector has now been deleted. Gesture detection should have been updated only
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureSignalReceptionMultipleDetectorsOnActor(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ Actor actor2 = Actor::New();
+ actor2.SetSize(100.0f, 100.0f);
+ actor2.SetAnchorPoint(AnchorPoint::BOTTOM_RIGHT);
+ Stage::GetCurrent().Add(actor2);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to one detector
+ SignalData firstData;
+ GestureReceivedFunctor firstFunctor(firstData);
+ PanGestureDetector firstDetector = PanGestureDetector::New();
+ firstDetector.Attach(actor);
+ firstDetector.DetectedSignal().Connect(&application, firstFunctor);
+
+ // Attach actor to another detector
+ SignalData secondData;
+ GestureReceivedFunctor secondFunctor(secondData);
+ PanGestureDetector secondDetector = PanGestureDetector::New();
+ secondDetector.Attach(actor);
+ secondDetector.DetectedSignal().Connect(&application, secondFunctor);
+
+ // Add second actor to second detector, when we remove the actor, this will make sure that this
+ // gesture detector is not removed from the GestureDetectorProcessor. In this scenario, the
+ // functor should still not be called (which is what we're also testing).
+ secondDetector.Attach(actor2);
+
+ // Pan in actor's area - both detector's functors should be called
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, firstData.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, secondData.functorCalled, TEST_LOCATION);
+
+ // Pan continues in actor's area - both detector's functors should be called
+ firstData.Reset();
+ secondData.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(20.0f, 20.0f), Vector2(10.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, firstData.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, secondData.functorCalled, TEST_LOCATION);
+
+ // Detach actor from firstDetector and emit pan on actor, only secondDetector's functor should be called.
+ firstDetector.Detach(actor);
+ firstData.Reset();
+ secondData.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(20.0f, 20.0f), Vector2(10.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(false, firstData.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, secondData.functorCalled, TEST_LOCATION);
+
+ // New pan on actor, only secondDetector has actor attached
+ firstData.Reset();
+ secondData.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(false, firstData.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, secondData.functorCalled, TEST_LOCATION);
+
+ // Detach actor from secondDetector
+ secondDetector.Detach(actor);
+ firstData.Reset();
+ secondData.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(20.0f, 20.0f), Vector2(10.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(false, firstData.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(false, secondData.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureSignalReceptionMultipleStarted(void)
+{
+ // Should handle two started events gracefully.
+
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Start pan in actor's area
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Send another start in actor's area
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Add a child actor to overlap actor and send another start in actor's area
+ Actor child = Actor::New();
+ child.SetSize(100.0f, 100.0f);
+ child.SetAnchorPoint(AnchorPoint::CENTER);
+ child.SetParentOrigin(ParentOrigin::CENTER);
+ actor.Add(child);
+
+ TouchEventFunctor touchFunctor;
+ child.TouchedSignal().Connect(&application, touchFunctor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Send another possible and start in actor's area
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Send another start in actor's area
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureSignalReceptionEnsureCorrectSignalling(void)
+{
+ TestApplication application;
+
+ Actor actor1 = Actor::New();
+ actor1.SetSize(100.0f, 100.0f);
+ actor1.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor1);
+ SignalData data1;
+ GestureReceivedFunctor functor1(data1);
+ PanGestureDetector detector1 = PanGestureDetector::New();
+ detector1.Attach(actor1);
+ detector1.DetectedSignal().Connect(&application, functor1);
+
+ Actor actor2 = Actor::New();
+ actor2.SetSize(100.0f, 100.0f);
+ actor2.SetAnchorPoint(AnchorPoint::BOTTOM_RIGHT);
+ actor2.SetParentOrigin(ParentOrigin::BOTTOM_RIGHT);
+ Stage::GetCurrent().Add(actor2);
+ SignalData data2;
+ GestureReceivedFunctor functor2(data2);
+ PanGestureDetector detector2 = PanGestureDetector::New();
+ detector2.Attach(actor2);
+ detector2.DetectedSignal().Connect(&application, functor2);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Start pan in actor1's area, only data1 should be set
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data1.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(false, data2.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureSignalReceptionDifferentPossible(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Gesture possible in actor's area.
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Move actor somewhere else
+ actor.SetPosition( 100.0f, 100.0f );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Emit Started event, we should not receive the long press.
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // LongPress possible in empty area.
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Move actor in to the long press position.
+ actor.SetPosition( 0.0f, 0.0f );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Emit Started event, we should not receive the long press.
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Normal long press in actor's area for completeness.
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureEmitIncorrectState(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Try a Clear state
+ try
+ {
+ application.ProcessEvent(GeneratePan(Gesture::Clear, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ tet_result(TET_FAIL);
+ }
+ catch ( Dali::DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "false", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliPanGestureActorUnstaged(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // State to remove actor in.
+ Gesture::State stateToUnstage( Gesture::Started );
+
+ // Attach actor to detector
+ SignalData data;
+ UnstageActorFunctor functor( data, stateToUnstage );
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Emit signals
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Re-add actor to stage
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Change state to Gesture::Continuing to remove
+ stateToUnstage = Gesture::Continuing;
+
+ // Emit signals
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Re-add actor to stage
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Change state to Gesture::Finished to remove
+ stateToUnstage = Gesture::Finished;
+
+ // Emit signals
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ tet_result( TET_PASS ); // If we get here then we have handled actor stage removal gracefully.
+ END_TEST;
+}
+
+int UtcDaliPanGestureActorStagedAndDestroyed(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Create and add a second actor so that GestureDetector destruction does not come into play.
+ Actor dummyActor( Actor::New() );
+ dummyActor.SetSize( 100.0f, 100.0f );
+ dummyActor.SetPosition( 100.0f, 100.0f );
+ dummyActor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(dummyActor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // State to remove actor in.
+ Gesture::State stateToUnstage( Gesture::Started );
+
+ // Attach actor to detector
+ SignalData data;
+ UnstageActorFunctor functor( data, stateToUnstage );
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach(actor);
+ detector.Attach(dummyActor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Here we are testing a Started actor which is removed in the Started callback, but then added back
+ // before we get a continuing state. As we were removed from the stage, even if we're at the same
+ // position, we should still not be signalled.
+
+ // Emit signals
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Re add to the stage, we should not be signalled
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Continue signal emission
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+
+ // Here we delete an actor in started, we should not receive any subsequent signalling.
+
+ // Emit signals
+ application.ProcessEvent(GeneratePan(Gesture::Possible, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ application.ProcessEvent(GeneratePan(Gesture::Started, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Delete actor as well
+ actor = NULL;
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Continue signal emission
+ application.ProcessEvent(GeneratePan(Gesture::Continuing, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GeneratePan(Gesture::Finished, Vector2(10.0f, 20.0f), Vector2(20.0f, 20.0f), 10));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPanGestureSystemOverlay(void)
+{
+ TestApplication application;
+ Dali::Integration::Core& core = application.GetCore();
+ Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() );
+ systemOverlay.GetOverlayRenderTasks().CreateTask();
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ systemOverlay.Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ Vector2 screenCoordsStart( 10.0f, 20.0f );
+ Vector2 screenCoordsEnd( 20.0f, 20.0f );
+
+ // Start pan within the actor's area
+ application.ProcessEvent( GeneratePan( Gesture::Possible, screenCoordsStart, screenCoordsEnd, 10 ) );
+ application.ProcessEvent( GeneratePan( Gesture::Started, screenCoordsStart, screenCoordsEnd, 10 ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliPanGestureAngleHandling(void)
+{
+ TestApplication application;
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ const PanGestureDetector::AngleContainer& angles( detector.GetAngles() );
+ DALI_TEST_EQUALS( angles.empty(), true, TEST_LOCATION );
+
+ detector.AddAngle( PanGestureDetector::DIRECTION_LEFT, Radian( Math::PI * 0.25 ) );
+ DALI_TEST_EQUALS( angles.size(), static_cast<AngleSizeType>(1), TEST_LOCATION );
+ for ( PanGestureDetector::AngleContainer::const_iterator iter = angles.begin(), endIter = angles.end(); iter != endIter; ++iter )
+ {
+ if ( iter->first == PanGestureDetector::DIRECTION_LEFT )
+ {
+ tet_result( TET_PASS );
+ break;
+ }
+
+ if ( iter == endIter )
+ {
+ tet_printf("%s, angle not added\n", TEST_LOCATION );
+ tet_result( TET_FAIL );
+ }
+ }
+
+ detector.AddAngle( PanGestureDetector::DIRECTION_RIGHT, Radian( Math::PI * 0.25 ) );
+ DALI_TEST_EQUALS( angles.size(), static_cast<AngleSizeType>(2), TEST_LOCATION );
+
+ // Remove something not in the container.
+ detector.RemoveAngle( PanGestureDetector::DIRECTION_UP );
+ DALI_TEST_EQUALS( angles.size(), static_cast<AngleSizeType>(2), TEST_LOCATION );
+
+ detector.RemoveAngle( PanGestureDetector::DIRECTION_RIGHT );
+ DALI_TEST_EQUALS( angles.size(), static_cast<AngleSizeType>(1), TEST_LOCATION );
+ for ( PanGestureDetector::AngleContainer::const_iterator iter = angles.begin(), endIter = angles.end(); iter != endIter; ++iter )
+ {
+ if ( iter->first == PanGestureDetector::DIRECTION_RIGHT )
+ {
+ tet_printf("%s, angle not removed\n", TEST_LOCATION );
+ tet_result( TET_FAIL );
+ break;
+ }
+ }
+
+ detector.ClearAngles();
+ DALI_TEST_EQUALS( angles.size(), static_cast<AngleSizeType>(0), TEST_LOCATION );
+ END_TEST;
+}
+
+inline float RadiansToDegrees( float radian )
+{
+ return radian * 180.0f / Math::PI;
+}
+
+int UtcDaliPanGestureAngleOutOfRange(void)
+{
+ TestApplication application;
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ const PanGestureDetector::AngleContainer& angles( detector.GetAngles() );
+ DALI_TEST_EQUALS( angles.empty(), true, TEST_LOCATION );
+
+ //
+ // Angle
+ //
+
+ detector.AddAngle( Degree(180.0f) );
+ DALI_TEST_EQUALS( angles.begin()->first, Radian( Degree(-180.0f) ), 0.000001, TEST_LOCATION );
+ detector.ClearAngles();
+
+ detector.AddAngle( Degree(190.0f) );
+ DALI_TEST_EQUALS( angles.begin()->first, Radian( Degree(-170.0f) ), 0.000001, TEST_LOCATION );
+ detector.ClearAngles();
+
+ detector.AddAngle( Degree(-190.0f) );
+ DALI_TEST_EQUALS( angles.begin()->first, Radian( Degree(170.0f) ), 0.000001, TEST_LOCATION );
+ detector.ClearAngles();
+
+ detector.AddAngle( Degree(350.0f) );
+ DALI_TEST_EQUALS( angles.begin()->first, Radian( Degree(-10.0f) ), 0.000001, TEST_LOCATION );
+ detector.ClearAngles();
+
+ detector.AddAngle( Degree(-350.0f) );
+ DALI_TEST_EQUALS( angles.begin()->first, Radian( Degree(10.0f) ), 0.000001, TEST_LOCATION );
+ detector.ClearAngles();
+
+ detector.AddAngle( Degree(370.0f) );
+ DALI_TEST_EQUALS( angles.begin()->first, Radian( Degree(10.0f) ), 0.000001, TEST_LOCATION );
+ detector.ClearAngles();
+
+ detector.AddAngle( Degree(-370.0f) );
+ DALI_TEST_EQUALS( angles.begin()->first, Radian( Degree(-10.0f) ), 0.000001, TEST_LOCATION );
+ detector.ClearAngles();
+
+ //
+ // Threshold
+ //
+
+ detector.AddAngle( PanGestureDetector::DIRECTION_RIGHT, Degree( 0.0f ) );
+ DALI_TEST_EQUALS( angles.begin()->second, Radian( Degree(0.0f) ), 0.000001, TEST_LOCATION );
+ detector.ClearAngles();
+
+ detector.AddAngle( PanGestureDetector::DIRECTION_RIGHT, Degree( -10.0f ) );
+ DALI_TEST_EQUALS( angles.begin()->second, Radian( Degree(10.0f) ), 0.000001, TEST_LOCATION );
+ detector.ClearAngles();
+
+ detector.AddAngle( PanGestureDetector::DIRECTION_RIGHT, Degree( -181.0f ) );
+ DALI_TEST_EQUALS( angles.begin()->second, Radian( Degree(180.0f) ), 0.000001, TEST_LOCATION );
+ detector.ClearAngles();
+
+ detector.AddAngle( PanGestureDetector::DIRECTION_RIGHT, Degree( 181.0f ) );
+ DALI_TEST_EQUALS( angles.begin()->second, Radian( Degree(180.0f) ), 0.000001, TEST_LOCATION );
+ detector.ClearAngles();
+ END_TEST;
+}
+
+int UtcDaliPanGestureAngleProcessing(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ parent.SetSize(100.0f, 100.0f);
+ parent.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(parent);
+
+ Actor child = Actor::New();
+ child.SetSize(100.0f, 100.0f);
+ child.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ parent.Add(child);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Parent detector only requires up pans
+ PanGestureDetector parentDetector = PanGestureDetector::New();
+ parentDetector.Attach( parent );
+ parentDetector.AddAngle( PanGestureDetector::DIRECTION_UP, Degree( 30.0f ) );
+ SignalData parentData;
+ GestureReceivedFunctor parentFunctor(parentData);
+ parentDetector.DetectedSignal().Connect(&application, parentFunctor);
+
+ // Child detector only requires right pans
+ PanGestureDetector childDetector = PanGestureDetector::New();
+ childDetector.Attach( child );
+ childDetector.AddAngle( PanGestureDetector::DIRECTION_RIGHT, Degree( 30.0f ) );
+ SignalData childData;
+ GestureReceivedFunctor childFunctor(childData);
+ childDetector.DetectedSignal().Connect(&application, childFunctor);
+
+ // Generate an Up pan gesture, only parent should receive it.
+ application.ProcessEvent( GeneratePan( Gesture::Possible, Vector2(20.0f, 20.0f), Vector2(20.0f, 20.0f), 10 ) );
+ application.ProcessEvent( GeneratePan( Gesture::Started, Vector2(20.0f, 20.0f), Vector2(20.0f, 10.0f), 10 ) );
+ DALI_TEST_EQUALS( true, parentData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( false, childData.functorCalled, TEST_LOCATION );
+ application.ProcessEvent( GeneratePan( Gesture::Finished, Vector2(20.0f, 30.0f), Vector2(20.0f, 20.0f), 10 ) );
+ parentData.Reset();
+ childData.Reset();
+
+ // Generate a Right pan gesture, only child should receive it.
+ application.ProcessEvent( GeneratePan( Gesture::Possible, Vector2(20.0f, 20.0f), Vector2(20.0f, 20.0f), 10 ) );
+ application.ProcessEvent( GeneratePan( Gesture::Started, Vector2(20.0f, 20.0f), Vector2(30.0f, 20.0f), 10 ) );
+ DALI_TEST_EQUALS( false, parentData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, childData.functorCalled, TEST_LOCATION );
+ application.ProcessEvent( GeneratePan( Gesture::Finished, Vector2(20.0f, 30.0f), Vector2(20.0f, 20.0f), 10 ) );
+ parentData.Reset();
+ childData.Reset();
+
+ // Generate a Down pan gesture, no one should receive it.
+ application.ProcessEvent( GeneratePan( Gesture::Possible, Vector2(20.0f, 20.0f), Vector2(20.0f, 20.0f), 10 ) );
+ application.ProcessEvent( GeneratePan( Gesture::Started, Vector2(20.0f, 20.0f), Vector2(20.0f, 30.0f), 10 ) );
+ DALI_TEST_EQUALS( false, parentData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( false, childData.functorCalled, TEST_LOCATION );
+ application.ProcessEvent( GeneratePan( Gesture::Finished, Vector2(20.0f, 30.0f), Vector2(20.0f, 20.0f), 10 ) );
+ parentData.Reset();
+ childData.Reset();
+
+ // Generate a Left pan gesture, no one should receive it.
+ application.ProcessEvent( GeneratePan( Gesture::Possible, Vector2(20.0f, 20.0f), Vector2(20.0f, 20.0f), 10 ) );
+ application.ProcessEvent( GeneratePan( Gesture::Started, Vector2(20.0f, 20.0f), Vector2(10.0f, 20.0f), 10 ) );
+ DALI_TEST_EQUALS( false, parentData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( false, childData.functorCalled, TEST_LOCATION );
+ application.ProcessEvent( GeneratePan( Gesture::Finished, Vector2(20.0f, 30.0f), Vector2(20.0f, 20.0f), 10 ) );
+ parentData.Reset();
+ childData.Reset();
+ END_TEST;
+}
+
+int UtcDaliPanGestureDirectionHandling(void)
+{
+ TestApplication application;
+
+ PanGestureDetector detector = PanGestureDetector::New();
+ const PanGestureDetector::AngleContainer& angles( detector.GetAngles() );
+ DALI_TEST_EQUALS( angles.empty(), true, TEST_LOCATION );
+
+ detector.AddDirection( PanGestureDetector::DIRECTION_LEFT, Radian( Math::PI * 0.25 ) );
+ DALI_TEST_EQUALS( angles.size(), static_cast<AngleSizeType>(2), TEST_LOCATION );
+ for ( PanGestureDetector::AngleContainer::const_iterator iter = angles.begin(), endIter = angles.end(); iter != endIter; ++iter )
+ {
+ if ( iter->first == PanGestureDetector::DIRECTION_LEFT )
+ {
+ tet_result( TET_PASS );
+ break;
+ }
+
+ if ( iter == endIter )
+ {
+ tet_printf("%s, angle not added\n", TEST_LOCATION );
+ tet_result( TET_FAIL );
+ }
+ }
+
+ for ( PanGestureDetector::AngleContainer::const_iterator iter = angles.begin(), endIter = angles.end(); iter != endIter; ++iter )
+ {
+ if ( iter->first == PanGestureDetector::DIRECTION_RIGHT )
+ {
+ tet_result( TET_PASS );
+ break;
+ }
+
+ if ( iter == endIter )
+ {
+ tet_printf("%s, angle not added\n", TEST_LOCATION );
+ tet_result( TET_FAIL );
+ }
+ }
+
+ // Remove something not in the container.
+ detector.RemoveDirection( PanGestureDetector::DIRECTION_UP );
+ DALI_TEST_EQUALS( angles.size(), static_cast<AngleSizeType>(2), TEST_LOCATION );
+
+ detector.RemoveDirection( PanGestureDetector::DIRECTION_RIGHT );
+ DALI_TEST_EQUALS( angles.size(), static_cast<AngleSizeType>(0), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliPanGestureDirectionProcessing(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ parent.SetSize(100.0f, 100.0f);
+ parent.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(parent);
+
+ Actor child = Actor::New();
+ child.SetSize(100.0f, 100.0f);
+ child.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ parent.Add(child);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Parent detector only requires vertical panning
+ PanGestureDetector parentDetector = PanGestureDetector::New();
+ parentDetector.Attach( parent );
+ parentDetector.AddDirection( PanGestureDetector::DIRECTION_VERTICAL, Degree( 30.0f ) );
+ SignalData parentData;
+ GestureReceivedFunctor parentFunctor(parentData);
+ parentDetector.DetectedSignal().Connect(&application, parentFunctor);
+
+ // Child detector only requires horizontal panning
+ PanGestureDetector childDetector = PanGestureDetector::New();
+ childDetector.Attach( child );
+ childDetector.AddDirection( PanGestureDetector::DIRECTION_HORIZONTAL, Degree( 30.0f ) );
+ SignalData childData;
+ GestureReceivedFunctor childFunctor(childData);
+ childDetector.DetectedSignal().Connect(&application, childFunctor);
+
+ // Generate an Up pan gesture, only parent should receive it.
+ application.ProcessEvent( GeneratePan( Gesture::Possible, Vector2(20.0f, 20.0f), Vector2(20.0f, 20.0f), 10 ) );
+ application.ProcessEvent( GeneratePan( Gesture::Started, Vector2(20.0f, 20.0f), Vector2(20.0f, 10.0f), 10 ) );
+ DALI_TEST_EQUALS( true, parentData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( false, childData.functorCalled, TEST_LOCATION );
+ application.ProcessEvent( GeneratePan( Gesture::Finished, Vector2(20.0f, 30.0f), Vector2(20.0f, 20.0f), 10 ) );
+ parentData.Reset();
+ childData.Reset();
+
+ // Generate a Right pan gesture, only child should receive it.
+ application.ProcessEvent( GeneratePan( Gesture::Possible, Vector2(20.0f, 20.0f), Vector2(20.0f, 20.0f), 10 ) );
+ application.ProcessEvent( GeneratePan( Gesture::Started, Vector2(20.0f, 20.0f), Vector2(30.0f, 20.0f), 10 ) );
+ DALI_TEST_EQUALS( false, parentData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, childData.functorCalled, TEST_LOCATION );
+ application.ProcessEvent( GeneratePan( Gesture::Finished, Vector2(20.0f, 30.0f), Vector2(20.0f, 20.0f), 10 ) );
+ parentData.Reset();
+ childData.Reset();
+
+ // Generate a Down pan gesture, only parent should receive it.
+ application.ProcessEvent( GeneratePan( Gesture::Possible, Vector2(20.0f, 20.0f), Vector2(20.0f, 20.0f), 10 ) );
+ application.ProcessEvent( GeneratePan( Gesture::Started, Vector2(20.0f, 20.0f), Vector2(20.0f, 30.0f), 10 ) );
+ DALI_TEST_EQUALS( true, parentData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( false, childData.functorCalled, TEST_LOCATION );
+ application.ProcessEvent( GeneratePan( Gesture::Finished, Vector2(20.0f, 30.0f), Vector2(20.0f, 20.0f), 10 ) );
+ parentData.Reset();
+ childData.Reset();
+
+ // Generate a Left pan gesture, only child should receive it.
+ application.ProcessEvent( GeneratePan( Gesture::Possible, Vector2(20.0f, 20.0f), Vector2(20.0f, 20.0f), 10 ) );
+ application.ProcessEvent( GeneratePan( Gesture::Started, Vector2(20.0f, 20.0f), Vector2(10.0f, 20.0f), 10 ) );
+ DALI_TEST_EQUALS( false, parentData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, childData.functorCalled, TEST_LOCATION );
+ application.ProcessEvent( GeneratePan( Gesture::Finished, Vector2(20.0f, 30.0f), Vector2(20.0f, 20.0f), 10 ) );
+ parentData.Reset();
+ childData.Reset();
+
+ // Generate a pan at -45 degrees, no one should receive it.
+ application.ProcessEvent( GeneratePan( Gesture::Possible, Vector2(20.0f, 20.0f), Vector2(20.0f, 20.0f), 10 ) );
+ application.ProcessEvent( GeneratePan( Gesture::Started, Vector2(20.0f, 20.0f), Vector2(10.0f, 30.0f), 10 ) );
+ DALI_TEST_EQUALS( false, parentData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( false, childData.functorCalled, TEST_LOCATION );
+ application.ProcessEvent( GeneratePan( Gesture::Finished, Vector2(20.0f, 30.0f), Vector2(20.0f, 20.0f), 10 ) );
+ parentData.Reset();
+ childData.Reset();
+
+ // Generate a pan at 45 degrees, no one should receive it.
+ application.ProcessEvent( GeneratePan( Gesture::Possible, Vector2(20.0f, 20.0f), Vector2(20.0f, 20.0f), 10 ) );
+ application.ProcessEvent( GeneratePan( Gesture::Started, Vector2(20.0f, 20.0f), Vector2(30.0f, 30.0f), 10 ) );
+ DALI_TEST_EQUALS( false, parentData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( false, childData.functorCalled, TEST_LOCATION );
+ application.ProcessEvent( GeneratePan( Gesture::Finished, Vector2(20.0f, 30.0f), Vector2(20.0f, 20.0f), 10 ) );
+ parentData.Reset();
+ childData.Reset();
+
+ // Generate a pan at 135 degrees, no one should receive it.
+ application.ProcessEvent( GeneratePan( Gesture::Possible, Vector2(20.0f, 20.0f), Vector2(20.0f, 20.0f), 10 ) );
+ application.ProcessEvent( GeneratePan( Gesture::Started, Vector2(20.0f, 20.0f), Vector2(10.0f, 30.0f), 10 ) );
+ DALI_TEST_EQUALS( false, parentData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( false, childData.functorCalled, TEST_LOCATION );
+ application.ProcessEvent( GeneratePan( Gesture::Finished, Vector2(20.0f, 30.0f), Vector2(20.0f, 20.0f), 10 ) );
+ parentData.Reset();
+ childData.Reset();
+
+ // Generate a pan at -135 degrees, no one should receive it.
+ application.ProcessEvent( GeneratePan( Gesture::Possible, Vector2(20.0f, 20.0f), Vector2(20.0f, 20.0f), 10 ) );
+ application.ProcessEvent( GeneratePan( Gesture::Started, Vector2(20.0f, 20.0f), Vector2(10.0f, 10.0f), 10 ) );
+ DALI_TEST_EQUALS( false, parentData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( false, childData.functorCalled, TEST_LOCATION );
+ application.ProcessEvent( GeneratePan( Gesture::Finished, Vector2(20.0f, 30.0f), Vector2(20.0f, 20.0f), 10 ) );
+ parentData.Reset();
+ childData.Reset();
+ END_TEST;
+}
+
+int UtcDaliPanGestureSetProperties(void)
+{
+ TestApplication application;
+ TestRenderController& renderController( application.GetRenderController() );
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Add a pan detector
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach( actor );
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ detector.DetectedSignal().Connect( &application, functor );
+
+ Property::Index property = actor.RegisterProperty( "Dummy Property", Vector3::ZERO );
+
+ ConstraintData constraintData;
+ actor.ApplyConstraint( Constraint::New<Vector3>( property, Source( detector, PanGestureDetector::SCREEN_POSITION ),
+ Source( detector, PanGestureDetector::SCREEN_DISPLACEMENT ),
+ Source( detector, PanGestureDetector::LOCAL_POSITION ),
+ Source( detector, PanGestureDetector::LOCAL_DISPLACEMENT ),
+ PanConstraint( constraintData ) ) );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ renderController.Initialize();
+ DALI_TEST_EQUALS( renderController.WasCalled( TestRenderController::RequestUpdateFunc ), false, TEST_LOCATION );
+
+ Vector2 screenPosition( 20.0f, 20.0f );
+ Vector2 screenDisplacement( 1.0f, 1.0f );
+ Vector2 localPosition( 21.0f, 21.0f );
+ Vector2 localDisplacement( 0.5f, 0.5f );
+
+ PanGestureDetector::SetPanGestureProperties( GeneratePan( 1u, Gesture::Started, screenPosition, localPosition, screenDisplacement, localDisplacement ) );
+ DALI_TEST_EQUALS( renderController.WasCalled( TestRenderController::RequestUpdateFunc ), true, TEST_LOCATION );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( constraintData.called, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( constraintData.screenPosition, screenPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( constraintData.localPosition, localPosition, TEST_LOCATION );
+ DALI_TEST_EQUALS( constraintData.screenDisplacement, screenDisplacement, TEST_LOCATION );
+ DALI_TEST_EQUALS( constraintData.localDisplacement, localDisplacement, TEST_LOCATION );
+ constraintData.Reset();
+ END_TEST;
+}
+
+int UtcDaliPanGestureSetPropertiesAlreadyPanning(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Add a pan detector
+ PanGestureDetector detector = PanGestureDetector::New();
+ detector.Attach( actor );
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ detector.DetectedSignal().Connect( &application, functor );
+
+ Property::Index property = actor.RegisterProperty( "Dummy Property", Vector3::ZERO );
+
+ ConstraintData constraintData;
+ actor.ApplyConstraint( Constraint::New<Vector3>( property, Source( detector, PanGestureDetector::SCREEN_POSITION ),
+ Source( detector, PanGestureDetector::SCREEN_DISPLACEMENT ),
+ Source( detector, PanGestureDetector::LOCAL_POSITION ),
+ Source( detector, PanGestureDetector::LOCAL_DISPLACEMENT ),
+ PanConstraint( constraintData ) ) );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ Vector2 previousPosition( 20.0f, 20.0f );
+ Vector2 currentPosition( 20.0f, 10.0f );
+ application.ProcessEvent( GeneratePan( Gesture::Possible, previousPosition, previousPosition, 10 ) );
+ application.ProcessEvent( GeneratePan( Gesture::Started, previousPosition, currentPosition, 10 ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+
+ Vector2 screenPosition( 100.0f, 20.0f );
+ Vector2 localPosition( 110.0f, 110.0f );
+
+ PanGestureDetector::SetPanGestureProperties( GeneratePan( 1u, Gesture::Started, screenPosition, localPosition ) );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( constraintData.called, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( constraintData.screenPosition, currentPosition, 0.1, TEST_LOCATION );
+ DALI_TEST_EQUALS( constraintData.localPosition, currentPosition, 0.1f, TEST_LOCATION );
+ constraintData.Reset();
+ END_TEST;
+}
+
+int UtcDaliPanGesturePropertyIndices(void)
+{
+ TestApplication application;
+ PanGestureDetector detector = PanGestureDetector::New();
+
+ Property::IndexContainer indices;
+ detector.GetPropertyIndices( indices );
+ DALI_TEST_CHECK( ! indices.empty() );
+ DALI_TEST_EQUALS( indices.size(), detector.GetPropertyCount(), TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_pinch_gesture_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_pinch_gesture_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+// Positive test case for a method
+int UtcDaliPinchGestureConstructor(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ PinchGesture gesture(Gesture::Started);
+ DALI_TEST_EQUALS(Gesture::Started, gesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(0.0f, gesture.scale, TEST_LOCATION);
+ DALI_TEST_EQUALS(0.0f, gesture.speed, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Pinch, gesture.type, TEST_LOCATION);
+
+ PinchGesture gesture2(Gesture::Continuing);
+ DALI_TEST_EQUALS(Gesture::Continuing, gesture2.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(0.0f, gesture2.scale, TEST_LOCATION);
+ DALI_TEST_EQUALS(0.0f, gesture2.speed, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Pinch, gesture2.type, TEST_LOCATION);
+
+ PinchGesture gesture3(Gesture::Finished);
+ DALI_TEST_EQUALS(Gesture::Finished, gesture3.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(0.0f, gesture3.scale, TEST_LOCATION);
+ DALI_TEST_EQUALS(0.0f, gesture3.speed, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Pinch, gesture3.type, TEST_LOCATION);
+
+ // Test copy constructor
+ gesture3.scale = 3.0f;
+ gesture3.speed = 5.0f;
+
+ PinchGesture pinch(gesture3);
+ DALI_TEST_EQUALS(Gesture::Finished, pinch.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(3.0f, pinch.scale, TEST_LOCATION);
+ DALI_TEST_EQUALS(5.0f, pinch.speed, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Pinch, pinch.type, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureAssignment(void)
+{
+ // Test Assignment operator
+ PinchGesture gesture(Gesture::Started);
+ DALI_TEST_EQUALS(Gesture::Started, gesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(0.0f, gesture.scale, TEST_LOCATION);
+ DALI_TEST_EQUALS(0.0f, gesture.speed, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Pinch, gesture.type, TEST_LOCATION);
+
+ PinchGesture gesture2(Gesture::Continuing);
+ DALI_TEST_EQUALS(Gesture::Continuing, gesture2.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(0.0f, gesture2.scale, TEST_LOCATION);
+ DALI_TEST_EQUALS(0.0f, gesture2.speed, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Pinch, gesture2.type, TEST_LOCATION);
+
+ gesture2.scale = 3.0f;
+ gesture2.speed = 5.0f;
+
+ gesture = gesture2;
+ DALI_TEST_EQUALS(Gesture::Continuing, gesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(3.0f, gesture.scale, TEST_LOCATION);
+ DALI_TEST_EQUALS(5.0f, gesture.speed, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Pinch, gesture.type, TEST_LOCATION);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/integration-api/events/touch-event-integ.h>
+#include <dali/integration-api/events/pinch-gesture-event.h>
+#include <dali/integration-api/system-overlay.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_pinch_gesture_detector_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_pinch_gesture_detector_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace
+{
+
+// Stores data that is populated in the callback and will be read by the TET cases
+struct SignalData
+{
+ SignalData()
+ : functorCalled(false),
+ voidFunctorCalled(false),
+ receivedGesture(Gesture::Started)
+ {}
+
+ void Reset()
+ {
+ functorCalled = false;
+ voidFunctorCalled = false;
+
+ receivedGesture.state = Gesture::Started;
+ receivedGesture.scale = 0.0f;
+ receivedGesture.speed = 0.0f;
+ receivedGesture.screenCenterPoint = Vector2(0.0f, 0.0f);
+ receivedGesture.localCenterPoint = Vector2(0.0f, 0.0f);
+
+ pinchedActor = NULL;
+ }
+
+ bool functorCalled;
+ bool voidFunctorCalled;
+ PinchGesture receivedGesture;
+ Actor pinchedActor;
+};
+
+// Functor that sets the data when called
+struct GestureReceivedFunctor
+{
+ GestureReceivedFunctor(SignalData& data) : signalData(data) { }
+
+ void operator()(Actor actor, PinchGesture pinch)
+ {
+ signalData.functorCalled = true;
+ signalData.receivedGesture = pinch;
+ signalData.pinchedActor = actor;
+ }
+
+ void operator()()
+ {
+ signalData.voidFunctorCalled = true;
+ }
+
+ SignalData& signalData;
+};
+
+// Functor that removes the gestured actor from stage
+struct UnstageActorFunctor : public GestureReceivedFunctor
+{
+ UnstageActorFunctor( SignalData& data, Gesture::State& stateToUnstage )
+ : GestureReceivedFunctor( data ),
+ stateToUnstage( stateToUnstage )
+ {
+ }
+
+ void operator()( Actor actor, PinchGesture pinch )
+ {
+ GestureReceivedFunctor::operator()( actor, pinch );
+
+ if ( pinch.state == stateToUnstage )
+ {
+ Stage::GetCurrent().Remove( actor );
+ }
+ }
+
+ Gesture::State& stateToUnstage;
+};
+
+// Functor for receiving a touch event
+struct TouchEventFunctor
+{
+ bool operator()(Actor actor, const TouchEvent& touch)
+ {
+ return false;
+ }
+};
+
+// Generate a PinchGestureEvent to send to Core
+Integration::PinchGestureEvent GeneratePinch(
+ Gesture::State state,
+ float scale,
+ float speed,
+ Vector2 centerpoint)
+{
+ Integration::PinchGestureEvent pinch(state);
+
+ pinch.scale = scale;
+ pinch.speed = speed;
+ pinch.centerPoint = centerpoint;
+
+ return pinch;
+}
+
+} // anon namespace
+
+///////////////////////////////////////////////////////////////////////////////
+
+int UtcDaliPinchGestureDetectorConstructor(void)
+{
+ TestApplication application;
+
+ PinchGestureDetector detector;
+ DALI_TEST_CHECK(!detector);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureDetectorNew(void)
+{
+ TestApplication application;
+
+ PinchGestureDetector detector = PinchGestureDetector::New();
+
+ DALI_TEST_CHECK(detector);
+
+ // Attach an actor and emit a touch event on the actor to ensure complete line coverage
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ detector.Attach(actor);
+
+ Integration::TouchEvent touchEvent(1);
+ TouchPoint point(1, TouchPoint::Down, 20.0f, 20.0f);
+ touchEvent.AddPoint(point);
+ application.ProcessEvent(touchEvent);
+
+ TouchPoint point2(1, TouchPoint::Down, 20.0f, 20.0f, 20.0f, 20.0f);
+ touchEvent.AddPoint(point2);
+ application.ProcessEvent(touchEvent);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureDetectorDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::PinchGestureDetector::DownCast()");
+
+ PinchGestureDetector detector = PinchGestureDetector::New();
+
+ BaseHandle object(detector);
+
+ PinchGestureDetector detector2 = PinchGestureDetector::DownCast(object);
+ DALI_TEST_CHECK(detector2);
+
+ PinchGestureDetector detector3 = DownCast< PinchGestureDetector >(object);
+ DALI_TEST_CHECK(detector3);
+
+ BaseHandle unInitializedObject;
+ PinchGestureDetector detector4 = PinchGestureDetector::DownCast(unInitializedObject);
+ DALI_TEST_CHECK(!detector4);
+
+ PinchGestureDetector detector5 = DownCast< PinchGestureDetector >(unInitializedObject);
+ DALI_TEST_CHECK(!detector5);
+
+ GestureDetector detector6 = PinchGestureDetector::New();
+ PinchGestureDetector detector7 = PinchGestureDetector::DownCast(detector6);
+ DALI_TEST_CHECK(detector7);
+ END_TEST;
+}
+
+// Negative test case for a method
+int UtcDaliPinchGestureSignalReceptionNegative(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PinchGestureDetector detector = PinchGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Do a pinch outside actor's area
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 45.0f, Vector2(112.0f, 112.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Continue pinch into actor's area - we should still not receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Continuing, 4.5f, 95.0f, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Stop pinching - we should still not receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 10.0f, 50.0f, Vector2(12.0f, 12.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureSignalReceptionDownMotionLeave(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PinchGestureDetector detector = PinchGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Start pan within the actor's area
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Started, data.receivedGesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(10.0f, data.receivedGesture.scale, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(50.0f, data.receivedGesture.speed, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(20.0f, 20.0f), data.receivedGesture.screenCenterPoint, 0.01f, TEST_LOCATION);
+
+ // Continue the pan within the actor's area - we should still receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Continuing, 5.0f, 90.0f, Vector2(21.0f, 20.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Continuing, data.receivedGesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(5.0f, data.receivedGesture.scale, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(90.0f, data.receivedGesture.speed, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(21.0f, 20.0f), data.receivedGesture.screenCenterPoint, 0.01f, TEST_LOCATION);
+
+ // Pan Gesture leaves actor's area - we should still receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Continuing, 10.0f, 15.5f, Vector2(320.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Continuing, data.receivedGesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(10.0f, data.receivedGesture.scale, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(15.5f, data.receivedGesture.speed, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(320.0f, 10.0f), data.receivedGesture.screenCenterPoint, 0.01f, TEST_LOCATION);
+
+ // Gesture ends - we would receive a finished state
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 15.2f, 12.1f, Vector2(310.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Finished, data.receivedGesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(15.2f, data.receivedGesture.scale, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(12.1f, data.receivedGesture.speed, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(310.0f, 10.0f), data.receivedGesture.screenCenterPoint, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureSignalReceptionDownMotionUp(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PinchGestureDetector detector = PinchGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Start pinch within the actor's area
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Started, data.receivedGesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(10.0f, data.receivedGesture.scale, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(50.0f, data.receivedGesture.speed, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(20.0f, 20.0f), data.receivedGesture.screenCenterPoint, 0.01f, TEST_LOCATION);
+
+ // Continue the pinch within the actor's area - we should still receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Continuing, 5.0f, 25.0f, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Continuing, data.receivedGesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(5.0f, data.receivedGesture.scale, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(25.0f, data.receivedGesture.speed, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(20.0f, 20.0f), data.receivedGesture.screenCenterPoint, 0.01f, TEST_LOCATION);
+
+ // Gesture ends within actor's area - we would receive a finished state
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 5.0f, 25.0f, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Finished, data.receivedGesture.state, TEST_LOCATION);
+ DALI_TEST_EQUALS(5.0f, data.receivedGesture.scale, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(25.0f, data.receivedGesture.speed, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(20.0f, 20.0f), data.receivedGesture.screenCenterPoint, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureSignalReceptionCancelled(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PinchGestureDetector detector = PinchGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Start pinch within the actor's area
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Started, data.receivedGesture.state, TEST_LOCATION);
+
+
+ // Continue the pinch within the actor's area - we should still receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Continuing, 5.0f, 25.0f, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Continuing, data.receivedGesture.state, TEST_LOCATION);
+
+ // The gesture is cancelled
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Cancelled, 5.0f, 25.0f, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Cancelled, data.receivedGesture.state, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureSignalReceptionDetach(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PinchGestureDetector detector = PinchGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Start pinch within the actor's area
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Started, data.receivedGesture.state, TEST_LOCATION);
+
+
+ // Continue the pinch within the actor's area - we should still receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Continuing, 5.0f, 25.0f, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Continuing, data.receivedGesture.state, TEST_LOCATION);
+
+ // Gesture ends within actor's area
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 5.0f, 25.0f, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Finished, data.receivedGesture.state, TEST_LOCATION);
+
+ // Detach actor
+ detector.DetachAll();
+
+ // Ensure we are no longer signalled
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 20.0f)));
+ application.ProcessEvent(GeneratePinch(Gesture::Continuing, 5.0f, 25.0f, Vector2(20.0f, 20.0f)));
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 5.0f, 25.0f, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureSignalReceptionDetachWhilePinching(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PinchGestureDetector detector = PinchGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Start pinch within the actor's area
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(10.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Started, data.receivedGesture.state, TEST_LOCATION);
+
+ // Continue the pinch within the actor's area - we should still receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Continuing, 5.0f, 25.0f, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Continuing, data.receivedGesture.state, TEST_LOCATION);
+
+ // Detach actor during the pinch, we should not receive the next event
+ detector.DetachAll();
+
+ // Gesture ends within actor's area
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 5.0f, 25.0f, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureSignalReceptionActorDestroyedWhilePinching(void)
+{
+ TestApplication application;
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PinchGestureDetector detector = PinchGestureDetector::New();
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Attach a temporary actor to stop detector being removed from PinchGestureProcessor when main actor
+ // is destroyed.
+ Actor tempActor = Actor::New();
+ tempActor.SetSize(100.0f, 100.0f);
+ tempActor.SetAnchorPoint(AnchorPoint::BOTTOM_RIGHT);
+ Stage::GetCurrent().Add(tempActor);
+ detector.Attach(tempActor);
+
+ // Actor lifetime is scoped
+ {
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ detector.Attach(actor);
+
+ // Start pinch within the actor's area
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(10.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Started, data.receivedGesture.state, TEST_LOCATION);
+
+ // Continue the pinch within the actor's area - we should still receive the signal
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Continuing, 5.0f, 25.0f, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Continuing, data.receivedGesture.state, TEST_LOCATION);
+
+ // Remove the actor from stage and reset the data
+ Stage::GetCurrent().Remove(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+ }
+
+ // Actor should now have been destroyed
+
+ // Gesture ends within the area where the actor used to be
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 5.0f, 25.0f, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureSignalReceptionRotatedActor(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetRotation(Dali::Degree(90.0f), Vector3::ZAXIS);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify a couple of times
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PinchGestureDetector detector = PinchGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Do an entire pinch, only check finished value
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(10.0f, 10.0f)));
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 10.0f, 50.0f, Vector2(10.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(10.0f, data.receivedGesture.scale, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(50.0f, data.receivedGesture.speed, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(10.0f, 10.0f), data.receivedGesture.screenCenterPoint, 0.01f, TEST_LOCATION);
+
+ // Rotate actor again and render and notify
+ actor.SetRotation(Dali::Degree(180.0f), Vector3::ZAXIS);
+ application.SendNotification();
+ application.Render();
+
+ // Do an entire pinch, only check finished value
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(10.0f, 10.0f)));
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 10.0f, 50.0f, Vector2(10.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(10.0f, data.receivedGesture.scale, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(50.0f, data.receivedGesture.speed, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(10.0f, 10.0f), data.receivedGesture.screenCenterPoint, 0.01f, TEST_LOCATION);
+
+ // Rotate actor again and render and notify
+ actor.SetRotation(Dali::Degree(270.0f), Vector3::ZAXIS);
+ application.SendNotification();
+ application.Render();
+
+ // Do an entire pinch, only check finished value
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(10.0f, 10.0f)));
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 10.0f, 50.0f, Vector2(10.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(10.0f, data.receivedGesture.scale, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(50.0f, data.receivedGesture.speed, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(10.0f, 10.0f), data.receivedGesture.screenCenterPoint, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureSignalReceptionChildHit(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ parent.SetSize(100.0f, 100.0f);
+ parent.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(parent);
+
+ // Set child to completely cover parent.
+ // Change rotation of child to be different from parent so that we can check if our local coordinate
+ // conversion of the parent actor is correct.
+ Actor child = Actor::New();
+ child.SetSize(100.0f, 100.0f);
+ child.SetAnchorPoint(AnchorPoint::CENTER);
+ child.SetParentOrigin(ParentOrigin::CENTER);
+ child.SetRotation(Dali::Degree(90.0f), Vector3::ZAXIS);
+ parent.Add(child);
+
+ TouchEventFunctor touchFunctor;
+ child.TouchedSignal().Connect(&application, touchFunctor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PinchGestureDetector detector = PinchGestureDetector::New();
+ detector.Attach(parent);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Do an entire pan, only check finished value - hits child area but parent should still receive it
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(10.0f, 10.0f)));
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 5.0f, 50.0f, Vector2(10.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, parent == data.pinchedActor, TEST_LOCATION);
+ DALI_TEST_EQUALS(5.0f, data.receivedGesture.scale, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(50.0f, data.receivedGesture.speed, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(10.0f, 10.0f), data.receivedGesture.screenCenterPoint, 0.01f, TEST_LOCATION);
+
+ // Attach child and generate same touch points to yield same results
+ // (Also proves that you can detach and then re-attach another actor)
+ detector.Attach(child);
+ detector.Detach(parent);
+
+ // Do an entire pan, only check finished value
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(10.0f, 10.0f)));
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 5.0f, 50.0f, Vector2(10.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, child == data.pinchedActor, TEST_LOCATION);
+ DALI_TEST_EQUALS(5.0f, data.receivedGesture.scale, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(50.0f, data.receivedGesture.speed, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(10.0f, 10.0f), data.receivedGesture.screenCenterPoint, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureSignalReceptionAttachDetachMany(void)
+{
+ TestApplication application;
+
+ Actor first = Actor::New();
+ first.SetSize(100.0f, 100.0f);
+ first.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(first);
+
+ Actor second = Actor::New();
+ second.SetSize(100.0f, 100.0f);
+ second.SetX(100.0f);
+ second.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(second);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PinchGestureDetector detector = PinchGestureDetector::New();
+ detector.Attach(first);
+ detector.Attach(second);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Start pinch within second actor's area
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(120.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, second == data.pinchedActor, TEST_LOCATION);
+
+ // Pinch moves into first actor's area - second actor should receive the pinch
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Continuing, 10.0f, 50.0f, Vector2(10.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, second == data.pinchedActor, TEST_LOCATION);
+
+ // Detach the second actor during the pinch, we should not receive the next event
+ detector.Detach(second);
+
+ // Gesture ends within actor's area
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 10.0f, 50.0f, Vector2(120.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureSignalReceptionActorBecomesUntouchable(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PinchGestureDetector detector = PinchGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Start pinch in actor's area
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Pan continues within actor's area
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 5.0f, 50.0f, Vector2(10.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Actor become invisible - actor should not receive the next pinch
+ actor.SetVisible(false);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Gesture ends within actor's area
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 5.0f, 50.0f, Vector2(10.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureSignalReceptionMultipleDetectorsOnActor(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ Actor actor2 = Actor::New();
+ actor2.SetSize(100.0f, 100.0f);
+ actor2.SetAnchorPoint(AnchorPoint::BOTTOM_RIGHT);
+ Stage::GetCurrent().Add(actor2);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to one detector
+ SignalData firstData;
+ GestureReceivedFunctor firstFunctor(firstData);
+ PinchGestureDetector firstDetector = PinchGestureDetector::New();
+ firstDetector.Attach(actor);
+ firstDetector.DetectedSignal().Connect(&application, firstFunctor);
+
+ // Attach actor to another detector
+ SignalData secondData;
+ GestureReceivedFunctor secondFunctor(secondData);
+ PinchGestureDetector secondDetector = PinchGestureDetector::New();
+ secondDetector.Attach(actor);
+ secondDetector.DetectedSignal().Connect(&application, secondFunctor);
+
+ // Add second actor to second detector, when we remove the actor, this will make sure that this
+ // gesture detector is not removed from the GestureDetectorProcessor. In this scenario, the
+ // functor should still not be called (which is what we're also testing).
+ secondDetector.Attach(actor2);
+
+ // Pinch in actor's area - both detector's functors should be called
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, firstData.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, secondData.functorCalled, TEST_LOCATION);
+
+ // Pinch continues in actor's area - both detector's functors should be called
+ firstData.Reset();
+ secondData.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Continuing, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, firstData.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, secondData.functorCalled, TEST_LOCATION);
+
+ // Detach actor from firstDetector and emit pinch on actor, only secondDetector's functor should be called.
+ firstDetector.Detach(actor);
+ firstData.Reset();
+ secondData.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, firstData.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, secondData.functorCalled, TEST_LOCATION);
+
+ // New pinch on actor, only secondDetector has actor attached
+ firstData.Reset();
+ secondData.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, firstData.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, secondData.functorCalled, TEST_LOCATION);
+
+ // Detach actor from secondDetector
+ secondDetector.Detach(actor);
+ firstData.Reset();
+ secondData.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Continuing, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, firstData.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(false, secondData.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureSignalReceptionMultipleStarted(void)
+{
+ // Should handle two started events gracefully.
+
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PinchGestureDetector detector = PinchGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Start pan in actor's area
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Send another start in actor's area
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Add a child actor to overlap actor and send another start in actor's area
+ Actor child = Actor::New();
+ child.SetSize(100.0f, 100.0f);
+ child.SetAnchorPoint(AnchorPoint::CENTER);
+ child.SetParentOrigin(ParentOrigin::CENTER);
+ actor.Add(child);
+
+ TouchEventFunctor touchFunctor;
+ child.TouchedSignal().Connect(&application, touchFunctor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Send another start in actor's area
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Send another start in actor's area
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureSignalReceptionEnsureCorrectSignalling(void)
+{
+ TestApplication application;
+
+ Actor actor1 = Actor::New();
+ actor1.SetSize(100.0f, 100.0f);
+ actor1.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor1);
+ SignalData data1;
+ GestureReceivedFunctor functor1(data1);
+ PinchGestureDetector detector1 = PinchGestureDetector::New();
+ detector1.Attach(actor1);
+ detector1.DetectedSignal().Connect(&application, functor1);
+
+ Actor actor2 = Actor::New();
+ actor2.SetSize(100.0f, 100.0f);
+ actor2.SetAnchorPoint(AnchorPoint::BOTTOM_RIGHT);
+ actor2.SetParentOrigin(ParentOrigin::BOTTOM_RIGHT);
+ Stage::GetCurrent().Add(actor2);
+ SignalData data2;
+ GestureReceivedFunctor functor2(data2);
+ PinchGestureDetector detector2 = PinchGestureDetector::New();
+ detector2.Attach(actor2);
+ detector2.DetectedSignal().Connect(&application, functor2);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Start pan in actor1's area, only data1 should be set
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data1.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(false, data2.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureEmitIncorrectStateClear(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ PinchGestureDetector detector = PinchGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Try a Clear state
+ try
+ {
+ application.ProcessEvent(GeneratePinch(Gesture::Clear, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ tet_result(TET_FAIL);
+ }
+ catch ( Dali::DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "false", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliPinchGestureEmitIncorrectStatePossible(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ PinchGestureDetector detector = PinchGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Try a Possible state
+ try
+ {
+ application.ProcessEvent(GeneratePinch(Gesture::Possible, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ tet_result(TET_FAIL);
+ }
+ catch ( Dali::DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "false", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliPinchGestureActorUnstaged(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // State to remove actor in.
+ Gesture::State stateToUnstage( Gesture::Started );
+
+ // Attach actor to detector
+ SignalData data;
+ UnstageActorFunctor functor( data, stateToUnstage );
+ PinchGestureDetector detector = PinchGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Emit signals
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Re-add actor to stage
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Change state to Gesture::Continuing to remove
+ stateToUnstage = Gesture::Continuing;
+
+ // Emit signals
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Continuing, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Re-add actor to stage
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Change state to Gesture::Continuing to remove
+ stateToUnstage = Gesture::Finished;
+
+ // Emit signals
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Continuing, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ tet_result( TET_PASS ); // If we get here then we have handled actor stage removal gracefully.
+ END_TEST;
+}
+
+int UtcDaliPinchGestureActorStagedAndDestroyed(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Create and add a second actor so that GestureDetector destruction does not come into play.
+ Actor dummyActor( Actor::New() );
+ dummyActor.SetSize( 100.0f, 100.0f );
+ dummyActor.SetPosition( 100.0f, 100.0f );
+ dummyActor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(dummyActor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // State to remove actor in.
+ Gesture::State stateToUnstage( Gesture::Started );
+
+ // Attach actor to detector
+ SignalData data;
+ UnstageActorFunctor functor( data, stateToUnstage );
+ PinchGestureDetector detector = PinchGestureDetector::New();
+ detector.Attach(actor);
+ detector.Attach(dummyActor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Here we are testing a Started actor which is removed in the Started callback, but then added back
+ // before we get a continuing state. As we were removed from the stage, even if we're at the same
+ // position, we should still not be signalled.
+
+ // Emit signals
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Re add to the stage, we should not be signalled
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Continue signal emission
+ application.ProcessEvent(GeneratePinch(Gesture::Continuing, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+
+ // Here we delete an actor in started, we should not receive any subsequent signalling.
+
+ // Emit signals
+ application.ProcessEvent(GeneratePinch(Gesture::Started, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Delete actor as well
+ actor = NULL;
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Continue signal emission
+ application.ProcessEvent(GeneratePinch(Gesture::Continuing, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GeneratePinch(Gesture::Finished, 10.0f, 50.0f, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliPinchGestureSystemOverlay(void)
+{
+ TestApplication application;
+ Dali::Integration::Core& core = application.GetCore();
+ Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() );
+ systemOverlay.GetOverlayRenderTasks().CreateTask();
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ systemOverlay.Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ PinchGestureDetector detector = PinchGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ Vector2 screenCoords( 50.0f, 50.0f );
+ float scale ( 10.0f );
+ float speed ( 50.0f );
+
+ // Start pan within the actor's area
+ application.ProcessEvent( GeneratePinch( Gesture::Started, scale, speed, screenCoords ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <algorithm>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using std::max;
+using namespace Dali;
+
+
+static const float ROTATION_EPSILON = 0.0001f;
+
+void utc_dali_pixel_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_pixel_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+static void TestPixelEnumSize(const int size)
+{
+ DALI_TEST_CHECK( (static_cast<int>( Pixel::LAST_VALID_PIXEL_FORMAT ) - static_cast<int>( Pixel::FIRST_VALID_PIXEL_FORMAT ) + 1 ) == size &&
+ "The Pixel::Format enum may have had new formats added. Expand the test cases to include them.");
+}
+
+int UtcDaliPixelHasAlpha(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliPixelHasAlpha");
+
+ TestPixelEnumSize( 26 );
+
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::L8) == false);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::RGB565) == false);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::RGB888) == false);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::RGB8888) == false);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::BGR8888) == false);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::BGR565) == false);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::COMPRESSED_R11_EAC) == false);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::COMPRESSED_SIGNED_R11_EAC) == false);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::COMPRESSED_RG11_EAC) == false);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::COMPRESSED_SIGNED_RG11_EAC) == false);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::COMPRESSED_RGB8_ETC2) == false);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::COMPRESSED_SRGB8_ETC2) == false);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::COMPRESSED_RGB8_ETC1) == false);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::COMPRESSED_RGB_PVRTC_4BPPV1) == false);
+
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::A8) == true);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::LA88) == true);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::RGBA5551) == true);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::RGBA4444) == true);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::RGBA8888) == true);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::BGRA8888) == true);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::BGRA5551) == true);
+ DALI_TEST_CHECK( Pixel::HasAlpha(Pixel::BGRA4444) == true);
+ DALI_TEST_CHECK( Pixel::HasAlpha( Pixel::COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 ) == true );
+ DALI_TEST_CHECK( Pixel::HasAlpha( Pixel::COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 ) == true );
+ DALI_TEST_CHECK( Pixel::HasAlpha( Pixel::COMPRESSED_RGBA8_ETC2_EAC ) == true );
+ DALI_TEST_CHECK( Pixel::HasAlpha( Pixel::COMPRESSED_SRGB8_ALPHA8_ETC2_EAC) == true );
+ END_TEST;
+}
+
+int UtcDaliPixelGetBytesPerPixel(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliPixelGetBytesPerPixel");
+
+ DALI_TEST_CHECK( Pixel::GetBytesPerPixel(Pixel::L8) == 1);
+ DALI_TEST_CHECK( Pixel::GetBytesPerPixel(Pixel::A8) == 1);
+
+ DALI_TEST_CHECK( Pixel::GetBytesPerPixel(Pixel::LA88) == 2);
+ DALI_TEST_CHECK( Pixel::GetBytesPerPixel(Pixel::RGB565) == 2);
+ DALI_TEST_CHECK( Pixel::GetBytesPerPixel(Pixel::RGBA5551) == 2);
+ DALI_TEST_CHECK( Pixel::GetBytesPerPixel(Pixel::RGBA4444) == 2);
+ DALI_TEST_CHECK( Pixel::GetBytesPerPixel(Pixel::BGR565) == 2);
+ DALI_TEST_CHECK( Pixel::GetBytesPerPixel(Pixel::BGRA5551) == 2);
+ DALI_TEST_CHECK( Pixel::GetBytesPerPixel(Pixel::BGRA4444) == 2);
+
+ DALI_TEST_CHECK( Pixel::GetBytesPerPixel(Pixel::RGB888) == 3);
+
+ DALI_TEST_CHECK( Pixel::GetBytesPerPixel(Pixel::RGB8888) == 4);
+ DALI_TEST_CHECK( Pixel::GetBytesPerPixel(Pixel::BGR8888) == 4);
+ DALI_TEST_CHECK( Pixel::GetBytesPerPixel(Pixel::RGBA8888) == 4);
+ DALI_TEST_CHECK( Pixel::GetBytesPerPixel(Pixel::BGRA8888) == 4);
+
+ DALI_TEST_CHECK( Pixel::GetBytesPerPixel(Pixel::L8) == 1);
+ END_TEST;
+}
+
+int UtcDaliPixelGetAlphaOffsetAndMask(void)
+{
+ TestApplication application;
+
+ tet_infoline("UtcDaliPixelGetAlphaOffsetAndMask");
+
+ int byteOffset = 0;
+ int bitMask = 0;
+
+ // Be sure that the number of cases tested below is correct:
+ TestPixelEnumSize( 26 );
+
+ Pixel::GetAlphaOffsetAndMask(Pixel::L8, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ Pixel::GetAlphaOffsetAndMask(Pixel::A8, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0xff);
+ Pixel::GetAlphaOffsetAndMask(Pixel::RGB888, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ Pixel::GetAlphaOffsetAndMask(Pixel::RGB565, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ Pixel::GetAlphaOffsetAndMask(Pixel::RGB8888, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ Pixel::GetAlphaOffsetAndMask(Pixel::BGR8888, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ Pixel::GetAlphaOffsetAndMask(Pixel::LA88, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 1 && bitMask == 0xff);
+ Pixel::GetAlphaOffsetAndMask(Pixel::RGBA4444, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 1 && bitMask == 0x0f);
+ Pixel::GetAlphaOffsetAndMask(Pixel::RGBA5551, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 1 && bitMask == 0x01);
+ Pixel::GetAlphaOffsetAndMask(Pixel::RGBA8888, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 3 && bitMask == 0xff);
+ Pixel::GetAlphaOffsetAndMask(Pixel::BGRA8888, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 3 && bitMask == 0xff);
+ Pixel::GetAlphaOffsetAndMask(Pixel::BGR565, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ Pixel::GetAlphaOffsetAndMask(Pixel::BGRA4444, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 1 && bitMask == 0x0f);
+ Pixel::GetAlphaOffsetAndMask(Pixel::BGRA5551, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 1 && bitMask == 0x01);
+
+ // Compressed formats with no meaningful result:
+ Pixel::GetAlphaOffsetAndMask(Pixel::COMPRESSED_R11_EAC, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ Pixel::GetAlphaOffsetAndMask(Pixel::COMPRESSED_SIGNED_R11_EAC, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ Pixel::GetAlphaOffsetAndMask(Pixel::COMPRESSED_RG11_EAC, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ Pixel::GetAlphaOffsetAndMask(Pixel::COMPRESSED_SIGNED_RG11_EAC, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ Pixel::GetAlphaOffsetAndMask(Pixel::COMPRESSED_RGB8_ETC2, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ Pixel::GetAlphaOffsetAndMask(Pixel::COMPRESSED_SRGB8_ETC2, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ Pixel::GetAlphaOffsetAndMask(Pixel::COMPRESSED_RGB8_ETC1, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ Pixel::GetAlphaOffsetAndMask(Pixel::COMPRESSED_RGB_PVRTC_4BPPV1, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ Pixel::GetAlphaOffsetAndMask(Pixel::COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ Pixel::GetAlphaOffsetAndMask(Pixel::COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ Pixel::GetAlphaOffsetAndMask(Pixel::COMPRESSED_RGBA8_ETC2_EAC, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ Pixel::GetAlphaOffsetAndMask(Pixel::COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, byteOffset, bitMask);
+ DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <boost/bind.hpp>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_property_notification_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_property_notification_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace {
+
+static bool gCallBackCalled;
+
+static void TestCallback(PropertyNotification& source)
+{
+ gCallBackCalled = true;
+}
+
+const int RENDER_FRAME_INTERVAL(16); ///< Duration of each frame in ms. (at approx 60FPS)
+const int DEFAULT_WAIT_PERIOD(100); ///< Default waiting period for check.
+
+
+class TestClass : public ConnectionTracker
+{
+public:
+
+ TestClass()
+ {
+ }
+
+ ~TestClass()
+ {
+ }
+
+ void Initialize()
+ {
+ mActor = Actor::New();
+ Stage::GetCurrent().Add( mActor );
+ mNotification = mActor.AddPropertyNotification( Actor::POSITION_X, GreaterThanCondition(100.0f) );
+ mNotification.NotifySignal().Connect( this, &TestClass::OnPropertyNotify );
+ }
+
+ void RemovePropertyNotification()
+ {
+ mActor.RemovePropertyNotification( mNotification );
+ }
+
+ void RemovePropertyNotifications()
+ {
+ mActor.RemovePropertyNotifications();
+ }
+
+ void Terminate()
+ {
+ Stage::GetCurrent().Remove( mActor );
+ mActor.Reset();
+ mNotification.Reset();
+ }
+
+ void OnPropertyNotify( PropertyNotification& source )
+ {
+ tet_infoline(" OnPropertyNotify");
+ gCallBackCalled = true;
+ }
+
+ Actor mActor;
+ PropertyNotification mNotification;
+};
+
+
+/*
+ * Simulate time passed by.
+ *
+ * @note this will always process at least 1 frame (1/60 sec)
+ *
+ * @param application Test application instance
+ * @param duration Time to pass in milliseconds.
+ * @return The actual time passed in milliseconds
+ */
+int Wait(TestApplication& application, int duration = 0)
+{
+ int time = 0;
+
+ for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
+ {
+ application.SendNotification();
+ application.Render(RENDER_FRAME_INTERVAL);
+ time += RENDER_FRAME_INTERVAL;
+ }
+
+ return time;
+}
+
+} // unnamed namespace
+
+
+// Positive test case for a method
+int UtcDaliPropertyNotificationDownCast(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyNotificationDownCast");
+
+ Actor actor = Actor::New();
+ PropertyNotification notification = actor.AddPropertyNotification(Actor::POSITION_X, GreaterThanCondition(100.0f));
+ BaseHandle handle = notification;
+ PropertyNotification notificationHandle;
+
+ DALI_TEST_CHECK(notification);
+ DALI_TEST_CHECK(handle);
+ DALI_TEST_CHECK(!notificationHandle);
+
+ notificationHandle = PropertyNotification::DownCast( handle );
+ DALI_TEST_CHECK(notificationHandle);
+ END_TEST;
+}
+
+
+// Negative test case for a method
+int UtcDaliPropertyNotificationDownCastNegative(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyNotificationDownCastNegative");
+
+ // Create something derived from BaseHandle other than a PropertyNotification.
+ Actor somethingElse = Actor::New();
+
+ Actor actor = Actor::New();
+ actor.AddPropertyNotification(Actor::POSITION_X, GreaterThanCondition(100.0f));
+ BaseHandle handle = somethingElse;
+ PropertyNotification notificationHandle;
+
+ notificationHandle = PropertyNotification::DownCast( handle );
+ DALI_TEST_CHECK(!notificationHandle);
+ END_TEST;
+}
+
+int UtcDaliAddPropertyNotification(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ tet_infoline(" UtcDaliAddPropertyNotification");
+
+ Actor actor = Actor::New();
+
+ PropertyNotification notification = actor.AddPropertyNotification(Actor::POSITION_X, GreaterThanCondition(100.0f));
+ DALI_TEST_CHECK( notification );
+ END_TEST;
+}
+
+int UtcDaliAddPropertyNotificationCallback(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ TestClass* object = new TestClass;
+
+ object->Initialize();
+ application.Render(RENDER_FRAME_INTERVAL);
+ application.SendNotification();
+
+ gCallBackCalled = false;
+
+ tet_infoline(" UtcDaliAddPropertyNotificationCallback - Forcing notification condition true, should receive a notification");
+ object->mActor.SetPosition(Vector3(200.0f, 0.0f, 0.0f));
+ application.Render(RENDER_FRAME_INTERVAL);
+ application.SendNotification();
+ application.Render(RENDER_FRAME_INTERVAL);
+ application.SendNotification();
+ DALI_TEST_CHECK( gCallBackCalled );
+ gCallBackCalled = false;
+
+ tet_infoline(" UtcDaliAddPropertyNotificationCallback - Forcing notification condition false, should not receive a notification");
+ object->mActor.SetPosition(Vector3(0.0f, 0.0f, 0.0f));
+ application.Render(RENDER_FRAME_INTERVAL);
+ application.SendNotification();
+ application.Render(RENDER_FRAME_INTERVAL);
+ application.SendNotification();
+ DALI_TEST_CHECK( !gCallBackCalled );
+ gCallBackCalled = false;
+
+ tet_infoline(" UtcDaliAddPropertyNotificationCallback - Deleting notification and it's owning object, should not receive a notification");
+ object->mActor.SetPosition(Vector3(200.0f, 0.0f, 0.0f));
+ application.Render(RENDER_FRAME_INTERVAL);
+ application.SendNotification();
+ object->Terminate();
+ application.Render(RENDER_FRAME_INTERVAL);
+ application.SendNotification();
+ DALI_TEST_CHECK( !gCallBackCalled );
+
+ tet_infoline(" UtcDaliAddPropertyNotificationCallback - Removing notification and it's owning object, should not receive a notification");
+ object->Initialize();
+ application.Render(RENDER_FRAME_INTERVAL);
+ application.SendNotification();
+ gCallBackCalled = false;
+
+ object->RemovePropertyNotification();
+
+ object->mActor.SetPosition(Vector3(200.0f, 0.0f, 0.0f));
+ application.Render(RENDER_FRAME_INTERVAL);
+ application.SendNotification();
+ application.Render(RENDER_FRAME_INTERVAL);
+ application.SendNotification();
+ DALI_TEST_CHECK( !gCallBackCalled );
+
+ tet_infoline(" UtcDaliAddPropertyNotificationCallback - Removing all notifications and it's owning object, should not receive a notification");
+ object->Initialize();
+ application.Render(RENDER_FRAME_INTERVAL);
+ application.SendNotification();
+ gCallBackCalled = false;
+
+ object->RemovePropertyNotifications();
+
+ object->mActor.SetPosition(Vector3(200.0f, 0.0f, 0.0f));
+ application.Render(RENDER_FRAME_INTERVAL);
+ application.SendNotification();
+ application.Render(RENDER_FRAME_INTERVAL);
+ application.SendNotification();
+ DALI_TEST_CHECK( !gCallBackCalled );
+
+
+ delete object;
+ END_TEST;
+}
+
+int UtcDaliAddPropertyNotificationTypeProperty(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+
+ // Currently, Type registry properties cannot be animated
+ try
+ {
+ actor.AddPropertyNotification( PROPERTY_REGISTRATION_START_INDEX, GreaterThanCondition( 100.0f ) );
+ }
+ catch ( DaliException& e )
+ {
+ DALI_TEST_ASSERT_CONDITION_STARTS_WITH_SUBSTRING( e, "false && \"Property notification added to non animatable property", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliPropertyNotificationGetCondition(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyNotificationGetCondition");
+
+ Actor actor = Actor::New();
+
+ PropertyCondition condition = GreaterThanCondition(100.0f);
+ PropertyNotification notification = actor.AddPropertyNotification(Actor::POSITION_X, condition);
+ DALI_TEST_CHECK( condition == notification.GetCondition() );
+ END_TEST;
+}
+
+class PropertyNotificationConstWrapper
+{
+public:
+
+ PropertyNotificationConstWrapper(PropertyNotification propertyNotification)
+ :mPropertyNotification(propertyNotification)
+ {
+
+ }
+
+ /**
+ * Returns const reference to property notification.
+ * @return const reference.
+ */
+ const PropertyCondition& GetCondition() const
+ {
+ return mPropertyNotification.GetCondition();
+ }
+
+ PropertyNotification mPropertyNotification;
+};
+
+int UtcDaliPropertyNotificationGetConditionConst(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyNotificationGetConditionConst");
+
+ Actor actor = Actor::New();
+
+ PropertyCondition condition = GreaterThanCondition(100.0f);
+ PropertyNotification notification = actor.AddPropertyNotification(Actor::POSITION_X, condition);
+ PropertyNotificationConstWrapper notificationConst(notification);
+ const PropertyCondition& conditionReference1 = notificationConst.GetCondition();
+ const PropertyCondition& conditionReference2 = notificationConst.GetCondition();
+
+ DALI_TEST_CHECK( (&conditionReference1) == (&conditionReference2) );
+ DALI_TEST_CHECK( conditionReference1 == condition );
+ END_TEST;
+}
+
+int UtcDaliPropertyNotificationGetTarget(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyNotificationGetTarget");
+
+ Actor actor = Actor::New();
+ Actor actor2 = Actor::New();
+
+ PropertyNotification notification = actor.AddPropertyNotification(Actor::POSITION_X,
+ GreaterThanCondition(100.0f));
+ Actor targetActor = Actor::DownCast( notification.GetTarget() );
+
+ DALI_TEST_CHECK( targetActor == actor );
+ END_TEST;
+}
+
+int UtcDaliPropertyNotificationGetProperty(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyNotificationGetProperty");
+
+ Actor actor = Actor::New();
+
+ PropertyNotification notification = actor.AddPropertyNotification(Actor::POSITION_X,
+ GreaterThanCondition(100.0f));
+ Property::Index targetProperty = notification.GetTargetProperty();
+
+ DALI_TEST_EQUALS( targetProperty, Actor::POSITION_X, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliPropertyNotificationGetNotifyMode(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyNotificationGetNotifyMode");
+
+ Actor actor = Actor::New();
+
+ PropertyNotification notification = actor.AddPropertyNotification(Actor::POSITION_X,
+ GreaterThanCondition(100.0f));
+ notification.SetNotifyMode(PropertyNotification::NotifyOnChanged);
+ PropertyNotification::NotifyMode notifyMode = notification.GetNotifyMode();
+
+ DALI_TEST_EQUALS( notifyMode, PropertyNotification::NotifyOnChanged, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliPropertyNotificationGreaterThan(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyNotificationGreaterThan");
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ PropertyNotification notification = actor.AddPropertyNotification( Actor::POSITION_X, GreaterThanCondition(100.0f) );
+ notification.NotifySignal().Connect( &TestCallback );
+
+ actor.SetPosition(Vector3(0.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+
+ // Move right to satisfy condition
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3(200.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+
+ // Move left to un-satisfy condition
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3(0.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( !gCallBackCalled );
+
+ // Move right to satisfy condition again.
+ gCallBackCalled = false;
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ actor.SetPosition(Vector3(200.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+ END_TEST;
+}
+
+int UtcDaliPropertyNotificationLessThan(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyNotificationLessThan");
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ PropertyNotification notification = actor.AddPropertyNotification( Actor::POSITION_X, LessThanCondition(100.0f ) );
+ notification.NotifySignal().Connect( &TestCallback );
+
+ actor.SetPosition(Vector3(200.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+
+ // Move left to satisfy condition
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3(0.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+
+ // Move right to un-satisfy condition
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3(200.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( !gCallBackCalled );
+
+ // Move left to satisfy condition again.
+ gCallBackCalled = false;
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ actor.SetPosition(Vector3(0.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+ END_TEST;
+}
+
+int UtcDaliPropertyNotificationInside(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyNotificationInside");
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ PropertyNotification notification = actor.AddPropertyNotification( Actor::POSITION_X, InsideCondition(100.0f, 200.0f) );
+ notification.NotifySignal().Connect( &TestCallback );
+
+ actor.SetPosition(Vector3(0.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+
+ // Move inside to satisfy condition
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3(150.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+
+ // Move outside (right) to un-satisfy condition
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3(300.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( !gCallBackCalled );
+
+ // Move inside to satisfy condition again.
+ gCallBackCalled = false;
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ actor.SetPosition(Vector3(150.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+ END_TEST;
+}
+
+int UtcDaliPropertyNotificationOutside(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyNotificationOutside");
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ PropertyNotification notification = actor.AddPropertyNotification( Actor::POSITION_X, OutsideCondition(100.0f, 200.0f) );
+ notification.NotifySignal().Connect( &TestCallback );
+
+ actor.SetPosition(Vector3(150.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+
+ // Move outside (left) to satisfy condition
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3(0.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+
+ // Move inside to un-satisfy condition
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3(150.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( !gCallBackCalled );
+
+ // Move outside (right) to satisfy condition again.
+ gCallBackCalled = false;
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ actor.SetPosition(Vector3(300.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+ END_TEST;
+}
+
+int UtcDaliPropertyNotificationVectorComponentGreaterThan(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyNotificationGreaterThan");
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ PropertyNotification notification = actor.AddPropertyNotification( Actor::POSITION, 0, GreaterThanCondition(100.0f) );
+ notification.NotifySignal().Connect( &TestCallback );
+ notification = actor.AddPropertyNotification( Actor::POSITION, 1, GreaterThanCondition(100.0f) );
+ notification.NotifySignal().Connect( &TestCallback );
+ notification = actor.AddPropertyNotification( Actor::POSITION, 2, GreaterThanCondition(100.0f) );
+ notification.NotifySignal().Connect( &TestCallback );
+ notification = actor.AddPropertyNotification( Actor::COLOR, 3, GreaterThanCondition(0.5f) );
+ notification.NotifySignal().Connect( &TestCallback );
+
+ actor.SetPosition(Vector3(0.0f, 0.0f, 0.0f));
+ actor.SetColor(Vector4(0.0f, 0.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+
+ // Move right to satisfy XAxis condition
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3(200.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+
+ // Move down to satisfy YAxis condition
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3(200.0f, 200.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+
+ // Move forward to satisfy ZAxis
+ gCallBackCalled = false;
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ actor.SetPosition(Vector3(200.0f, 200.0f, 200.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+
+ // Change alpha Colour to satisfy w/alpha component condition
+ gCallBackCalled = false;
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ actor.SetColor(Vector4(0.0f, 0.0f, 0.0f, 1.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+ END_TEST;
+}
+
+int UtcDaliPropertyNotificationVectorComponentLessThan(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyNotificationLessThan");
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ PropertyNotification notification = actor.AddPropertyNotification( Actor::POSITION, 0, LessThanCondition(-100.0f) );
+ notification.NotifySignal().Connect( &TestCallback );
+ notification = actor.AddPropertyNotification( Actor::POSITION, 1, LessThanCondition(-100.0f) );
+ notification.NotifySignal().Connect( &TestCallback );
+ notification = actor.AddPropertyNotification( Actor::POSITION, 2, LessThanCondition(-100.0f) );
+ notification.NotifySignal().Connect( &TestCallback );
+ notification = actor.AddPropertyNotification( Actor::COLOR, 3, LessThanCondition(0.5f) );
+ notification.NotifySignal().Connect( &TestCallback );
+
+ actor.SetPosition(Vector3(0.0f, 0.0f, 0.0f));
+ actor.SetColor(Vector4(0.0f, 0.0f, 0.0f, 1.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+
+ // Move left to satisfy XAxis condition
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3(-200.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+
+ // Move up to satisfy YAxis condition
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3(-200.0f, -200.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+
+ // Move back to satisfy ZAxis
+ gCallBackCalled = false;
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ actor.SetPosition(Vector3(-200.0f, -200.0f, -200.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+
+ // Change alpha Colour to satisfy w/alpha component condition
+ gCallBackCalled = false;
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ actor.SetColor(Vector4(0.0f, 0.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+ END_TEST;
+}
+
+int UtcDaliPropertyNotificationVectorComponentInside(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyNotificationInside");
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ PropertyNotification notification = actor.AddPropertyNotification( Actor::POSITION, 0, InsideCondition(-100.0f, 100.0f) );
+ notification.NotifySignal().Connect( &TestCallback );
+ notification = actor.AddPropertyNotification( Actor::POSITION, 1, InsideCondition(-100.0f, 100.0f) );
+ notification.NotifySignal().Connect( &TestCallback );
+ notification = actor.AddPropertyNotification( Actor::POSITION, 2, InsideCondition(-100.0f, 100.0f) );
+ notification.NotifySignal().Connect( &TestCallback );
+ notification = actor.AddPropertyNotification( Actor::COLOR, 3, InsideCondition(0.25f, 0.75f) );
+ notification.NotifySignal().Connect( &TestCallback );
+
+ // set outside all conditions
+ actor.SetPosition(Vector3(200.0f, 200.0f, 200.0f));
+ actor.SetColor(Vector4(0.0f, 0.0f, 0.0f, 1.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+
+ // Move x to inside condition
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3(0.0f, 200.0f, 200.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+
+ // Move y to inside condition
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3(0.0f, 0.0f, 200.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+
+ // Move z to inside condition
+ gCallBackCalled = false;
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ actor.SetPosition(Vector3(0.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+
+ // change alpha to inside condition
+ gCallBackCalled = false;
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ actor.SetColor(Vector4(0.0f, 0.0f, 0.0f, 0.5f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+ END_TEST;
+}
+
+int UtcDaliPropertyNotificationVectorComponentOutside(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyNotificationOutside");
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ PropertyNotification notification = actor.AddPropertyNotification( Actor::POSITION, 0, OutsideCondition(-100.0f, 100.0f) );
+ notification.NotifySignal().Connect( &TestCallback );
+ notification = actor.AddPropertyNotification( Actor::POSITION, 1, OutsideCondition(-100.0f, 100.0f) );
+ notification.NotifySignal().Connect( &TestCallback );
+ notification = actor.AddPropertyNotification( Actor::POSITION, 2, OutsideCondition(-100.0f, 100.0f) );
+ notification.NotifySignal().Connect( &TestCallback );
+ notification = actor.AddPropertyNotification( Actor::COLOR, 3, OutsideCondition(0.25f, 0.75f) );
+ notification.NotifySignal().Connect( &TestCallback );
+
+ // set inside all conditions
+ actor.SetPosition(Vector3(0.0f, 0.0f, 0.0f));
+ actor.SetColor(Vector4(0.0f, 0.0f, 0.0f, 0.5f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+
+ // Move x to outside condition
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3(200.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+
+ // Move y to outside condition
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3(200.0f, 200.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+
+ // Move z to outside condition
+ gCallBackCalled = false;
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ actor.SetPosition(Vector3(200.0f, 200.0f, 200.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+
+ // change alpha to outside condition
+ gCallBackCalled = false;
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ actor.SetColor(Vector4(0.0f, 0.0f, 0.0f, 1.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+ END_TEST;
+}
+
+int UtcDaliPropertyConditionGetArguments(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyConditionGetArguments");
+
+ PropertyCondition condition = GreaterThanCondition( 50.0f );
+ PropertyCondition::ArgumentContainer arguments = condition.GetArguments();
+
+ DALI_TEST_EQUALS( arguments.size(), 1u, TEST_LOCATION );
+ Property::Value value = arguments[0];
+ DALI_TEST_EQUALS( value.Get<float>(), 50.0f, TEST_LOCATION );
+
+ condition = InsideCondition( 125.0f, 250.0f );
+ arguments = condition.GetArguments();
+
+ DALI_TEST_EQUALS( arguments.size(), 2u, TEST_LOCATION );
+ Property::Value value1 = arguments[0];
+ Property::Value value2 = arguments[1];
+ DALI_TEST_EQUALS( value1.Get<float>(), 125.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( value2.Get<float>(), 250.0f, TEST_LOCATION );
+ END_TEST;
+}
+
+namespace
+{
+
+class PropertyConditionConstWrapper
+{
+public:
+
+ PropertyConditionConstWrapper(PropertyCondition propertyCondition)
+ :mPropertyCondition(propertyCondition)
+ {
+
+ }
+
+ /**
+ * Returns const reference to property arguments.
+ * @return const reference.
+ */
+ const PropertyCondition::ArgumentContainer& GetArguments() const
+ {
+ return mPropertyCondition.GetArguments();
+ }
+
+ PropertyCondition mPropertyCondition;
+};
+} // anon namespace
+
+int UtcDaliPropertyConditionGetArgumentsConst(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyConditionGetArgumentsConst");
+
+ PropertyCondition condition = GreaterThanCondition( 50.0f );
+ PropertyConditionConstWrapper conditionConst(condition);
+ const PropertyCondition::ArgumentContainer& argumentsRef1 = conditionConst.GetArguments();
+ const PropertyCondition::ArgumentContainer& argumentsRef2 = conditionConst.GetArguments();
+
+ DALI_TEST_CHECK( (&argumentsRef1) == (&argumentsRef2) );
+ DALI_TEST_EQUALS( argumentsRef1.size(), 1u, TEST_LOCATION );
+ Property::Value value = argumentsRef1[0];
+ DALI_TEST_EQUALS( value.Get<float>(), 50.0f, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliPropertyNotificationStep(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyNotificationStep");
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ const float step = 100.0f;
+ // float
+ PropertyNotification notification = actor.AddPropertyNotification( Actor::POSITION, 0, StepCondition(step, 50.0f) );
+ notification.NotifySignal().Connect( &TestCallback );
+
+ // set initial position
+ actor.SetPosition(Vector3(0.0f, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+
+ // test both directions
+ for( int i = 1 ; i < 10 ; ++i )
+ {
+ // Move x to negative position
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3((i * step), 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+ }
+
+ for( int i = 1 ; i < 10 ; ++i )
+ {
+ // Move x to negative position
+ gCallBackCalled = false;
+ actor.SetPosition(Vector3(-(i * step), 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+ }
+ END_TEST;
+}
+
+int UtcDaliPropertyNotificationVariableStep(void)
+{
+ TestApplication application;
+ tet_infoline(" UtcDaliPropertyNotificationStep");
+
+ Actor actor = Actor::New();
+ Stage::GetCurrent().Add(actor);
+
+ std::vector<float> values;
+
+ const float averageStep = 100.0f;
+
+ for( int i = 1 ; i < 10 ; i++ )
+ {
+ values.push_back(i * averageStep + (i % 2 == 0 ? -(averageStep * 0.2f) : (averageStep * 0.2f)));
+ }
+ // float
+ PropertyNotification notification = actor.AddPropertyNotification( Actor::POSITION, 0, VariableStepCondition(values) );
+ notification.NotifySignal().Connect( &TestCallback );
+
+ // set initial position lower than first position in list
+ actor.SetPosition(Vector3(values[0] - averageStep, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+
+ for( unsigned int i = 0 ; i < values.size() - 1 ; ++i )
+ {
+ gCallBackCalled = false;
+ // set position half way between the current values
+ float position = values[i] + (0.5f * (values[i + 1] - values[i]));
+ actor.SetPosition(Vector3(position, 0.0f, 0.0f));
+ Wait(application, DEFAULT_WAIT_PERIOD);
+ DALI_TEST_CHECK( gCallBackCalled );
+ }
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <sstream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+
+void utc_dali_quaternion_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_quaternion_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+int UtcDaliQuaternionCtor01(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion r;
+ DALI_TEST_EQUALS(r.AsVector().w, 1.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(r.AsVector().x, 0.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(r.AsVector().y, 0.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(r.AsVector().z, 0.0f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionCtor02(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ Quaternion r(M_PI/2.0f, Vector4(1.0f, 2.0f, 3.0f, M_PI/3.0f));
+
+ // This will be normalised:
+ DALI_TEST_EQUALS(r.AsVector().w, 0.707f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(r.AsVector().x, 0.189f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(r.AsVector().y, 0.378f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(r.AsVector().z, 0.567f, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliQuaternionCtor03(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ // Test from euler angles
+ Quaternion e1(Radian(Degree(45)), 0.0f, 0.0f);
+ Vector4 r1(0.383f, 0.0f, 0.0f, 0.924f);
+
+ Quaternion e2(0.0f, Radian(Degree(75)), 0.0f);
+ Vector4 r2(0.0f, 0.609f, 0.0f, 0.793f);
+
+ Quaternion e3(0.0f, 0.0f, Radian(Degree(135)));
+ Vector4 r3(0.0f, 0.0f, 0.924f, 0.383f);
+
+ Quaternion e4(Radian(Degree(71)), Radian(Degree(36)), Radian(Degree(27)));
+ Vector4 r4(0.478f, 0.374f, 0.006f, 0.795f);
+
+ Quaternion e5(Radian(Degree(-31)), Radian(Degree(-91)), Radian(Degree(-173)));
+ Vector4 r5(-0.697f, 0.145f, -0.686f, -0.149f);
+
+ DALI_TEST_EQUALS(e1.AsVector(), r1, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(e2.AsVector(), r2, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(e3.AsVector(), r3, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(e4.AsVector(), r4, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(e5.AsVector(), r5, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliQuaternionFromAxisAngle(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ Quaternion q = Quaternion::FromAxisAngle(Vector4(1.0f, 2.0f, 3.0f, M_PI/3.0f), M_PI/2.0f);
+
+ Quaternion r(0.707f, 0.189f, 0.378f, 0.567f);
+
+ DALI_TEST_EQUALS(q, r, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionToAxisAngle01(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q(0.932f, 1.1f, 3.4f, 2.7f);
+ float angle;
+ Vector3 axis;
+ bool converted = q.ToAxisAngle(axis, angle);
+ DALI_TEST_EQUALS(converted, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(angle, 0.74f, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.x, 3.03f, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.y, 9.38f, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.z, 7.45f, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionToAxisAngle02(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q(0.932f, 1.1f, 3.4f, 2.7f);
+ float angle;
+ Vector4 axis;
+ bool converted = q.ToAxisAngle(axis, angle);
+ DALI_TEST_EQUALS(converted, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(angle, 0.74f, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.x, 3.03f, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.y, 9.38f, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.z, 7.45f, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.w, 0.0f, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliQuaternionToAxisAngle03(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q(1, 2, 3, 4);
+ float angle;
+ Vector3 axis;
+ bool converted = q.ToAxisAngle(axis, angle);
+ DALI_TEST_EQUALS(converted, false, TEST_LOCATION);
+ DALI_TEST_EQUALS(angle, 0.0f, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.x, 0.0f, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.y, 0.0f, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.z, 0.0f, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionToAxisAngle04(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q(1, 2, 3, 4);
+ float angle;
+ Vector4 axis;
+ bool converted = q.ToAxisAngle(axis, angle);
+ DALI_TEST_EQUALS(converted, false, TEST_LOCATION);
+ DALI_TEST_EQUALS(angle, 0.0f, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.x, 0.0f, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.y, 0.0f, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.z, 0.0f, 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.w, 0.0f, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+
+int UtcDaliQuaternionEulerAngles(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ Quaternion q1(0.924f, 0.383f, 0.0f, 0.0f);
+ Vector4 r1(Radian(Degree(45)), 0.0f, 0.0f, 0.0f);
+
+ Quaternion q2(0.793f, 0.0f, 0.609f, 0.0f);
+ Vector4 r2(0.0f, Radian(Degree(75)), 0.0f, 0.0f);
+
+ Quaternion q3(0.383f, 0.0f, 0.0f, 0.924f);
+ Vector4 r3(0.0f, 0.0f, Radian(Degree(135)), 0.0f);
+
+ Quaternion q4(0.795f, 0.478f, 0.374f, 0.006f);
+ Vector4 r4(Radian(Degree(71)), Radian(Degree(36)), Radian(Degree(27)), 0.0f);
+
+ Quaternion q5( -0.149f, -0.697f, 0.145f, -0.686f);
+ Vector4 r5(Radian(Degree(148.0)), Radian(Degree(-88.2)), Radian(Degree(8.0)), 0.0f);
+
+ DALI_TEST_EQUALS(q1.EulerAngles(), r1, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(q2.EulerAngles(), r2, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(q3.EulerAngles(), r3, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(q4.EulerAngles(), r4, 0.01, TEST_LOCATION);
+ DALI_TEST_EQUALS(q5.EulerAngles(), r5, 0.01, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliQuaternionToMatrix01(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ Quaternion q(0.69813, Vector4(1.0f, 0.0f, 0.0f, 0.0f)); // 40 degree rotation around X axis
+
+ // Result calculated using a different maths library (with appropriate row/col ordering)
+
+ float els[] = { 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.766f, 0.643f, 0.0f,
+ 0.0f, -0.643f, 0.766f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f };
+ Matrix mRes(els);
+ Matrix m(q);
+
+ DALI_TEST_EQUALS(m, mRes, 0.01, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionToMatrix02(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ // rotation around arbitrary axis
+ Quaternion q2(-1.23918f, Vector4(7.0f, -13.0f, 11.0f, 0.0f));
+
+ float els[] = { 0.423f, -0.746f, -0.514f, 0.00f,
+ 0.384f, 0.662f, -0.644f, 0.00f,
+ 0.821f, 0.075f, 0.566f, 0.00f,
+ 0.000f, 0.000f, 0.000f, 1.00f };
+ Matrix mRes2(els);
+
+ Matrix m2(q2);
+
+ DALI_TEST_EQUALS(m2, mRes2, 0.01, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliQuaternionFromMatrix01(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ // IDENTITY rotation
+ Quaternion q;
+
+ Matrix m(q); // Convert to matrix
+
+ Quaternion q2(m); // and back to a quaternion
+
+ DALI_TEST_EQUALS(q, q2, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(m, Matrix::IDENTITY, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionFromMatrix02(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ // Create an arbitrary forward vector
+ for( float x=-1.0f; x<=1.0f; x+=0.1f )
+ {
+ for( float y=-1.0f; y<1.0f; y+=0.1f )
+ {
+ for( float z=-1.0f; z<1.0f; z+=0.1f )
+ {
+ Vector3 vForward(x, y, z);
+ vForward.Normalize();
+
+ // Construct an up vector from a sideways move
+ Vector3 vSide;
+ Vector3 vUp = vForward.Cross(Vector3(vForward.x+1.0f, vForward.y, vForward.z));
+ if(vUp.Length() > 0.01 )
+ {
+ vUp.Normalize();
+ vSide = vUp.Cross(vForward);
+ vSide.Normalize();
+ }
+ else
+ {
+ vSide = vForward.Cross(Vector3(vForward.x, vForward.y+1.0f, vForward.z));
+ vSide.Normalize();
+ vUp = vForward.Cross(vSide);
+ vUp.Normalize();
+ }
+
+ // Generate a matrix, and then a quaternion from it
+ Matrix rotMatrix(Matrix::IDENTITY);
+ rotMatrix.SetXAxis(vSide);
+ rotMatrix.SetYAxis(vUp);
+ rotMatrix.SetZAxis(vForward);
+ Quaternion q( rotMatrix );
+
+ // Generate a matrix from the quaternion, check they are the same
+ Matrix resultMatrix(q);
+ DALI_TEST_EQUALS(resultMatrix, rotMatrix, 0.001f, TEST_LOCATION);
+
+ // Rotate an arbitrary vector by both quaternion and rotation matrix,
+ // check the result is the same
+
+ Vector4 aVector(-2.983f, -3.213f, 8.2239f, 1.0f);
+ Vector3 aVectorRotatedByQ = q.Rotate(Vector3(aVector));
+ Vector4 aVectorRotatedByR = rotMatrix*aVector;
+ DALI_TEST_EQUALS(aVectorRotatedByQ, Vector3(aVectorRotatedByR), 0.001f, TEST_LOCATION);
+ }
+ }
+ }
+ END_TEST;
+}
+
+int UtcDaliQuaternionFromAxes01(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ Vector3 xAxis( Vector3::XAXIS );
+ Vector3 yAxis( Vector3::YAXIS );
+ Vector3 zAxis( Vector3::ZAXIS );
+
+ Quaternion q1( xAxis, yAxis, zAxis);
+
+ DALI_TEST_EQUALS( q1, Quaternion::IDENTITY, TEST_LOCATION );
+
+ xAxis = Vector3( 1.0f, 1.0f, 0.0f );
+ xAxis.Normalize();
+ yAxis = Vector3( -1.0f, 1.0f, 0.0f ); // 45 degrees anticlockwise (+ve) around z
+ yAxis.Normalize();
+ zAxis = xAxis.Cross(yAxis);
+ zAxis.Normalize();
+ Quaternion q2( xAxis, yAxis, zAxis );
+
+ DALI_TEST_EQUALS( q2, Quaternion(Radian(Degree(45)), Vector3::ZAXIS), 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliQuaternionFromAxes02(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ // Create an arbitrary forward vector
+ for( float x=-1.0f; x<=1.0f; x+=0.1f )
+ {
+ for( float y=-1.0f; y<1.0f; y+=0.1f )
+ {
+ for( float z=-1.0f; z<1.0f; z+=0.1f )
+ {
+ Vector3 vForward(x, y, z);
+ vForward.Normalize();
+
+ // Construct an up vector from a sideways move
+ Vector3 vSide;
+ Vector3 vUp = vForward.Cross(Vector3(vForward.x+1.0f, vForward.y, vForward.z));
+ if(vUp.Length() > 0.01 )
+ {
+ vUp.Normalize();
+ vSide = vUp.Cross(vForward);
+ vSide.Normalize();
+ }
+ else
+ {
+ vSide = vForward.Cross(Vector3(vForward.x, vForward.y+1.0f, vForward.z));
+ vSide.Normalize();
+ vUp = vForward.Cross(vSide);
+ vUp.Normalize();
+ }
+
+ // Generate a quaternion
+ Quaternion q( vSide, vUp, vForward );
+
+ Matrix rotMatrix;
+ rotMatrix.SetXAxis(vSide);
+ rotMatrix.SetYAxis(vUp);
+ rotMatrix.SetZAxis(vForward);
+
+ // Generate a matrix from the quaternion, check they are the same
+ Matrix m(q);
+ DALI_TEST_EQUALS(m.GetXAxis(), vSide, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(m.GetYAxis(), vUp, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(m.GetZAxis(), vForward, 0.001f, TEST_LOCATION);
+
+ // Rotate an arbitrary vector by both quaternion and rotation matrix,
+ // check the result is the same
+
+ Vector4 aVector(2.043f, 12.8f, -3.872f, 1.0f);
+ Vector3 aVectorRotatedByQ = q.Rotate(Vector3(aVector));
+ Vector4 aVectorRotatedByR = rotMatrix*aVector;
+ DALI_TEST_EQUALS(aVectorRotatedByQ, Vector3(aVectorRotatedByR), 0.001f, TEST_LOCATION);
+ }
+ }
+ }
+ END_TEST;
+}
+
+int UtcDaliQuaternionOperatorAddition(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.383f, 0.0f, 0.0f, 0.924f);
+ Quaternion q2(0.0f, 0.609f, 0.0f, 0.793f);
+
+ Quaternion r1(0.383f, 0.609f, 0.0f, 1.717f);
+
+ DALI_TEST_EQUALS(q1+q2, r1, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionOperatorSubtraction(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.383f, 0.450f, 0.123f, 0.924f);
+ Quaternion q2(0.383f, 0.690f, 0.234f, 1.917f);
+
+ Quaternion r1(0.0f, 0.240f, 0.111f, 0.993f);
+
+ DALI_TEST_EQUALS(q2-q1, r1, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionConjugate(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ float s1=0.784f; Vector3 v1(0.045f, 0.443f, 0.432f);
+ float s2=0.697f; Vector3 v2(0.612, 0.344, -0.144);
+
+ Quaternion q1(s1, v1.x, v1.y, v1.z);
+ Quaternion q2(s2, v2.x, v2.y, v2.z);
+ q1.Conjugate();
+ q2.Conjugate();
+
+ Quaternion r1(s1, -v1.x, -v1.y, -v1.z);
+ Quaternion r2(s2, -v2.x, -v2.y, -v2.z);
+
+ DALI_TEST_EQUALS(q1, r1, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(q2, r2, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionOperatorMultiplication01(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ float s1=0.784f; Vector3 v1(0.045f, 0.443f, 0.432f);
+ float s2=0.697f; Vector3 v2(0.612, 0.344, -0.144);
+
+ Quaternion q1(s1, v1.x, v1.y, v1.z);
+ Quaternion q2(s2, v2.x, v2.y, v2.z);
+
+ Vector3 vp = v1.Cross(v2) + v2*s1 + v1*s2;
+ Quaternion r1(s1*s2-v1.Dot(v2), vp.x, vp.y, vp.z);
+
+ DALI_TEST_EQUALS(q1*q2, r1, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionOperatorDivision(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.383f, 0.0f, 0.0f, 0.924f);
+ Quaternion q2(0.0f, 0.609f, 0.0f, 0.793f);
+
+ // q1 / q2 = q1 * q2^-1
+ // q2^-1 = q2* / ||q2||^2
+ // = Conjugate of q2 / Square of Norm of q2
+
+ Quaternion r1 = q2;
+ r1.Conjugate();
+ r1 *= 1.0f/q2.LengthSquared();
+ Quaternion r2 = q1 * r1;
+
+ DALI_TEST_EQUALS(q1 / q2, r2, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionOperatorScale01(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.383f, 0.0f, 0.0f, 0.924f);
+ Quaternion r1(2.0f* 0.383f, 0.0f, 0.0f, 2.0f * 0.924f);
+
+ DALI_TEST_EQUALS(q1 * 2.0f, r1, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionOperatorScale02(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.383f, 0.0f, 0.0f, 0.924f);
+ Quaternion r1(0.5f* 0.383f, 0.0f, 0.0f, 0.5f * 0.924f);
+
+ DALI_TEST_EQUALS(q1 / 2.0f, r1, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionOperatorNegation(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.383f, 0.0f, 0.0f, 0.924f);
+ Quaternion r1(-0.383f, -0.0f, -0.0f, -0.924f);
+
+ DALI_TEST_EQUALS(-q1, r1, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionOperatorAddAssign(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.383f, 0.0f, 0.0f, 0.924f);
+ Quaternion q2(0.0f, 0.609f, 0.0f, 0.793f);
+
+ Quaternion r1(0.383f, 0.609f, 0.0f, 1.717f);
+
+ q1 += q2;
+ DALI_TEST_EQUALS(q1, r1, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionOperatorSubtractAssign(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.383f, 0.450f, 0.123f, 0.924f);
+ Quaternion q2(0.383f, 0.690f, 0.234f, 1.917f);
+
+ Quaternion r1(0.0f, 0.240f, 0.111f, 0.993f);
+ q2 -= q1;
+ DALI_TEST_EQUALS(q2, r1, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionOperatorMultiplyAssign(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ float s1=0.784f; Vector3 v1(0.045f, 0.443f, 0.432f);
+ float s2=0.697f; Vector3 v2(0.612, 0.344, -0.144);
+
+ Quaternion q1(s1, v1.x, v1.y, v1.z);
+ Quaternion q2(s2, v2.x, v2.y, v2.z);
+
+ Quaternion r3 = q2 * q1;
+ q2 *= q1;
+ DALI_TEST_EQUALS(q2, r3, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionOperatorScaleAssign01(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.383f, 0.450f, 0.123f, 0.924f);
+ float scale = 2.5f;
+ Quaternion r1(scale*0.383f, scale*0.450f, scale*0.123f, scale*0.924f);
+ q1 *= scale;
+ DALI_TEST_EQUALS(q1, r1, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionOperatorScaleAssign02(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.383f, 0.450f, 0.123f, 0.924f);
+ float scale = 2.5f;
+ Quaternion r1(0.383f/scale, 0.450f/scale, 0.123f/scale, 0.924f/scale);
+ q1 /= scale;
+ DALI_TEST_EQUALS(q1, r1, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionOperatorEquality(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.383f, 0.450f, 0.123f, 0.924f);
+ Quaternion q2(0.383f, 0.450f, 0.123f, 0.924f);
+ Quaternion q3(0.383f, 0.450f, 0.123f, 0.800f);
+ Quaternion q4(0.383f, 0.450f, 0.100f, 0.800f);
+ Quaternion q5(0.383f, 0.100f, 0.100f, 0.800f);
+ Quaternion q6(0.100f, 0.100f, 0.100f, 0.800f);
+
+ Quaternion q7(-0.383f, -0.450f, -0.123f, -0.924f);
+ Quaternion q8(-0.383f, -0.450f, -0.123f, 0.924f);
+ Quaternion q9(-0.383f, -0.450f, 0.123f, 0.924f);
+ Quaternion q10(-0.383f, 0.450f, 0.123f, 0.924f);
+
+ DALI_TEST_CHECK( q1 == q2 );
+ DALI_TEST_CHECK( !(q1 == q3) );
+ DALI_TEST_CHECK( !(q1 == q4) );
+ DALI_TEST_CHECK( !(q1 == q5) );
+ DALI_TEST_CHECK( !(q1 == q6) );
+ DALI_TEST_CHECK( (q1 == q7) );
+ DALI_TEST_CHECK( !(q1 == q8) );
+ DALI_TEST_CHECK( !(q1 == q9) );
+ DALI_TEST_CHECK( !(q1 == q10) );
+ END_TEST;
+}
+
+int UtcDaliQuaternionOperatorInequality(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.383f, 0.450f, 0.123f, 0.924f);
+ Quaternion q2(0.383f, 0.450f, 0.123f, 0.924f);
+ Quaternion q3(-0.383f, -0.0f, -0.0f, -0.924f);
+ DALI_TEST_CHECK( !(q1 != q2) );
+ DALI_TEST_CHECK( q1 != q3 );
+ END_TEST;
+}
+
+int UtcDaliQuaternionLength(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.383f, 0.450f, 0.123f, 0.924f);
+ float length = sqrtf(0.383f*0.383f + 0.450f*0.450f + 0.123f*0.123f + 0.924f*0.924f);
+ DALI_TEST_EQUALS(q1.Length(), length, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionLengthSquared(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.383f, 0.450f, 0.123f, 0.924f);
+ float lengthSquared = 0.383f*0.383f + 0.450f*0.450f + 0.123f*0.123f + 0.924f*0.924f;
+ DALI_TEST_EQUALS(q1.LengthSquared(), lengthSquared, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionNormalize(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.118f, 0.692f, -0.127f, 0.701f);
+ Quaternion q2 = q1;
+ q2 *= 5.0f;
+ q2.Normalize();
+ DALI_TEST_EQUALS(q1, q2, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionNormalized(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.118f, 0.692f, -0.127f, 0.701f);
+ Quaternion q2 = q1;
+ q2 *= 5.0f;
+ DALI_TEST_EQUALS(q1, q2.Normalized(), 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionInvert(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.383f, 0.0f, 0.0f, 0.924f);
+
+ // q1^-1 = q1* / ||q1||^2
+ // = Conjugate of q1 / Square of Norm of q1
+
+ Quaternion r1 = q1;
+ r1.Conjugate();
+ r1 *= 1.0f/q1.LengthSquared();
+
+ Quaternion q2 = q1;
+ q2.Invert();
+ DALI_TEST_EQUALS(q2, r1, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliQuaternionDot(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ // q.q' = s*s' + v dot v'
+ float s1=0.784f; Vector3 v1(0.045f, 0.443f, 0.432f);
+ float s2=0.697f; Vector3 v2(0.612, 0.344, -0.144);
+
+ Quaternion q1(s1, v1.x, v1.y, v1.z);
+ Quaternion q2(s2, v2.x, v2.y, v2.z);
+
+ float r1 = s1*s2 + v1.Dot(v2);
+
+ DALI_TEST_EQUALS(Quaternion::Dot(q1, q2), r1, TEST_LOCATION);
+ END_TEST;
+}
+
+
+// Quaternion * vector == Vector rotation
+int UtcDaliQuaternionOperatorMultiplication02(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ // Rotation of vector p = (x,y,z) by Quaternion q == q [0,p] q^-1
+ Vector3 v(2, 3, 4);
+ Quaternion q(Radian(Degree(72)), Vector3::ZAXIS);
+ Quaternion qI = q;
+ qI.Invert();
+ Quaternion qv(0.0f, v.x, v.y, v.z);
+ Quaternion r1 = (q * qv) * qI;
+
+ Vector3 r2 = q * v;
+
+ DALI_TEST_EQUALS(r1.mVector.x, r2.x, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(r1.mVector.y, r2.y, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(r1.mVector.z, r2.z, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionRotate01(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ // Rotation of vector p = (x,y,z) by Quaternion q == q [0,p] q^-1
+ Vector3 v(2, 3, 4);
+ Quaternion q(Radian(Degree(72)), Vector3::ZAXIS);
+ Quaternion qI = q;
+ qI.Invert();
+ Quaternion qv(0.0f, v.x, v.y, v.z);
+ Quaternion r1 = q * qv * qI;
+
+ Vector3 r2 = q.Rotate(v);
+
+ DALI_TEST_EQUALS(r1.mVector.x, r2.x, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(r1.mVector.y, r2.y, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(r1.mVector.z, r2.z, 0.001f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(q.Rotate(v), q*v, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliQuaternionRotate02(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ // Rotation of vector p = (x,y,z) by Quaternion q == q [0,p] q^-1
+ Vector4 v(2, 3, 4, 5);
+ Quaternion q(Radian(Degree(72)), Vector3::ZAXIS);
+ Quaternion qI = q;
+ qI.Invert();
+ Quaternion qv(0.0f, v.x, v.y, v.z);
+ Quaternion r1 = q * qv * qI;
+
+ Vector4 r2 = q.Rotate(v);
+
+ DALI_TEST_EQUALS(r1.mVector.x, r2.x, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(r1.mVector.y, r2.y, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(r1.mVector.z, r2.z, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(r1.mVector.w, 0.0f, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliQuaternionExp01(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.0f, 1.0f, 1.2f, 1.3f);
+ Quaternion q2 = q1.Exp();
+ Quaternion r2(-0.4452, 0.4406, 0.5287, 0.5728);
+
+ DALI_TEST_EQUALS(q2.Length(), 1.0f, 0.01f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(q2, r2, 0.001f, TEST_LOCATION);
+
+ // Note, this trick only works when |v| < pi, which it is!
+ Quaternion q3 = q2.Log();
+ DALI_TEST_EQUALS(q1, q3, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliQuaternionExp02(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(0.0f, 0.0f, 0.0f, 0.0f);
+ Quaternion q2 = q1.Exp();
+ Quaternion r2(1.0f, 0.0f, 0.0f, 0.0f);
+
+ DALI_TEST_EQUALS(q2.Length(), 1.0f, 0.01f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(q2, r2, 0.001f, TEST_LOCATION);
+
+ // Note, this trick only works when |v| < pi, which it is!
+ Quaternion q3 = q2.Log();
+ DALI_TEST_EQUALS(q1, q3, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliQuaternionExp03(void)
+{
+ TestApplication app;
+
+ Quaternion q(0.0f, Vector3(5.0f, 6.0f, 7.0f));
+
+ // q.w is non-zero. Should assert.
+ try
+ {
+ q.Exp();
+ DALI_TEST_CHECK(false);
+ }
+ catch(DaliException& e)
+ {
+ DALI_TEST_CHECK(true);
+ }
+ END_TEST;
+}
+
+
+int UtcDaliQuaternionLog01(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q(Math::PI*0.73f, Vector3(2,3,4));
+ Quaternion q2 = q;
+ q2.Normalize();
+
+ Quaternion r = q2.Log();
+ DALI_TEST_EQUALS(r.mVector.w, 0.0f, 0.01f, TEST_LOCATION);
+
+ Quaternion r2 = r.Exp();
+ DALI_TEST_EQUALS(r2, q2, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionLog02(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(1.0f, 0.0f, 0.0f, 0.0f);
+ Quaternion r1(0.0f, 0.0f, 0.0f, 0.0f);
+
+ Quaternion q2 = q1.Log();
+
+ DALI_TEST_EQUALS(q2, r1, 0.01f, TEST_LOCATION);
+
+ Quaternion q3 = q2.Exp();
+ DALI_TEST_EQUALS(q1, q3, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+
+int UtcDaliQuaternionLerp(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(Radian(Degree(-80)), Vector3(0.0f, 0.0f, 1.0f));
+ Quaternion q2(Radian(Degree( 80)), Vector3(0.0f, 0.0f, 1.0f));
+
+ Quaternion p = Quaternion::Lerp(q1, q2, 0.0f);
+ DALI_TEST_EQUALS(p, q1, 0.001f, TEST_LOCATION);
+
+ p = Quaternion::Lerp(q1, q2, 1.0f);
+ DALI_TEST_EQUALS(p, q2, 0.001f, TEST_LOCATION);
+
+ p = Quaternion::Lerp(q1, q2, 0.5f);
+ Quaternion r1 = (q1 + q2) * 0.5f;
+ r1.Normalize();
+ DALI_TEST_EQUALS(p, r1, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+
+int UtcDaliQuaternionSlerp01(void)
+{
+ TestApplication application;
+
+ Quaternion q1(M_PI/4.0f, Vector4(0.0f, 0.0f, 1.0f, 0.0f));
+ Quaternion q2(-M_PI/4.0f, Vector4(0.0f, 0.0f, 1.0f, 0.0f));
+
+ Quaternion q = Quaternion::Slerp(q1, q2, 0.0f);
+ DALI_TEST_EQUALS(q, q1, 0.001, TEST_LOCATION);
+
+ q = Quaternion::Slerp(q1, q2, 1.0f);
+ DALI_TEST_EQUALS(q, q2, 0.001, TEST_LOCATION);
+
+ // @ 25%, will be at M_PI/8
+ q = Quaternion::Slerp(q1, q2, 0.25f);
+ Vector4 axis;
+ float angle;
+ bool converted = q.ToAxisAngle(axis, angle);
+ DALI_TEST_EQUALS(converted, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(angle, Math::PI/8.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.x, 0.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.y, 0.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.z, 1.0f, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+
+
+int UtcDaliQuaternionSlerp02(void)
+{
+ TestApplication application;
+
+ Quaternion q1(M_PI/6, Vector3(0.0f, 0.0f, 1.0f));
+ Quaternion q2(M_PI/2, Vector3(0.0f, 0.0f, 1.0f));
+
+ Quaternion q = Quaternion::Slerp(q1, q2, 0.0f);
+
+ DALI_TEST_EQUALS(q, q1, 0.001, TEST_LOCATION);
+
+ q = Quaternion::Slerp(q1, q2, 1.0f);
+
+ DALI_TEST_EQUALS(q, q2, 0.001, TEST_LOCATION);
+
+ // @ 50%, will be at M_PI/3 around z
+ q = Quaternion::Slerp(q1, q2, 0.5f);
+
+ Quaternion r( M_PI/3, Vector3( 0.0f, 0.0f, 1.0f));
+ DALI_TEST_EQUALS( q, r, 0.001, TEST_LOCATION );
+ END_TEST;
+}
+
+
+int UtcDaliQuaternionSlerp03(void)
+{
+ TestApplication application;
+
+ Quaternion q1(Radian(Degree(125)), Vector3(0.0f, 0.0f, 1.0f));
+ Quaternion q2(Radian(Degree(-125)), Vector3(0.002f, 0.001f, 1.001f));
+
+ Quaternion q = Quaternion::Slerp(q1, q2, 0.0f);
+ DALI_TEST_EQUALS(q, q1, 0.001, TEST_LOCATION);
+
+ q = Quaternion::Slerp(q1, q2, 1.0f);
+ DALI_TEST_EQUALS(q, q2, 0.001, TEST_LOCATION);
+
+ q = Quaternion::Slerp(q1, q2, 0.05f);
+ Vector4 axis;
+ float angle;
+ bool converted = q.ToAxisAngle(axis, angle);
+ DALI_TEST_EQUALS(converted, true, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(axis.x, 0.0f, 0.01, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.y, 0.0f, 0.01, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.z, 1.0f, 0.01, TEST_LOCATION);
+ END_TEST;
+}
+
+
+
+int UtcDaliQuaternionSlerp04(void)
+{
+ TestApplication application;
+
+ Quaternion q1(Radian(Degree(120)), Vector3(0.0f, 0.0f, 1.0f));
+ Quaternion q2(Radian(Degree(130)), Vector3(0.0f, 0.0f, 1.0f));
+
+ Quaternion q = Quaternion::Slerp(q1, q2, 0.0f);
+ DALI_TEST_EQUALS(q, q1, 0.001, TEST_LOCATION);
+
+ q = Quaternion::Slerp(q1, q2, 1.0f);
+ DALI_TEST_EQUALS(q, q2, 0.001, TEST_LOCATION);
+
+ q = Quaternion::Slerp(q1, q2, 0.5f);
+ Vector4 axis;
+ float angle;
+ bool converted = q.ToAxisAngle(axis, angle);
+ DALI_TEST_EQUALS(converted, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(angle, float(Radian(Degree(125))), 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.x, 0.0f, 0.01, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.y, 0.0f, 0.01, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.z, 1.0f, 0.01, TEST_LOCATION);
+ END_TEST;
+}
+
+
+
+int UtcDaliQuaternionSlerpNoInvert01(void)
+{
+ TestApplication application;
+
+ Quaternion q1(M_PI/4.0f, Vector4(0.0f, 0.0f, 1.0f, 0.0f));
+ Quaternion q2(-M_PI/4.0f, Vector4(0.0f, 0.0f, 1.0f, 0.0f));
+
+ Quaternion q = Quaternion::SlerpNoInvert(q1, q2, 0.0f);
+ DALI_TEST_EQUALS(q, q1, 0.001, TEST_LOCATION);
+
+ q = Quaternion::SlerpNoInvert(q1, q2, 1.0f);
+ DALI_TEST_EQUALS(q, q2, 0.001, TEST_LOCATION);
+
+ // @ 25%, will be at M_PI/8
+ q = Quaternion::SlerpNoInvert(q1, q2, 0.25f);
+ Vector4 axis;
+ float angle;
+ bool converted = q.ToAxisAngle(axis, angle);
+ DALI_TEST_EQUALS(converted, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(angle, Math::PI/8.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.x, 0.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.y, 0.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.z, 1.0f, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliQuaternionSlerpNoInvert02(void)
+{
+ TestApplication application;
+
+ Quaternion q1(Radian(Degree(120)), Vector3(0.0f, 0.0f, 1.0f));
+ Quaternion q2(Radian(Degree(130)), Vector3(0.0f, 0.0f, 1.0f));
+
+ Quaternion q = Quaternion::SlerpNoInvert(q1, q2, 0.0f);
+ DALI_TEST_EQUALS(q, q1, 0.001, TEST_LOCATION);
+
+ q = Quaternion::SlerpNoInvert(q1, q2, 1.0f);
+ DALI_TEST_EQUALS(q, q2, 0.001, TEST_LOCATION);
+
+ q = Quaternion::SlerpNoInvert(q1, q2, 0.5f);
+ Vector4 axis;
+ float angle;
+ bool converted = q.ToAxisAngle(axis, angle);
+ DALI_TEST_EQUALS(converted, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(angle, float(Radian(Degree(125))), 0.01f, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.x, 0.0f, 0.01, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.y, 0.0f, 0.01, TEST_LOCATION);
+ DALI_TEST_EQUALS(axis.z, 1.0f, 0.01, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliQuaternionSquad(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+ Quaternion q1(Radian(Degree(45)), Vector3(0.0f, 0.0f, 1.0f));
+ Quaternion q1out(Radian(Degree(40)), Vector3(0.0f, 1.0f, 2.0f));
+ Quaternion q2in(Radian(Degree(35)), Vector3(0.0f, 2.0f, 3.0f));
+ Quaternion q2(Radian(Degree(30)), Vector3(0.0f, 1.0f, 3.0f));
+
+ Quaternion q = Quaternion::Squad(q1, q2, q1out, q2in, 0.0f);
+ DALI_TEST_EQUALS(q, q1, 0.001f, TEST_LOCATION);
+
+ q = Quaternion::Squad(q1, q2, q1out, q2in, 1.0f);
+ DALI_TEST_EQUALS(q, q2, 0.001f, TEST_LOCATION);
+
+ // Don't know what actual value should be, but can make some informed guesses.
+ q = Quaternion::Squad(q1, q2, q1out, q2in, 0.5f);
+ float angle;
+ Vector3 axis;
+ q.Normalize();
+ q.ToAxisAngle(axis, angle);
+
+ if(angle < 0.0f)
+ {
+ q = -q; // Might get negative quat
+ q.ToAxisAngle(axis, angle);
+ }
+ float deg = Degree(Radian(angle));
+ DALI_TEST_CHECK(deg >= 0 && deg <= 90);
+ DALI_TEST_CHECK(axis.y > 0);
+ DALI_TEST_CHECK(axis.z > 0);
+ END_TEST;
+}
+
+int UtcDaliAngleBetween(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ Quaternion q1(Radian(Degree(45)), 0.0f, 0.0f);
+ Quaternion q2(Radian(Degree(47)), 0.0f, 0.0f);
+ DALI_TEST_EQUALS(Quaternion::AngleBetween(q1, q2), fabsf(Radian(Degree(45)) - Radian(Degree(47))), 0.001f, TEST_LOCATION);
+
+ Quaternion q3(Radian(Degree(80)), Vector3::YAXIS);
+ Quaternion q4(Radian(Degree(90)), Vector3::YAXIS);
+ DALI_TEST_EQUALS(Quaternion::AngleBetween(q3, q4), fabsf(Radian(Degree(80)) - Radian(Degree(90))), 0.001f, TEST_LOCATION);
+
+ Quaternion q5(Radian(Degree(0)), Vector3::YAXIS);
+ Quaternion q6(Radian(Degree(90)), Vector3::XAXIS);
+ DALI_TEST_EQUALS(Quaternion::AngleBetween(q5, q6), fabsf(Radian(Degree(0)) - Radian(Degree(90))), 0.001f, TEST_LOCATION);
+
+ Quaternion q7(Radian(Degree(0)), Vector3::YAXIS);
+ Quaternion q8(Radian(Degree(0)), Vector3::XAXIS);
+ DALI_TEST_EQUALS(Quaternion::AngleBetween(q7, q8), fabsf(Radian(Degree(0)) - Radian(Degree(0))), 0.001f, TEST_LOCATION);
+
+ Quaternion q9(Radian(Degree(0)), Vector3::XAXIS);
+ Quaternion q10(Radian(Degree(180)), Vector3::XAXIS);
+ DALI_TEST_EQUALS(Quaternion::AngleBetween(q9, q10), fabsf(Radian(Degree(0)) - Radian(Degree(180))), 0.001f, TEST_LOCATION);
+
+ Quaternion q11(Radian(Degree(1)), Vector3::YAXIS);
+ Quaternion q12(Radian(Degree(240)), Vector3::YAXIS);
+ DALI_TEST_EQUALS(Quaternion::AngleBetween(q11, q12), fabsf(Radian( Degree(1 - 240 + 360) )), 0.001f, TEST_LOCATION);
+
+ Quaternion q13(Radian(Degree(240)), Vector3::YAXIS);
+ Quaternion q14(Radian(Degree(1)), Vector3::YAXIS);
+ DALI_TEST_EQUALS(Quaternion::AngleBetween(q13, q14), fabsf(Radian( Degree(240 - 1 - 360) )), 0.001f, TEST_LOCATION);
+
+ Quaternion q15(Radian(Degree(240)), Vector3::YAXIS);
+ Quaternion q16(Radian(Degree(1)), Vector3::ZAXIS);
+ DALI_TEST_EQUALS(Quaternion::AngleBetween(q15, q16), Quaternion::AngleBetween(q16, q15), 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliQuaternionOStreamOperator(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ std::ostringstream oss;
+
+ Quaternion quaternion(M_PI, Vector3::YAXIS);
+
+ oss << quaternion;
+
+ std::string expectedOutput = "[ Axis: [0, 1, 0], Angle: 180 degrees ]";
+
+ DALI_TEST_EQUALS( oss.str(), expectedOutput, TEST_LOCATION);
+ END_TEST;
+}
--- /dev/null
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+
+void utc_dali_radian_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_radian_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+// Positive test case for constructors
+int UtcDaliRadianConstructors01(void)
+{
+ TestApplication application;
+
+ // Default constructor, does not initialise the value
+ Radian radian0( 0.0f );
+
+ // Test float assignment operator
+ radian0 = Math::PI;
+ DALI_TEST_EQUALS( float(radian0), Math::PI, 0.001f, TEST_LOCATION );
+
+ // Constructor from float value
+ Radian radian1( Math::PI );
+ DALI_TEST_EQUALS( float(radian1), Math::PI, 0.001f, TEST_LOCATION );
+
+ // Constructor from a Degree
+ Radian radian2( Degree( 180.0f ) );
+ DALI_TEST_EQUALS( float(radian2), Math::PI, 0.001f, TEST_LOCATION );
+
+ // Assignment from Degree
+ Radian radian3( 0.0f );
+ radian3 = Degree( 180.0f );
+ DALI_TEST_EQUALS( float(radian3), Math::PI, 0.001f, TEST_LOCATION );
+ END_TEST;
+}
+
+// Positive test case for comparison
+int UtcDaliRadianComparison01(void)
+{
+ TestApplication application;
+
+ // Comparison between radians
+ Radian radian0( Math::PI_2 );
+ Radian radian1( Math::PI_2 );
+ Radian radian2( Math::PI );
+
+ DALI_TEST_CHECK( radian0 == radian1 );
+ DALI_TEST_CHECK( radian0 != radian2 );
+
+ // Comparison between radian to degree
+ Radian radian3( Math::PI );
+ Radian radian4( Math::PI_2 );
+ Degree degree0( 180.0f );
+
+ DALI_TEST_CHECK( radian3 == degree0 );
+ DALI_TEST_CHECK( radian4 != degree0 );
+
+ // Comparison with float
+ Radian radian5( Math::PI_2 );
+
+ DALI_TEST_CHECK( radian5 == Math::PI_2 );
+ DALI_TEST_CHECK( radian5 != Math::PI );
+
+ END_TEST;
+}
+
+
+// test case for cast operators
+int UtcDaliRadianCastOperators01(void)
+{
+ TestApplication application; // Exceptions require TestApplication
+
+ Radian radian0( Math::PI );
+
+ const float& value0( radian0 );
+ DALI_TEST_EQUALS( value0, Math::PI, 0.001f, TEST_LOCATION );
+
+ radian0 = Math::PI_2;
+ DALI_TEST_EQUALS( value0, Math::PI_2, 0.001f, TEST_LOCATION );
+
+ float& value1( radian0 );
+ DALI_TEST_EQUALS( value1, Math::PI_2, 0.001f, TEST_LOCATION );
+
+ value1 = Math::PI;
+ DALI_TEST_EQUALS( float(radian0), Math::PI, 0.001f, TEST_LOCATION );
+ END_TEST;
+}
+
+
+int UtcDaliRadianCastOperatorEquals(void)
+{
+ TestApplication application;
+
+ Radian a(Math::PI_2);
+ Radian b(Math::PI_2);
+ Radian c(Math::PI);
+
+ DALI_TEST_EQUALS(a == a, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(a == b, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(a == c, false, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliRadianCastOperatorNotEquals(void)
+{
+ TestApplication application;
+
+ Radian a(Math::PI_2);
+ Radian b(Math::PI_2);
+ Radian c(Math::PI);
+
+ DALI_TEST_EQUALS(a != a, false, TEST_LOCATION);
+ DALI_TEST_EQUALS(a != b, false, TEST_LOCATION);
+ DALI_TEST_EQUALS(a != c, true, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliRadianCastOperatorLessThan(void)
+{
+ TestApplication application;
+
+ Radian a(Math::PI_4);
+ Radian b(Math::PI_2);
+ Radian c(Math::PI);
+ Radian d(2.0f*Math::PI);
+ Radian e(-Math::PI);
+
+ DALI_TEST_EQUALS(a < a, false, TEST_LOCATION);
+ DALI_TEST_EQUALS(a < b, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(a < c, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(a < d, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(a < e, false, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(b < a, false, TEST_LOCATION);
+ DALI_TEST_EQUALS(b < b, false, TEST_LOCATION);
+ DALI_TEST_EQUALS(c < b, false, TEST_LOCATION);
+ DALI_TEST_EQUALS(d < b, false, TEST_LOCATION);
+ DALI_TEST_EQUALS(e < b, true, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(Radian(Math::PI_2) < Degree(180.0f), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(Radian(Math::PI_2) < Degree(90.0f), false, TEST_LOCATION);
+ DALI_TEST_EQUALS(Radian(Math::PI_2) < Degree(45.0f), false, TEST_LOCATION);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_rect_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_rect_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+// Positive test case for a method
+int UtcDaliRectCons01(void)
+{
+ TestApplication application;
+
+ Rect<float> rect;
+ DALI_TEST_EQUALS(rect.x, 0.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(rect.y, 0.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(rect.width, 0.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(rect.height, 0.0f, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliRectCons02(void)
+{
+ TestApplication application;
+
+ Rect<float> rect(10.0f, 20.0f, 400.0f, 200.0f);
+ DALI_TEST_EQUALS(rect.x, 10.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(rect.y, 20.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(rect.width, 400.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(rect.height, 200.0f, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliRectCons03(void)
+{
+ TestApplication application;
+
+ Rect<float> rect(10.0f, 20.0f, 400.0f, 200.0f);
+
+ Rect<float> r2 = rect;
+
+ DALI_TEST_EQUALS(r2.x, 10.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(r2.y, 20.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(r2.width, 400.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(r2.height, 200.0f, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliRectCons04(void)
+{
+ TestApplication application;
+
+ Rect<float> rect(10.0f, 20.0f, 400.0f, 200.0f);
+
+ Rect<float> r2(rect);
+
+ DALI_TEST_EQUALS(r2.x, 10.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(r2.y, 20.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(r2.width, 400.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(r2.height, 200.0f, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliRectSet(void)
+{
+ TestApplication application;
+
+ Rect<float> rect(10.0f, 20.0f, 400.0f, 200.0f);
+
+ rect.Set(1.0f, 2.0f, 3.0f, 4.0f);
+
+ DALI_TEST_EQUALS(rect.x, 1.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(rect.y, 2.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(rect.width, 3.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(rect.height, 4.0f, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliRectIsEmpty(void)
+{
+ TestApplication application;
+
+ Rect<int> ri;
+ Rect<float> rf(10.0f, 20.0f, 400.0f, 200.0f);
+ Rect<float> rf2;
+ Rect<float> rf3(10.0f, 20.0f, 0.0f, 200.0f);
+ Rect<float> rf4(10.0f, 20.0f, 400.0f, 0.0f);
+ Rect<double> rd(10.0, 20.0, 0.0, 200.0);
+ Rect<unsigned int> ru(0u, 0u, 4u, 0u);
+
+ DALI_TEST_CHECK(!rf.IsEmpty());
+ DALI_TEST_CHECK(rf2.IsEmpty());
+ DALI_TEST_CHECK(rf3.IsEmpty());
+ DALI_TEST_CHECK(rf4.IsEmpty());
+ DALI_TEST_CHECK(ri.IsEmpty());
+ DALI_TEST_CHECK(rd.IsEmpty());
+ DALI_TEST_CHECK(ru.IsEmpty());
+ END_TEST;
+}
+
+int UtcDaliRectRight(void)
+{
+ TestApplication application;
+
+ Rect<float> rf(10.0f, 20.0f, 400.0f, 200.0f);
+
+ DALI_TEST_EQUALS(rf.Right(), 410.0f, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliRectBottom(void)
+{
+ TestApplication application;
+
+ Rect<float> rf(10.0f, 20.0f, 400.0f, 200.0f);
+
+ DALI_TEST_EQUALS(rf.Bottom(), 220.0f, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliRectArea(void)
+{
+ TestApplication application;
+
+ Rect<float> rf(10.0f, 20.0f, 400.0f, 200.0f);
+
+ DALI_TEST_EQUALS(rf.Area(), 80000.0f, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliRectIntersects(void)
+{
+ TestApplication application;
+
+ Rect<float> rf1( 10.0f, 20.0f, 200.0f, 200.0f);
+ Rect<float> rf2( 10.0f, 120.0f, 200.0f, 200.0f);
+ Rect<float> rf3( 10.0f, -80.0f, 200.0f, 200.0f);
+ Rect<float> rf4(110.0f, 20.0f, 200.0f, 200.0f);
+ Rect<float> rf5(-90.0f, 20.0f, 200.0f, 200.0f);
+ Rect<float> rf6(1000.0f, 1200.0f, 10.0f, 10.0f);
+
+ DALI_TEST_CHECK(rf1.Intersects(rf2));
+ DALI_TEST_CHECK(rf1.Intersects(rf3));
+ DALI_TEST_CHECK(rf1.Intersects(rf4));
+ DALI_TEST_CHECK(rf1.Intersects(rf5));
+ DALI_TEST_CHECK(!rf1.Intersects(rf6));
+ END_TEST;
+}
+
+
+
+int UtcDaliRectContains(void)
+{
+ TestApplication application;
+
+ Rect<float> rf1( 10.0f, 20.0f, 200.0f, 200.0f);
+
+ Rect<float> rf2( 10.0f, 120.0f, 200.0f, 200.0f);
+ Rect<float> rf3( 10.0f, -80.0f, 200.0f, 200.0f);
+ Rect<float> rf4(110.0f, 20.0f, 200.0f, 200.0f);
+ Rect<float> rf5(-90.0f, 20.0f, 200.0f, 200.0f);
+ Rect<float> rf6(1000.0f, 1200.0f, 10.0f, 10.0f);
+
+ Rect<float> rf7( 50.0f, 70.0f, 50.0f, 50.0f);
+
+ Rect<float> rf8( 10.0f, 20.0f, 100.0f, 100.0f);
+ Rect<float> rf9( 110.0f, 20.0f, 100.0f, 100.0f);
+ Rect<float> rf10( 110.0f, 120.0f, 100.0f, 100.0f);
+ Rect<float> rf11( 10.0f, 120.0f, 100.0f, 100.0f);
+
+ DALI_TEST_CHECK(rf1.Contains(rf1));
+ DALI_TEST_CHECK(!rf1.Contains(rf2));
+ DALI_TEST_CHECK(!rf1.Contains(rf3));
+ DALI_TEST_CHECK(!rf1.Contains(rf4));
+ DALI_TEST_CHECK(!rf1.Contains(rf5));
+ DALI_TEST_CHECK(!rf1.Contains(rf6));
+
+ DALI_TEST_CHECK(rf1.Contains(rf7));
+
+ DALI_TEST_CHECK(rf1.Contains(rf8));
+ DALI_TEST_CHECK(rf1.Contains(rf9));
+ DALI_TEST_CHECK(rf1.Contains(rf10));
+ DALI_TEST_CHECK(rf1.Contains(rf11));
+ END_TEST;
+}
+
+
+int UtcDaliRectOperatorNotEquals(void)
+{
+ TestApplication application;
+
+ Rect<float> rf1( 10.0f, 20.0f, 200.0f, 200.0f);
+ Rect<float> rf2( 10.0f, 120.0f, 200.0f, 200.0f);
+ Rect<float> rf3( 10.0f, -80.0f, 200.0f, 200.0f);
+ Rect<float> rf4(110.0f, 20.0f, 200.0f, 200.0f);
+ Rect<float> rf5(-90.0f, 20.0f, 200.0f, 200.0f);
+ Rect<float> rf6(1000.0f, 1200.0f, 10.0f, 10.0f);
+ Rect<float> rf7( 50.0f, 70.0f, 50.0f, 50.0f);
+ Rect<float> rf8( 10.0f, 20.0f, 100.0f, 100.0f);
+ Rect<float> rf9( 110.0f, 20.0f, 100.0f, 100.0f);
+ Rect<float> rf10( 110.0f, 120.0f, 100.0f, 100.0f);
+ Rect<float> rf11( 10.0f, 120.0f, 100.0f, 100.0f);
+
+ DALI_TEST_CHECK(rf1 != rf2);
+ DALI_TEST_CHECK(rf1 != rf3);
+ DALI_TEST_CHECK(rf1 != rf4);
+ DALI_TEST_CHECK(rf1 != rf5);
+ DALI_TEST_CHECK(rf1 != rf6);
+ DALI_TEST_CHECK(rf1 != rf7);
+ DALI_TEST_CHECK(rf1 != rf8);
+ DALI_TEST_CHECK(rf1 != rf9);
+ DALI_TEST_CHECK(rf1 != rf10);
+ DALI_TEST_CHECK(rf1 != rf11);
+ END_TEST;
+}
+
+
+int UtcDaliRectOperatorEquals(void)
+{
+ TestApplication application;
+
+ Rect<float> rf1( 10.0f, 20.0f, 200.0f, 200.0f);
+ Rect<float> rf1p( 10.0f, 20.0f, 200.0f, 200.0f);
+
+ Rect<float> rf2(110.0f, 20.0f, 200.0f, 200.0f);
+ Rect<float> rf3( 10.0f, 120.0f, 200.0f, 200.0f);
+ Rect<float> rf4( 10.0f, 20.0f, 300.0f, 200.0f);
+ Rect<float> rf5( 10.0f, 20.0f, 200.0f, 500.0f);
+
+ Rect<float> rf6( 0.0f, 0.0f, 9.0f, 10.0f);
+
+ DALI_TEST_CHECK(rf1 == rf1p);
+ DALI_TEST_CHECK(rf1 == rf1);
+ DALI_TEST_CHECK(!(rf1 == rf2));
+ DALI_TEST_CHECK(!(rf1 == rf3));
+ DALI_TEST_CHECK(!(rf1 == rf4));
+ DALI_TEST_CHECK(!(rf1 == rf5));
+ DALI_TEST_CHECK(!(rf1 == rf6));
+
+
+ // integers
+ Rect<int> ri1( 10, 20, 200, 200 );
+ Rect<int> ri1p( 10, 20, 200, 200 );
+
+ DALI_TEST_CHECK(ri1 == ri1p);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+#include <dali/integration-api/debug.h>
+
+using namespace Dali;
+
+void utc_dali_render_task_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_render_task_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace // unnamed namespace
+{
+
+class TestNativeImage : public NativeImage
+{
+public:
+ int mWidth;
+ int mHeight;
+ TestNativeImage(int width, int height)
+ : mWidth(width),
+ mHeight(height)
+ {}
+
+ virtual bool GlExtensionCreate() {return true;};
+
+ /**
+ * Destroy the GL resource for the NativeImage.
+ * e.g. For the EglImageKHR extension, this corresponds to calling eglDestroyImageKHR()
+ * @pre There is a GL context for the current thread.
+ */
+ virtual void GlExtensionDestroy() {};
+
+ /**
+ * Use the NativeImage as a texture for rendering
+ * @pre There is a GL context for the current thread.
+ * @return A GL error code
+ */
+ virtual unsigned int TargetTexture() {return 0;};
+
+ /**
+ * Called in each NativeTexture::Bind() call to allow implementation specific operations.
+ * The correct texture sampler has already been bound before the function gets called.
+ * @pre glAbstraction is being used by context in current thread
+ */
+ virtual void PrepareTexture() {}
+
+ /**
+ * Returns the width of the NativeImage
+ * @return width
+ */
+ virtual unsigned int GetWidth() const {return mWidth;}
+
+ /**
+ * Returns the height of the NativeImage
+ * @return height
+ */
+ virtual unsigned int GetHeight() const {return mHeight;}
+
+ /**
+ * Returns the internal pixel NativeImage::PixelFormat of the NativeImage
+ * @return pixel format
+ */
+ virtual Pixel::Format GetPixelFormat() const { return Pixel::RGBA8888; }
+protected:
+ ~TestNativeImage(){}
+};
+
+
+const int RENDER_FRAME_INTERVAL = 16; ///< Duration of each frame in ms. (at approx 60FPS)
+
+/*
+ * Simulate time passed by.
+ *
+ * @note this will always process at least 1 frame (1/60 sec)
+ *
+ * @param application Test application instance
+ * @param duration Time to pass in milliseconds.
+ * @return The actual time passed in milliseconds
+ */
+int Wait(TestApplication& application, int duration = 0)
+{
+ int time = 0;
+
+ for(int i = 0; i <= ( duration / RENDER_FRAME_INTERVAL); i++)
+ {
+ application.SendNotification();
+ application.Render(RENDER_FRAME_INTERVAL);
+ time += RENDER_FRAME_INTERVAL;
+ }
+
+ return time;
+}
+
+struct RenderTaskFinished
+{
+ RenderTaskFinished( bool& finished )
+ : finished( finished )
+ {
+ }
+
+ void operator()( RenderTask& renderTask )
+ {
+ finished = true;
+ }
+
+ bool& finished;
+};
+
+struct RenderTaskFinishedRemoveSource
+{
+ RenderTaskFinishedRemoveSource( bool& finished )
+ : finished( finished ),
+ finishedOnce(false)
+ {
+ }
+
+ void operator()( RenderTask& renderTask )
+ {
+ DALI_TEST_CHECK(finishedOnce == false);
+ finished = true;
+ finishedOnce = true;
+ Actor srcActor = renderTask.GetSourceActor();
+ UnparentAndReset(srcActor);
+ }
+
+ bool& finished;
+ bool finishedOnce;
+};
+
+struct RenderTaskFinishedRenderAgain
+{
+ RenderTaskFinishedRenderAgain( bool& finished )
+ : finished( finished ),
+ finishedOnce(false)
+ {
+ }
+
+ void operator()( RenderTask& renderTask )
+ {
+ DALI_TEST_CHECK(finishedOnce == false);
+ finished = true;
+ finishedOnce = true;
+ renderTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+ }
+
+ bool& finished;
+ bool finishedOnce;
+};
+
+
+bool TestScreenToFrameBufferFunction( Vector2& coordinates )
+{
+ coordinates = coordinates + Vector2( 1, 2 );
+
+ return true;
+}
+
+ImageActor CreateLoadingImage(TestApplication& application, std::string filename, Image::LoadPolicy loadPolicy, Image::ReleasePolicy releasePolicy)
+{
+ Image image = Image::New(filename, loadPolicy, releasePolicy);
+ DALI_TEST_CHECK( image );
+ application.SendNotification();
+ application.Render(16);
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
+ ImageActor actor = ImageActor::New(image);
+ actor.SetSize( 80, 80 );
+ application.SendNotification();
+ application.Render(16);
+ return actor;
+}
+
+void CompleteImageLoad(TestApplication& application, Integration::ResourceId resourceId, Integration::ResourceTypeId requestType)
+{
+ std::vector<GLuint> ids;
+ ids.push_back( 23 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+
+ Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, true );
+ Integration::ResourcePointer resource(bitmap);
+ bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
+
+ application.GetPlatform().SetResourceLoaded(resourceId, requestType, resource);
+}
+
+void FailImageLoad(TestApplication& application, Integration::ResourceId resourceId )
+{
+ application.GetPlatform().SetResourceLoadFailed(resourceId, Integration::FailureUnknown);
+}
+
+void ReloadImage(TestApplication& application, Image image)
+{
+ application.GetPlatform().ClearReadyResources();
+ application.GetPlatform().DiscardRequest();
+ application.GetPlatform().ResetTrace();
+ application.GetPlatform().SetClosestImageSize(Vector2(80.0f, 80.0f)); // Ensure reload is called.
+ image.Reload();
+}
+
+RenderTask CreateRenderTask(TestApplication& application,
+ CameraActor offscreenCamera,
+ Actor rootActor, // Reset default render task to point at this actor
+ Actor secondRootActor, // Source actor
+ unsigned int refreshRate,
+ bool glSync)
+{
+ // Change main render task to use a different root
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+ taskList.GetTask(0u).SetSourceActor( rootActor );
+
+ FrameBufferImage frameBufferImage;
+ if( glSync )
+ {
+ NativeImagePtr testNativeImagePtr = new TestNativeImage(10, 10);
+ frameBufferImage= FrameBufferImage::New( *testNativeImagePtr.Get() );
+ }
+ else
+ {
+ frameBufferImage = FrameBufferImage::New( 10, 10 );
+ }
+
+ // Don't draw output framebuffer
+
+ RenderTask newTask = taskList.CreateTask();
+ newTask.SetCameraActor( offscreenCamera );
+ newTask.SetSourceActor( secondRootActor );
+ newTask.SetInputEnabled( false );
+ newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
+ newTask.SetClearEnabled( true );
+ newTask.SetExclusive( true );
+ newTask.SetRefreshRate( refreshRate );
+ newTask.SetTargetFrameBuffer( frameBufferImage );
+ return newTask;
+}
+
+
+bool UpdateRender(TestApplication& application, TraceCallStack& callStack, bool testDrawn, bool& finishedSig, bool testFinished )
+{
+ finishedSig = false;
+ callStack.Reset();
+ application.Render(16);
+ application.SendNotification();
+
+ bool sigPassed = false;
+ if( testFinished )
+ {
+ sigPassed = finishedSig;
+ }
+ else
+ {
+ sigPassed = ! finishedSig;
+ }
+
+ bool drawPassed = false;
+ if( testDrawn )
+ {
+ drawPassed = callStack.FindMethod("DrawElements") || callStack.FindMethod("DrawArrays");
+ }
+ else
+ {
+ drawPassed = ! callStack.FindMethod("DrawElements") && ! callStack.FindMethod("DrawArrays") ;
+ }
+
+ tet_printf("UpdateRender: drawPassed:%s sigPassed:%s (Expected: %s %s)\n", drawPassed?"T":"F", sigPassed?"T":"F", testDrawn?"T":"F", testFinished?"T":"F");
+
+ return (sigPassed && drawPassed);
+}
+
+} // unnamed namespace
+
+
+/****************************************************************************************************/
+/****************************************************************************************************/
+/******************************** TEST CASES BELOW **********************************************/
+/****************************************************************************************************/
+/****************************************************************************************************/
+
+int UtcDaliRenderTaskDownCast(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::DownCast()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ BaseHandle base = taskList.GetTask( 0u );
+ DALI_TEST_CHECK( base );
+
+ RenderTask task = RenderTask::DownCast( base );
+ DALI_TEST_CHECK( task );
+
+ // Try calling a method
+ DALI_TEST_CHECK( task.GetSourceActor() );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskSetSourceActor(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::SetSourceActor()");
+
+ Stage stage = Stage::GetCurrent();
+
+ const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
+
+ RenderTaskList taskList = stage.GetRenderTaskList();
+
+ RenderTask task = taskList.GetTask( 0u );
+
+ Actor actor = task.GetSourceActor();
+ DALI_TEST_CHECK( actor );
+
+ std::vector<GLuint> ids;
+ ids.push_back( 7 );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+
+ BitmapImage img = BitmapImage::New( 1,1 );
+ ImageActor newActor = ImageActor::New( img );
+ newActor.SetSize(1,1);
+ stage.Add( newActor );
+
+ Actor nonRenderableActor = Actor::New();
+ stage.Add( nonRenderableActor );
+
+ // Stop the newActor from being rendered by changing the source actor
+ DALI_TEST_CHECK( nonRenderableActor );
+ task.SetSourceActor( nonRenderableActor );
+ DALI_TEST_CHECK( task.GetSourceActor() != actor );
+ DALI_TEST_CHECK( task.GetSourceActor() == nonRenderableActor );
+
+ // Update & Render nothing!
+ application.GetGlAbstraction().ClearBoundTextures();
+ application.SendNotification();
+ application.Render();
+
+ // Check that nothing was rendered
+ DALI_TEST_EQUALS( boundTextures.size(), 0u, TEST_LOCATION );
+
+ // Set newActor as the new source Actor
+ task.SetSourceActor( newActor );
+ DALI_TEST_CHECK( task.GetSourceActor() != actor );
+ DALI_TEST_CHECK( task.GetSourceActor() == newActor );
+
+ // Update & Render the newActor
+ application.GetGlAbstraction().ClearBoundTextures();
+ application.SendNotification();
+ application.Render();
+
+ // Check that the newActor was rendered
+ DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION );
+ if ( boundTextures.size() )
+ {
+ DALI_TEST_EQUALS( boundTextures[0], 7u, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliRenderTaskSetSourceActorOffStage(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::SetSourceActor (on/off stage testing)");
+
+ Stage stage = Stage::GetCurrent();
+
+ const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
+
+ RenderTaskList taskList = stage.GetRenderTaskList();
+
+ RenderTask task = taskList.GetTask( 0u );
+
+ Actor actor = task.GetSourceActor();
+ DALI_TEST_CHECK( actor );
+
+ std::vector<GLuint> ids;
+ GLuint expectedTextureId( 3 );
+ ids.push_back( expectedTextureId );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+
+ BitmapImage img = BitmapImage::New( 1,1 );
+ ImageActor newActor = ImageActor::New( img );
+ newActor.SetSize(1,1);
+ task.SetSourceActor( newActor );
+ // Don't add newActor to stage yet
+
+ // Update & Render with the actor initially off-stage
+ application.GetGlAbstraction().ClearBoundTextures();
+ application.SendNotification();
+ application.Render();
+
+ // Check that nothing was rendered
+ DALI_TEST_EQUALS( boundTextures.size(), 0u, TEST_LOCATION );
+
+ // Now add to stage
+ stage.Add( newActor );
+
+ // Update & Render with the actor on-stage
+ application.GetGlAbstraction().ClearBoundTextures();
+ application.SendNotification();
+ application.Render();
+
+ // Check that the newActor was rendered
+ DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION );
+ if ( boundTextures.size() )
+ {
+ DALI_TEST_EQUALS( boundTextures[0], expectedTextureId, TEST_LOCATION );
+ }
+
+ // Now remove from stage
+ stage.Remove( newActor );
+
+ // Update & Render with the actor off-stage
+ application.GetGlAbstraction().ClearBoundTextures();
+ application.SendNotification();
+ application.Render();
+ END_TEST;
+}
+
+int UtcDaliRenderTaskSetSourceActorEmpty(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::SetSourceActor (empty handle case)");
+
+ Stage stage = Stage::GetCurrent();
+
+ const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
+
+ RenderTaskList taskList = stage.GetRenderTaskList();
+
+ RenderTask task = taskList.GetTask( 0u );
+
+ Actor actor = task.GetSourceActor();
+ DALI_TEST_CHECK( actor );
+
+ std::vector<GLuint> ids;
+ GLuint expectedTextureId( 5 );
+ ids.push_back( expectedTextureId );
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+
+ BitmapImage img = BitmapImage::New( 1,1 );
+ ImageActor newActor = ImageActor::New( img );
+ newActor.SetSize(1,1);
+ stage.Add( newActor );
+
+ Actor nonRenderableActor = Actor::New();
+ stage.Add( nonRenderableActor );
+
+ // Set with empty handle
+ task.SetSourceActor( Actor() );
+ DALI_TEST_CHECK( ! task.GetSourceActor() );
+
+ // Update & Render nothing!
+ application.GetGlAbstraction().ClearBoundTextures();
+ application.SendNotification();
+ application.Render();
+
+ // Check that nothing was rendered
+ DALI_TEST_EQUALS( boundTextures.size(), 0u, TEST_LOCATION );
+
+ // Set with non-empty handle
+ task.SetSourceActor( newActor );
+ DALI_TEST_CHECK( task.GetSourceActor() == newActor );
+
+ // Update & Render the newActor
+ application.GetGlAbstraction().ClearBoundTextures();
+ application.SendNotification();
+ application.Render();
+
+ // Check that the newActor was rendered
+ DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION );
+ if ( boundTextures.size() )
+ {
+ DALI_TEST_EQUALS( boundTextures[0], expectedTextureId, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliRenderTaskGetSourceActor(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::GetSourceActor()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ RenderTask task = taskList.GetTask( 0u );
+
+ Actor actor = task.GetSourceActor();
+ DALI_TEST_CHECK( actor );
+
+ // By default the entire scene should be rendered
+ Actor root = Stage::GetCurrent().GetLayer( 0 );
+ DALI_TEST_CHECK( root == actor );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskSetExclusive(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::SetExclusive()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ // Manipulate the GenTextures behaviour, to identify different ImageActors
+
+ std::vector<GLuint> ids;
+ ids.push_back( 8 ); // 8 = actor1
+ ids.push_back( 9 ); // 9 = actor2
+ ids.push_back( 10 ); // 10 = actor3
+ application.GetGlAbstraction().SetNextTextureIds( ids );
+
+ BitmapImage img1 = BitmapImage::New( 1,1 );
+ ImageActor actor1 = ImageActor::New( img1 );
+ actor1.SetSize(1,1);
+ Stage::GetCurrent().Add( actor1 );
+
+ // Update & Render actor1
+ application.SendNotification();
+ application.Render();
+
+ // Check that the actor1 was rendered
+ const std::vector<GLuint>& boundTextures = application.GetGlAbstraction().GetBoundTextures( GL_TEXTURE0 );
+ DALI_TEST_EQUALS( boundTextures.size(), 1u, TEST_LOCATION );
+
+ if ( boundTextures.size() )
+ {
+ DALI_TEST_EQUALS( boundTextures[0], 8u/*unique to actor1*/, TEST_LOCATION );
+ }
+
+ BitmapImage img2 = BitmapImage::New( 1,1 );
+ ImageActor actor2 = ImageActor::New( img2 );
+ actor2.SetSize(1,1);
+
+ // Force actor2 to be rendered before actor1
+ Layer layer = Layer::New();
+ Stage::GetCurrent().Add( layer );
+ layer.Add( actor2 );
+ layer.LowerToBottom();
+
+ // Update & Render
+ application.GetGlAbstraction().ClearBoundTextures();
+ application.SendNotification();
+ application.Render();
+
+ // Check that the actors were rendered
+ DALI_TEST_EQUALS( boundTextures.size(), 2u, TEST_LOCATION );
+
+ if ( boundTextures.size() )
+ {
+ DALI_TEST_EQUALS( boundTextures[0], 9u/*unique to actor2*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( boundTextures[1], 8u/*unique to actor1*/, TEST_LOCATION );
+ }
+
+ BitmapImage img3 = BitmapImage::New( 1,1 );
+ ImageActor actor3 = ImageActor::New( img3 );
+ actor3.SetSize(1,1);
+
+ // Force actor3 to be rendered before actor2
+ layer = Layer::New();
+ Stage::GetCurrent().Add( layer );
+ layer.Add( actor3 );
+ layer.LowerToBottom();
+
+ // Update & Render all actors
+ application.GetGlAbstraction().ClearBoundTextures();
+ application.SendNotification();
+ application.Render();
+
+ // Check that the actors were rendered
+ DALI_TEST_EQUALS( boundTextures.size(), 3u, TEST_LOCATION );
+
+ if ( boundTextures.size() )
+ {
+ DALI_TEST_EQUALS( boundTextures[0], 10u/*unique to actor3*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( boundTextures[1], 9u/*unique to actor2*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( boundTextures[2], 8u/*unique to actor1*/, TEST_LOCATION );
+ }
+
+ // Both actors are now connected to the root node
+ // Setup 2 render-tasks - the first will render from the root-node, and the second from actor2
+
+ // Not exclusive is the default
+ RenderTask task1 = taskList.GetTask( 0u );
+ DALI_TEST_CHECK( false == task1.IsExclusive() );
+
+ RenderTask task2 = taskList.CreateTask();
+ DALI_TEST_CHECK( false == task2.IsExclusive() );
+ task2.SetSourceActor( actor2 );
+
+ // Task1 should render all actors, and task 2 should render only actor2
+
+ application.GetGlAbstraction().ClearBoundTextures();
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( boundTextures.size(), 4u, TEST_LOCATION );
+
+ if ( boundTextures.size() == 4 )
+ {
+ // Test that task 1 renders actor3, then actor2 & then actor1
+ DALI_TEST_CHECK( boundTextures[0] == 10u );
+ DALI_TEST_CHECK( boundTextures[1] == 9u );
+ DALI_TEST_CHECK( boundTextures[2] == 8u );
+
+ // Test that task 2 renders actor2
+ DALI_TEST_EQUALS( boundTextures[3], 9u, TEST_LOCATION );
+ }
+
+ // Make actor2 exclusive to task2
+
+ task2.SetExclusive( true );
+ DALI_TEST_CHECK( true == task2.IsExclusive() );
+
+ // Task1 should render only actor1, and task 2 should render only actor2
+
+ application.GetGlAbstraction().ClearBoundTextures();
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( boundTextures.size(), 3u, TEST_LOCATION );
+ if ( boundTextures.size() == 3 )
+ {
+ // Test that task 1 renders actor3 & actor1
+ DALI_TEST_CHECK( boundTextures[0] == 10u );
+ DALI_TEST_CHECK( boundTextures[1] == 8u );
+
+ // Test that task 2 renders actor2
+ DALI_TEST_CHECK( boundTextures[2] == 9u );
+ }
+ END_TEST;
+}
+
+int UtcDaliRenderTaskIsExclusive(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::IsExclusive()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ // Not exclusive is the default
+ RenderTask task = taskList.GetTask( 0u );
+ DALI_TEST_CHECK( false == task.IsExclusive() );
+
+ RenderTask newTask = taskList.CreateTask();
+ DALI_TEST_CHECK( false == newTask.IsExclusive() );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskSetInputEnabled(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::SetInputEnabled()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ // Input is enabled by default
+ RenderTask task = taskList.GetTask( 0u );
+ DALI_TEST_CHECK( true == task.GetInputEnabled() );
+
+ task.SetInputEnabled( false );
+ DALI_TEST_CHECK( false == task.GetInputEnabled() );
+
+ task.SetInputEnabled( true );
+ DALI_TEST_CHECK( true == task.GetInputEnabled() );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskGetInputEnabled(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::GetInputEnabled()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ // Input is enabled by default
+ RenderTask task = taskList.GetTask( 0u );
+ DALI_TEST_CHECK( true == task.GetInputEnabled() );
+
+ RenderTask newTask = taskList.CreateTask();
+ DALI_TEST_CHECK( true == newTask.GetInputEnabled() );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskSetCameraActor(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::SetCameraActor()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ RenderTask task = taskList.GetTask( 0u );
+
+ Actor actor = task.GetCameraActor();
+ DALI_TEST_CHECK( actor );
+
+ CameraActor newActor = CameraActor::New();
+ DALI_TEST_CHECK( newActor );
+
+ task.SetCameraActor( newActor );
+ DALI_TEST_CHECK( task.GetCameraActor() != actor );
+ DALI_TEST_CHECK( task.GetCameraActor() == newActor );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskGetCameraActor(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::GetCameraActor()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ RenderTask task = taskList.GetTask( 0u );
+
+ Actor actor = task.GetCameraActor();
+ DALI_TEST_CHECK( actor );
+
+ RenderTask newTask = taskList.CreateTask();
+ DALI_TEST_CHECK( actor == newTask.GetCameraActor() );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskSetTargetFrameBuffer(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::SetTargetFrameBuffer()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ RenderTask task = taskList.GetTask( 0u );
+
+ // By default render-tasks do not render off-screen
+ FrameBufferImage image = task.GetTargetFrameBuffer();
+ DALI_TEST_CHECK( !image );
+
+ FrameBufferImage newImage = FrameBufferImage::New();
+
+ task.SetTargetFrameBuffer( newImage );
+ DALI_TEST_CHECK( task.GetTargetFrameBuffer() == newImage );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskGetTargetFrameBuffer(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::GetTargetFrameBuffer()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ RenderTask task = taskList.GetTask( 0u );
+
+ // By default render-tasks do not render off-screen
+ FrameBufferImage image = task.GetTargetFrameBuffer();
+ DALI_TEST_CHECK( !image );
+
+ RenderTask newTask = taskList.CreateTask();
+ DALI_TEST_CHECK( !newTask.GetTargetFrameBuffer() );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskSetScreenToFrameBufferFunction(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::SetScreenToFrameBufferFunction()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ RenderTask task = taskList.GetTask( 0u );
+
+ task.SetScreenToFrameBufferFunction( TestScreenToFrameBufferFunction );
+
+ Vector2 coordinates( 5, 10 );
+ Vector2 convertedCoordinates( 6, 12 ); // + Vector(1, 2)
+
+ RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
+ DALI_TEST_CHECK( func( coordinates ) );
+ DALI_TEST_CHECK( coordinates == convertedCoordinates );
+
+ task.SetScreenToFrameBufferFunction( RenderTask::FULLSCREEN_FRAMEBUFFER_FUNCTION );
+ func = task.GetScreenToFrameBufferFunction();
+ DALI_TEST_CHECK( func( coordinates ) );
+
+ task.SetScreenToFrameBufferFunction( RenderTask::DEFAULT_SCREEN_TO_FRAMEBUFFER_FUNCTION );
+ func = task.GetScreenToFrameBufferFunction();
+ DALI_TEST_CHECK( ! func( coordinates ) );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskGetScreenToFrameBufferFunction(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::GetScreenToFrameBufferFunction()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ RenderTask task = taskList.GetTask( 0u );
+
+ Vector2 originalCoordinates( 5, 10 );
+ Vector2 coordinates( 5, 10 );
+
+ RenderTask::ScreenToFrameBufferFunction func = task.GetScreenToFrameBufferFunction();
+ DALI_TEST_CHECK( !func( coordinates ) ); // conversion should fail by default
+ DALI_TEST_CHECK( coordinates == originalCoordinates ); // coordinates should not be modified
+ END_TEST;
+}
+
+
+int UtcDaliRenderTaskGetScreenToFrameBufferMappingActor(void)
+{
+ TestApplication application;
+ tet_infoline("Testing RenderTask::GetScreenToFrameBufferMappingActor ");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+ RenderTask renderTask = taskList.CreateTask();
+ Actor mappingActor = Actor::New();
+ renderTask.SetScreenToFrameBufferMappingActor(mappingActor);
+
+ DALI_TEST_CHECK( mappingActor == renderTask.GetScreenToFrameBufferMappingActor() );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskSetViewport(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::SetViewport()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ RenderTask task = taskList.GetTask( 0u );
+
+ Viewport viewport = task.GetViewport();
+
+ // By default the viewport should match the stage width/height
+
+ Vector2 stageSize = Stage::GetCurrent().GetSize();
+ Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
+ DALI_TEST_CHECK( viewport == expectedViewport );
+
+ Viewport newViewport( 0, 0, stageSize.width * 0.5f, stageSize.height * 0.5f );
+ task.SetViewport( newViewport );
+
+ // Update (viewport is a property)
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK( task.GetViewport() == newViewport );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskGetViewport(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::GetViewport()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ RenderTask task = taskList.GetTask( 0u );
+
+ Viewport viewport = task.GetViewport();
+
+ // By default the viewport should match the stage width/height
+
+ Vector2 stageSize = Stage::GetCurrent().GetSize();
+ Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
+ DALI_TEST_CHECK( viewport == expectedViewport );
+
+ RenderTask newTask = taskList.CreateTask();
+ DALI_TEST_CHECK( newTask.GetViewport() == expectedViewport );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskSetViewportPosition(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::SetViewportPosition()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ RenderTask task = taskList.GetTask( 0u );
+
+ Viewport viewport = task.GetViewport();
+
+ // By default the viewport should match the stage width/height
+
+ Vector2 stageSize = Stage::GetCurrent().GetSize();
+ Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
+ DALI_TEST_CHECK( viewport == expectedViewport );
+
+ // 'Setter' test
+ Vector2 newPosition(25.0f, 50.0f);
+ task.SetViewportPosition( newPosition );
+
+ // Update (viewport is a property)
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition, Math::MACHINE_EPSILON_1, TEST_LOCATION );
+
+ // Set by Property test
+ Vector2 newPosition2(32.0f, 32.0f);
+ task.SetProperty( RenderTask::VIEWPORT_POSITION, newPosition2 );
+
+ // Update
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition2, Math::MACHINE_EPSILON_1, TEST_LOCATION );
+
+ Vector2 newPosition3(64.0f, 0.0f);
+ Animation animation = Animation::New(1.0f);
+ animation.AnimateTo( Property( task, RenderTask::VIEWPORT_POSITION ), newPosition3, AlphaFunctions::Linear );
+ animation.Play();
+
+ // Perform 1000ms worth of updates at which point animation should have completed.
+ Wait(application, 1000);
+ DALI_TEST_EQUALS( task.GetCurrentViewportPosition(), newPosition3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskSetViewportSize(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::SetViewportSize()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ RenderTask task = taskList.GetTask( 0u );
+
+ Viewport viewport = task.GetViewport();
+
+ // By default the viewport should match the stage width/height
+
+ Vector2 stageSize = Stage::GetCurrent().GetSize();
+ Viewport expectedViewport( 0, 0, stageSize.width, stageSize.height );
+ DALI_TEST_CHECK( viewport == expectedViewport );
+
+ Vector2 newSize(128.0f, 64.0f);
+ task.SetViewportSize( newSize );
+
+ // Update (viewport is a property)
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize, Math::MACHINE_EPSILON_1, TEST_LOCATION );
+
+ // Set by Property test
+ Vector2 newSize2(50.0f, 50.0f);
+ task.SetProperty( RenderTask::VIEWPORT_SIZE, newSize2 );
+
+ // Update
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize2, Math::MACHINE_EPSILON_1, TEST_LOCATION );
+
+ Vector2 newSize3(10.0f, 10.0f);
+ Animation animation = Animation::New(1.0f);
+ animation.AnimateTo( Property( task, RenderTask::VIEWPORT_SIZE ), newSize3, AlphaFunctions::Linear );
+ animation.Play();
+
+ // Perform 1000ms worth of updates at which point animation should have completed.
+ Wait(application, 1000);
+ DALI_TEST_EQUALS( task.GetCurrentViewportSize(), newSize3, Math::MACHINE_EPSILON_1, TEST_LOCATION );
+
+ END_TEST;
+}
+
+int UtcDaliRenderTaskSetClearColor(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::SetClearColor()");
+
+ Vector4 testColor( 1.0f, 2.0f, 3.0f, 4.0f );
+ Vector4 testColor2( 5.0f, 6.0f, 7.0f, 8.0f );
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ RenderTask task = taskList.GetTask( 0u );
+ DALI_TEST_CHECK( task.GetClearColor() != testColor );
+
+ task.SetClearColor( testColor );
+
+ // Wait a frame.
+ Wait(application);
+
+ DALI_TEST_EQUALS( task.GetClearColor(), testColor, TEST_LOCATION );
+
+ task.SetProperty( RenderTask::CLEAR_COLOR, testColor2 );
+
+ // Wait a frame.
+ Wait(application);
+
+ DALI_TEST_EQUALS( task.GetClearColor(), testColor2, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskGetClearColor(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::GetClearColor()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+ RenderTask task = taskList.GetTask( 0u );
+ DALI_TEST_EQUALS( task.GetClearColor(), RenderTask::DEFAULT_CLEAR_COLOR, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskSetClearEnabled(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::SetClearEnabled()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ RenderTask task = taskList.GetTask( 0u );
+ DALI_TEST_CHECK( !task.GetClearEnabled() ); // defaults to false
+
+ task.SetClearEnabled( true );
+ DALI_TEST_EQUALS( task.GetClearEnabled(), true, TEST_LOCATION );
+
+ task.SetClearEnabled( false );
+ DALI_TEST_EQUALS( task.GetClearEnabled(), false, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskGetClearEnabled(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::GetClearEnabled()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ RenderTask task = taskList.GetTask( 0u );
+ DALI_TEST_CHECK( !task.GetClearEnabled() ); // defaults to false
+ END_TEST;
+}
+
+int UtcDaliRenderTaskSetRefreshRate(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::SetRefreshRate()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ // By default tasks will be processed every frame
+ RenderTask task = taskList.GetTask( 0u );
+ DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
+
+ task.SetRefreshRate( 2u ); // every-other frame
+ DALI_TEST_CHECK( 2u == task.GetRefreshRate() );
+
+ task.SetRefreshRate( RenderTask::REFRESH_ALWAYS );
+ DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskGetRefreshRate(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::GetRefreshRate()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+
+ // By default tasks will be processed every frame
+ RenderTask task = taskList.GetTask( 0u );
+ DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == task.GetRefreshRate() );
+
+ RenderTask newTask = taskList.CreateTask();
+ DALI_TEST_CHECK( RenderTask::REFRESH_ALWAYS == newTask.GetRefreshRate() );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskSignalFinished(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask::SignalFinished()");
+
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+
+ Stage::GetCurrent().Add( offscreenCameraActor );
+
+ BitmapImage image = BitmapImage::New( 10, 10 );
+ ImageActor rootActor = ImageActor::New( image );
+ rootActor.SetSize( 10, 10 );
+ Stage::GetCurrent().Add( rootActor );
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+ NativeImagePtr testNativeImagePtr = new TestNativeImage(10, 10);
+ FrameBufferImage frameBufferImage = FrameBufferImage::New( *testNativeImagePtr.Get() );
+
+ // Flush all outstanding messages
+ application.SendNotification();
+ application.Render();
+
+ RenderTask newTask = taskList.CreateTask();
+ newTask.SetCameraActor( offscreenCameraActor );
+ newTask.SetSourceActor( rootActor );
+ newTask.SetInputEnabled( false );
+ newTask.SetClearColor( Vector4( 0.f, 0.f, 0.f, 0.f ) );
+ newTask.SetClearEnabled( true );
+ newTask.SetExclusive( true );
+ newTask.SetRefreshRate( RenderTask::REFRESH_ONCE );
+ newTask.SetTargetFrameBuffer( frameBufferImage );
+
+ // Framebuffer doesn't actually get created until Connected, i.e. by previous line
+
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+
+ // Flush the queue and render.
+ application.SendNotification();
+
+ // 1 render to process render task, then wait for sync before finished msg is sent
+ // from update to the event thread.
+
+ application.Render();
+ application.SendNotification();
+ DALI_TEST_CHECK( !finished );
+
+ Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
+ DALI_TEST_CHECK( lastSyncObj != NULL );
+
+ application.Render();
+ DALI_TEST_EQUALS( (application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
+ application.SendNotification();
+ DALI_TEST_CHECK( !finished );
+
+ application.Render();
+ DALI_TEST_EQUALS( (application.GetUpdateStatus() & Integration::KeepUpdating::RENDER_TASK_SYNC), Integration::KeepUpdating::RENDER_TASK_SYNC, TEST_LOCATION );
+ application.SendNotification();
+ DALI_TEST_CHECK( ! finished );
+
+ sync.SetObjectSynced( lastSyncObj, true );
+
+ application.Render();
+ application.SendNotification();
+ DALI_TEST_CHECK( !finished );
+
+ application.Render();
+ application.SendNotification();
+ DALI_TEST_CHECK( finished );
+ finished = false;
+
+ application.Render(); // Double check no more finished signal
+ application.SendNotification();
+ DALI_TEST_CHECK( ! finished );
+ END_TEST;
+}
+
+
+int UtcDaliRenderTaskContinuous01(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not staged)\nPOST:continuous renders, no Finished signal");
+
+ // SETUP AN OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // ADD SOURCE ACTOR TO STAGE - expect continuous renders to start, no finished signal
+ Stage::GetCurrent().Add(secondRootActor);
+ application.SendNotification();
+
+ // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ END_TEST;
+}
+
+
+int UtcDaliRenderTaskContinuous02(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (source actor not visible)\nPOST:continuous renders, no Finished signal");
+
+ // SETUP AN OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ Stage::GetCurrent().Add(secondRootActor);
+ secondRootActor.SetVisible(false);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // MAKE SOURCE ACTOR VISIBLE - expect continuous renders to start, no finished signal
+ secondRootActor.SetVisible(true);
+ application.SendNotification();
+
+ // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskContinuous03(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: render task not ready (camera actor not staged)\nPOST:continuous renders, no Finished signal");
+
+ // SETUP AN OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // ADD CAMERA ACTOR TO STAGE - expect continuous renders to start, no finished signal
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ application.SendNotification();
+
+ // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ END_TEST;
+}
+
+
+int UtcDaliRenderTaskContinuous04(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Continuous using loading image\nPRE: Resource not ready\nPOST:continuous renders, no Finished signal");
+
+ // SETUP AN OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // FINISH RESOURCE LOADING - expect continuous renders to start, no finished signal
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+
+ // CONTINUE PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskContinuous05(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Continuous, every 3 frames using loading image\nPRE: Resources not ready\nPOST:continuous renders, no Finished signal");
+
+ // SETUP AN OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, 3, true);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // FINISH RESOURCE LOADING - expect continuous renders to start, no finished signal
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskContinuous06(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Continuous, every 3 frames using loading image\nPRE: Render Always, Resources not ready\nPOST:continuous renders at reduced freq, no Finished signal");
+
+ // SETUP AN OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // FINISH RESOURCE LOADING - expect continuous renders to start, no finished signal
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+
+ // CHANGE FREQUENCY
+ newTask.SetRefreshRate(3); // Input, Expected Input, Expected
+ application.SendNotification();
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ newTask.SetRefreshRate(RenderTask::REFRESH_ALWAYS); // Should render every frame immediately
+ application.SendNotification();
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ END_TEST;
+}
+
+
+int UtcDaliRenderTaskOnce01(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Once GlSync, using loading image\nPRE: Resources not ready, Source not visible\nPOST: Finished signal sent once only");
+
+ // SETUP AN OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+
+ Stage::GetCurrent().Add(secondRootActor);
+ secondRootActor.SetVisible(false);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, true);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // MAKE SOURCE VISIBLE
+ secondRootActor.SetVisible(true);
+ application.SendNotification();
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // FINISH RESOURCE LOADING - expect no rendering yet
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
+ DALI_TEST_CHECK( lastSyncObj != NULL );
+
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ sync.SetObjectSynced( lastSyncObj, true );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+
+ // Finished rendering - expect no more renders, no more signals:
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskOnce02(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Once GlSync, using loading image. Switch from render always after ready to render once\n"
+ "PRE: Render task ready, Image not loaded\n"
+ "POST: Finished signal sent only once");
+
+ // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // FINISH RESOURCE LOADING
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+ application.SendNotification(); // Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
+ DALI_TEST_CHECK( lastSyncObj != NULL );
+
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ sync.SetObjectSynced( lastSyncObj, true );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+
+ // Finished rendering - expect no more renders, no more signals:
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ END_TEST;
+}
+
+
+int UtcDaliRenderTaskOnce03(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Once GlSync\n"
+ "Switch from Render always after ready to render once with resources unready\n"
+ "PRE: Everything ready to render\n"
+ "POST: Finished signal sent once");
+
+ // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // CHANGE TO RENDER ONCE
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+ application.SendNotification(); // Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // FINISH RESOURCE LOADING
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
+ DALI_TEST_CHECK( lastSyncObj != NULL );
+
+ sync.SetObjectSynced( lastSyncObj, true );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+
+ // Finished rendering - expect no more renders, no more signals:
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ END_TEST;
+}
+
+#if 0
+//int UtcDaliRenderTaskOnce04(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Once GlSync\n"
+ "During RenderOnce, make ready resources unready before sending first finished signal\n"
+ "PRE: Everything ready.\n"
+ "POST: Finished signal sent only once");
+
+ // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ application.Render();
+
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+
+ // CHANGE TO RENDER ONCE, RESOURCES BECOME NOT READY
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+
+ // Doesn't work...
+ ReloadImage(application, secondRootActor.GetImage());
+ application.SendNotification(); // Input, Expected Input, Expected
+
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_EQUALS( secondRootActor.GetImage().GetLoadingState(), Dali::ResourceLoading, TEST_LOCATION);
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // FINISH RESOURCE LOADING
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
+ DALI_TEST_CHECK( lastSyncObj != NULL );
+
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ sync.SetObjectSynced( lastSyncObj, true );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+
+ // Finished rendering - expect no more renders, no more signals:
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ END_TEST;
+}
+#endif
+
+int UtcDaliRenderTaskOnce05(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Once GLSync\n"
+ "Render once, Second call to SetRefreshRate(ONCE) triggers only one more finished signal\n"
+ "PRE: Everything ready\n"
+ "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
+
+ // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ application.Render();
+
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+
+ // CHANGE TO RENDER ONCE,
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+ application.SendNotification();
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
+ DALI_TEST_CHECK( lastSyncObj != NULL );
+
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ sync.SetObjectSynced( lastSyncObj, true );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+ application.SendNotification();
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ lastSyncObj = sync.GetLastSyncObject();
+ DALI_TEST_CHECK( lastSyncObj != NULL );
+
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ sync.SetObjectSynced( lastSyncObj, true );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskOnce06(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Once GLSync\n"
+ "Render once, Call to SetRefreshRate(ONCE) in Finished signal callback triggers "
+ "another render & another finished signal\n"
+ "PRE: Everything ready\n"
+ "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
+
+
+ // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ application.Render();
+
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
+ bool finished = false;
+
+ ConnectionTracker connectionTracker;
+ RenderTaskFinishedRenderAgain renderTaskFinishedRenderAgain( finished );
+ newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinishedRenderAgain );
+
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
+ DALI_TEST_CHECK( lastSyncObj == NULL );
+
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+
+ // CHANGE TO RENDER ONCE,
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+ application.SendNotification();
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ lastSyncObj = sync.GetLastSyncObject();
+ DALI_TEST_CHECK( lastSyncObj != NULL );
+
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ sync.SetObjectSynced( lastSyncObj, true );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+ application.SendNotification();
+
+ // Expect SetRefreshRate to have been called again
+ // Prevent next finished signal calling refresh once again
+ RenderTaskFinished renderTaskFinished( finished );
+ connectionTracker.DisconnectAll();
+ newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinished );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ lastSyncObj = sync.GetLastSyncObject();
+ DALI_TEST_CHECK( lastSyncObj != NULL );
+
+ sync.SetObjectSynced( lastSyncObj, true );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ END_TEST;
+}
+
+
+int UtcDaliRenderTaskOnce07(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Once GlSync\n"
+ "SetRefreshRate(ONCE) again before first finished signal has been sent.\n"
+ "PRE: resources ready\n"
+ "POST: Only 1 finished signal sent.");
+
+ // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ application.Render();
+
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+
+ // CHANGE TO RENDER ONCE,
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+ application.SendNotification();
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+ application.SendNotification();
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
+ DALI_TEST_CHECK( lastSyncObj != NULL );
+
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ sync.SetObjectSynced( lastSyncObj, true );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ END_TEST;
+}
+
+
+
+int UtcDaliRenderTaskOnce08(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Once GlSync\n"
+ "SetRefreshRate(ONCE), resource load failed completes render task.\n"
+ "PRE: resources not ready\n"
+ "POST: Only 1 finished signal sent.");
+
+ // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TestGlSyncAbstraction& sync = application.GetGlSyncAbstraction();
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, true);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // CHANGE TO RENDER ONCE,
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+ application.SendNotification();
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ FailImageLoad(application, imageRequestId); // Need to run Update again for this to complete
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) ); // nothing to draw
+ Integration::GlSyncAbstraction::SyncObject* lastSyncObj = sync.GetLastSyncObject();
+ DALI_TEST_CHECK( lastSyncObj != NULL );
+
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ sync.SetObjectSynced( lastSyncObj, true );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ END_TEST;
+}
+
+
+
+int UtcDaliRenderTaskOnceNoSync01(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Once, using loading image\nPRE: Resources not ready, Source not visible\nPOST: Finished signal sent once only");
+
+ // SETUP AN OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+
+ Stage::GetCurrent().Add(secondRootActor);
+ secondRootActor.SetVisible(false);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // MAKE SOURCE VISIBLE
+ secondRootActor.SetVisible(true);
+ application.SendNotification();
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // FINISH RESOURCE LOADING - expect immediate rendering yet
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskOnceNoSync02(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Once, using loading image. Switch from render always after ready to render once\n"
+ "PRE: Render task ready, Image not loaded\n"
+ "POST: Finished signal sent only once");
+
+ // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // FINISH RESOURCE LOADING
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+ application.SendNotification(); // Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ END_TEST;
+}
+
+
+int UtcDaliRenderTaskOnceNoSync03(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Once\n"
+ "Switch from Render always after ready to render once with resources unready\n"
+ "PRE: Everything ready to render\n"
+ "POST: Finished signal sent once");
+
+ // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // CHANGE TO RENDER ONCE
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+ application.SendNotification(); // Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // FINISH RESOURCE LOADING
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ END_TEST;
+}
+
+#if 0
+//int UtcDaliRenderTaskOnceNoSync04(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Once\n"
+ "During RenderOnce, make ready resources unready before sending first finished signal\n"
+ "PRE: Everything ready.\n"
+ "POST: Finished signal sent only once");
+
+ // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ application.Render();
+
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+
+ // CHANGE TO RENDER ONCE, RESOURCES BECOME NOT READY
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+
+ // Doesn't work...
+ ReloadImage(application, secondRootActor.GetImage());
+ application.SendNotification(); // Input, Expected Input, Expected
+
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_EQUALS( secondRootActor.GetImage().GetLoadingState(), Dali::ResourceLoading, TEST_LOCATION);
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // FINISH RESOURCE LOADING
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, true ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ END_TEST;
+}
+#endif
+
+int UtcDaliRenderTaskOnceNoSync05(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Once\n"
+ "Render once, Second call to SetRefreshRate(ONCE) triggers only one more finished signal\n"
+ "PRE: Everything ready\n"
+ "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
+
+ // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ application.Render();
+
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+
+ // CHANGE TO RENDER ONCE,
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+ application.SendNotification();
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+ application.SendNotification();
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskOnceNoSync06(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Once\n"
+ "Render once, Call to SetRefreshRate(ONCE) in Finished signal callback triggers\n"
+ "another render & another finished signal\n"
+ "PRE: Everything ready\n"
+ "POST: exactly 1 finished signal per call to SetRefreshRate(ONCE)");
+
+
+ // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ application.Render();
+
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
+ bool finished = false;
+
+ ConnectionTracker connectionTracker;
+ RenderTaskFinishedRenderAgain renderTaskFinishedRenderAgain( finished );
+ newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinishedRenderAgain );
+
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+
+ // CHANGE TO RENDER ONCE,
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+ application.SendNotification();
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+
+ // Expect SetRefreshRate to have been called again
+ // Prevent next finished signal calling refresh once again
+ RenderTaskFinished renderTaskFinished( finished );
+ connectionTracker.DisconnectAll();
+ newTask.FinishedSignal().Connect( &connectionTracker, renderTaskFinished );
+
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ END_TEST;
+}
+
+
+int UtcDaliRenderTaskOnceNoSync07(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Once\n"
+ "SetRefreshRate(ONCE) again before first finished signal has been sent.\n"
+ "PRE: resources ready\n"
+ "POST: Only 1 finished signal sent.");
+
+ // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ application.Render();
+
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+
+ // CHANGE TO RENDER ONCE,
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+ application.SendNotification();
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+ application.SendNotification();
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskOnceNoSync08(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Once\n"
+ "SetRefreshRate(ONCE), resource load failed, completes render task.\n"
+ "PRE: resources not ready\n"
+ "POST: Only 1 finished signal sent.");
+
+ // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor rootActor = Actor::New();
+ Stage::GetCurrent().Add( rootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor secondRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Stage::GetCurrent().Add(secondRootActor);
+
+ RenderTask newTask = CreateRenderTask(application, offscreenCameraActor, rootActor, secondRootActor, RenderTask::REFRESH_ALWAYS, false);
+ bool finished = false;
+ RenderTaskFinished renderTaskFinished( finished );
+ newTask.FinishedSignal().Connect( &application, renderTaskFinished );
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ // CHANGE TO RENDER ONCE,
+ newTask.SetRefreshRate(RenderTask::REFRESH_ONCE);
+ application.SendNotification();
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+
+ FailImageLoad(application, imageRequestId); // Need to run Update again for this to complete
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) ); // nothing to draw
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, true ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, finished, false ) );
+ END_TEST;
+}
+
+
+
+int UtcDaliRenderTaskOnceChain01(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTask Render Once Chained render tasks\n"
+ "SetRefreshRate(ONCE), resource load completes, both render tasks render.\n"
+ "PRE: resources not ready\n"
+ "POST: 2 finished signals sent.");
+
+ // SETUP A CONTINUOUS OFFSCREEN RENDER TASK
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE );
+ TraceCallStack& drawTrace = application.GetGlAbstraction().GetDrawTrace();
+ drawTrace.Enable(true);
+
+ Actor defaultRootActor = Actor::New(); // Root for default RT
+ Stage::GetCurrent().Add( defaultRootActor );
+
+ CameraActor offscreenCameraActor = CameraActor::New();
+ Stage::GetCurrent().Add( offscreenCameraActor );
+ ImageActor firstRootActor = CreateLoadingImage(application, "aFile.jpg", Image::Immediate, Image::Unused);
+ Integration::ResourceRequest* imageRequest = application.GetPlatform().GetRequest();
+ Integration::ResourceId imageRequestId = imageRequest->GetId();
+ Integration::ResourceTypeId imageType = imageRequest->GetType()->id;
+ Stage::GetCurrent().Add(firstRootActor);
+
+ // first render task
+ RenderTask firstTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, firstRootActor, RenderTask::REFRESH_ONCE, false);
+ bool firstFinished = false;
+ RenderTaskFinished renderTask1Finished( firstFinished );
+ firstTask.FinishedSignal().Connect( &application, renderTask1Finished );
+
+ // Second render task
+ FrameBufferImage fbo = firstTask.GetTargetFrameBuffer();
+ ImageActor secondRootActor = ImageActor::New( fbo );
+ Stage::GetCurrent().Add(secondRootActor);
+ RenderTask secondTask = CreateRenderTask(application, offscreenCameraActor, defaultRootActor, secondRootActor, RenderTask::REFRESH_ONCE, false);
+ bool secondFinished = false;
+ RenderTaskFinished renderTask2Finished( secondFinished );
+ secondTask.FinishedSignal().Connect( &application, renderTask2Finished );
+
+ application.SendNotification();
+
+ // START PROCESS/RENDER Input, Expected Input, Expected
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false ) );
+ DALI_TEST_CHECK( secondFinished == false );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false ) );
+ DALI_TEST_CHECK( secondFinished == false );
+
+ CompleteImageLoad(application, imageRequestId, imageType); // Need to run update again for this to complete
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, true, firstFinished, false ) );
+ DALI_TEST_CHECK( secondFinished == false );
+ application.GetPlatform().ClearReadyResources();
+
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, true ) );
+ DALI_TEST_CHECK( secondFinished == true );
+
+ secondFinished = false;
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, false ) );
+ DALI_TEST_CHECK( secondFinished == false );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, false ) );
+ DALI_TEST_CHECK( secondFinished == false );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, false ) );
+ DALI_TEST_CHECK( secondFinished == false );
+ DALI_TEST_CHECK( UpdateRender(application, drawTrace, false, firstFinished, false ) );
+ DALI_TEST_CHECK( secondFinished == false );
+
+ END_TEST;
+}
+
+int UtcDaliRenderTaskProperties(void)
+{
+ TestApplication application;
+
+ RenderTask task = Stage::GetCurrent().GetRenderTaskList().CreateTask();
+
+ Property::IndexContainer indices;
+ task.GetPropertyIndices( indices );
+ DALI_TEST_CHECK( ! indices.empty() );
+ DALI_TEST_EQUALS( indices.size(), task.GetPropertyCount(), TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_render_task_list_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_render_task_list_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+int UtcDaliRenderTaskListDefaultConstructor(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTaskList::RenderTaskList()");
+
+ RenderTaskList taskList;
+
+ DALI_TEST_CHECK( ! taskList );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskListDownCast(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTaskList::DownCast()");
+
+ BaseHandle base = Stage::GetCurrent().GetRenderTaskList();
+
+ RenderTaskList taskList = RenderTaskList::DownCast( base );
+
+ DALI_TEST_CHECK( taskList );
+
+ // Try calling a method
+ DALI_TEST_CHECK( 1u == taskList.GetTaskCount() );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskListCreateTask(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTaskList::CreateTask()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+ DALI_TEST_CHECK( 1u == taskList.GetTaskCount() );
+
+ taskList.CreateTask();
+ DALI_TEST_CHECK( 2u == taskList.GetTaskCount() );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskListRemoveTask(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTaskList::RemoveTask()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+ DALI_TEST_CHECK( 1u == taskList.GetTaskCount() );
+
+ RenderTask newTask = taskList.CreateTask();
+ DALI_TEST_CHECK( 2u == taskList.GetTaskCount() );
+
+ taskList.RemoveTask( newTask );
+ DALI_TEST_CHECK( 1u == taskList.GetTaskCount() );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskListGetTaskCount(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTaskList::GetTaskCount()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+ DALI_TEST_CHECK( 1u == taskList.GetTaskCount() );
+
+ taskList.RemoveTask( taskList.GetTask(0u) );
+ DALI_TEST_CHECK( 0u == taskList.GetTaskCount() );
+ END_TEST;
+}
+
+int UtcDaliRenderTaskListGetTask(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing RenderTaskList::GetTask()");
+
+ RenderTaskList taskList = Stage::GetCurrent().GetRenderTaskList();
+ RenderTask defaultTask = taskList.GetTask( 0u );
+ DALI_TEST_CHECK( 1u == taskList.GetTaskCount() );
+ DALI_TEST_CHECK( defaultTask );
+ DALI_TEST_CHECK( defaultTask == taskList.GetTask( 0u ) );
+
+ RenderTask newTask = taskList.CreateTask();
+ DALI_TEST_CHECK( 2u == taskList.GetTaskCount() );
+
+ RenderTask temp = taskList.GetTask( 0u );
+ RenderTask temp2 = taskList.GetTask( 1u );
+
+ DALI_TEST_CHECK( newTask );
+ DALI_TEST_CHECK( defaultTask != newTask );
+ DALI_TEST_CHECK( taskList.GetTask( 0u ) == defaultTask );
+ DALI_TEST_CHECK( taskList.GetTask( 1u ) == newTask );
+ DALI_TEST_CHECK( taskList.GetTask( 1u ) != defaultTask );
+
+ taskList.RemoveTask( taskList.GetTask(0u) );
+ DALI_TEST_CHECK( 1u == taskList.GetTaskCount() );
+ DALI_TEST_CHECK( taskList.GetTask( 0u ) != defaultTask );
+ DALI_TEST_CHECK( taskList.GetTask( 0u ) == newTask );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+
+#include <dali/integration-api/events/touch-event-integ.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+using namespace std;
+
+void renderable_actor_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void renderable_actor_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+static const char* TestTextHelloWorld = "Hello World";
+static bool gIsActor1SortModifierCorrect;
+static bool gIsActor2SortModifierCorrect;
+const float gActor1SortModifierValue = 96.0f;
+const float gActor2SortModifierValue = 53.0f;
+
+static float TestSortFunction(const Vector3& position, float sortModifier)
+{
+ if ( fabs(sortModifier - gActor1SortModifierValue) < 0.01)
+ gIsActor1SortModifierCorrect = true;
+
+ if ( fabs(sortModifier - gActor2SortModifierValue) < 0.01)
+ gIsActor2SortModifierCorrect = true;
+
+ return 0.0f;
+}
+
+} // anon namespace
+
+int UtcDaliRenderableActorDownCast(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::RenderableActor::DownCast()");
+
+ TextActor textActor = TextActor::New(TestTextHelloWorld);
+
+ Actor anActor = Actor::New();
+ anActor.Add( textActor );
+
+ Actor child = anActor.GetChildAt(0);
+ RenderableActor renderableActor = RenderableActor::DownCast( child );
+ DALI_TEST_CHECK( renderableActor );
+
+ renderableActor = NULL;
+ DALI_TEST_CHECK( !renderableActor );
+
+ renderableActor = DownCast< RenderableActor >( child );
+ DALI_TEST_CHECK( renderableActor );
+
+ renderableActor = DownCast< RenderableActor >( anActor );
+ DALI_TEST_CHECK( !renderableActor );
+
+ Actor unInitialzedActor;
+ renderableActor = RenderableActor::DownCast( unInitialzedActor );
+ DALI_TEST_CHECK( !renderableActor );
+
+ renderableActor = DownCast< RenderableActor >( unInitialzedActor );
+ DALI_TEST_CHECK( !renderableActor );
+ END_TEST;
+}
+
+int UtcDaliRenderableActorSetSortModifier(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::RenderableActor::SetSortModifier()");
+
+ float val = -500.0f;
+
+ TextActor actor = TextActor::New(TestTextHelloWorld);
+ Stage::GetCurrent().Add(actor);
+
+ actor.SetSortModifier( val );
+
+ float returnValue = actor.GetSortModifier();
+
+ //Verify through actor api
+ DALI_TEST_EQUALS(returnValue, val, TEST_LOCATION);
+
+ Stage::GetCurrent().Remove(actor);
+
+
+ //Verify through layer SetSortFunction
+ gIsActor1SortModifierCorrect = false;
+ gIsActor2SortModifierCorrect = false;
+ BitmapImage img = BitmapImage::New( 1,1 );
+ // create two transparent actors so there is something to sort
+ ImageActor actor1 = ImageActor::New( img );
+ ImageActor actor2 = ImageActor::New( img );
+ actor1.SetSize(1,1);
+ actor1.SetPosition( 0, 0, 0);
+ actor1.SetSortModifier( gActor1SortModifierValue );
+ actor1.SetColor( Vector4(1, 1, 1, 0.5f ) ); // 50% transparent
+ actor2.SetSize(1,1);
+ actor2.SetPosition( 0, 0, 1);
+ actor2.SetSortModifier( gActor2SortModifierValue );
+ actor2.SetColor( Vector4(1, 1, 1, 0.5f ) ); // 50% transparent
+
+ // add to stage
+ Stage::GetCurrent().Add( actor1 );
+ Stage::GetCurrent().Add( actor2 );
+
+ Layer root = Stage::GetCurrent().GetLayer( 0 );
+ root.SetSortFunction( TestSortFunction );
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK( gIsActor1SortModifierCorrect && gIsActor2SortModifierCorrect );
+ END_TEST;
+
+}
+
+int UtcDaliRenderableActorGetSortModifier(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::RenderableActor::GetSortModifier()");
+
+ TextActor actor = TextActor::New(TestTextHelloWorld);
+ Stage::GetCurrent().Add(actor);
+
+ DALI_TEST_EQUALS(actor.GetSortModifier(), 0.0f, TEST_LOCATION);
+
+ Stage::GetCurrent().Remove(actor);
+ END_TEST;
+}
+
+int UtcDaliRenderableActorSetGetBlendMode(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::RenderableActor::SetBlendMode() / Dali::RenderableActor::GetBlendMode()");
+
+ TextActor actor = TextActor::New(TestTextHelloWorld);
+
+ actor.SetBlendMode( BlendingMode::OFF );
+ DALI_TEST_CHECK( BlendingMode::OFF == actor.GetBlendMode() );
+
+ actor.SetBlendMode( BlendingMode::AUTO );
+ DALI_TEST_CHECK( BlendingMode::AUTO == actor.GetBlendMode() );
+
+ actor.SetBlendMode( BlendingMode::ON );
+ DALI_TEST_CHECK( BlendingMode::ON == actor.GetBlendMode() );
+ END_TEST;
+}
+
+int UtcDaliRenderableActorSetCullFace(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::RenderableActor::SetCullFace()");
+
+ BitmapImage img = BitmapImage::New( 1,1 );
+ ImageActor actor = ImageActor::New( img );
+ ImageActor actor2 = ImageActor::New( img );
+
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetParentOrigin(ParentOrigin::CENTER);
+ actor.SetAnchorPoint(AnchorPoint::CENTER);
+
+ actor2.SetSize(100.0f, 100.0f);
+ actor2.SetParentOrigin(ParentOrigin::CENTER);
+ actor2.SetAnchorPoint(AnchorPoint::CENTER);
+
+ Stage::GetCurrent().Add(actor);
+ Stage::GetCurrent().Add(actor2);
+
+ //Verify whether the correct GL calls are made when actor is face culled in front and back, and
+ // face culling is disabled for actor2
+ TraceCallStack& cullFaceTrace = application.GetGlAbstraction().GetCullFaceTrace();
+ cullFaceTrace.Enable(true);
+ actor.SetCullFace( CullFrontAndBack );
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ cullFaceTrace.Enable(false);
+ std::stringstream out;
+
+ //Verify actor gl state
+ out.str("");
+ out << GL_BLEND;
+ DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(0, "Enable", out.str()), true, TEST_LOCATION);
+
+ out.str("");
+ out << GL_CULL_FACE;
+ DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(1, "Enable", out.str()), true, TEST_LOCATION);
+
+ out.str("");
+ out << GL_FRONT_AND_BACK;
+ DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(2, "CullFace", out.str()), true, TEST_LOCATION);
+
+ //Verify actor2 gl state
+ out.str("");
+ out << GL_CULL_FACE;
+ DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(3, "Disable", out.str()), true, TEST_LOCATION);
+
+ //Verify state through the actor api
+ DALI_TEST_CHECK( CullFrontAndBack == actor.GetCullFace() );
+ DALI_TEST_CHECK( CullNone == actor2.GetCullFace() );
+
+ /**************************************************************/
+
+ //Verify whether the correct GL calls are made when actor2 is face culled in the front
+ cullFaceTrace.Reset();
+ cullFaceTrace.Enable(true);
+ actor2.SetCullFace( CullFront );
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ cullFaceTrace.Enable(false);
+
+ //Verify actor gl state
+ out.str("");
+ out << GL_CULL_FACE;
+ DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(0, "Enable", out.str()), true, TEST_LOCATION);
+
+ out.str("");
+ out << GL_FRONT_AND_BACK;
+ DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(1, "CullFace", out.str()), true, TEST_LOCATION);
+
+ //Verify actor2 gl state
+ out.str("");
+ out << GL_CULL_FACE;
+ DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(2, "Enable", out.str()), true, TEST_LOCATION);
+
+ out.str("");
+ out << GL_FRONT;
+ DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(3, "CullFace", out.str()), true, TEST_LOCATION);
+
+ //Verify state through the actor api
+ DALI_TEST_CHECK( CullFrontAndBack == actor.GetCullFace() );
+ DALI_TEST_CHECK( CullFront == actor2.GetCullFace() );
+
+ /**************************************************************/
+ //Verify whether the correct GL calls are made when face culling is disabled for both actors
+ cullFaceTrace.Reset();
+ cullFaceTrace.Enable(true);
+ actor.SetCullFace( CullNone );
+ actor2.SetCullFace( CullNone );
+
+ // flush the queue and render once
+ application.SendNotification();
+ application.Render();
+
+ cullFaceTrace.Enable(false);
+
+ out.str("");
+ out << GL_CULL_FACE;
+ DALI_TEST_EQUALS( cullFaceTrace.TestMethodAndParams(0, "Disable", out.str()), true, TEST_LOCATION);
+
+ //Verify state through the actor api
+ DALI_TEST_CHECK( CullNone == actor.GetCullFace() );
+ DALI_TEST_CHECK( CullNone == actor2.GetCullFace() );
+
+ Stage::GetCurrent().Remove(actor);
+ Stage::GetCurrent().Remove(actor2);
+ END_TEST;
+}
+
+int UtcDaliRenderableActorGetCullFace(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::RenderableActor::GetCullFace()");
+
+ TextActor textActor = TextActor::New(TestTextHelloWorld);
+
+ DALI_TEST_CHECK( CullNone == textActor.GetCullFace() );
+
+ ImageActor imageActor = ImageActor::New();
+
+ DALI_TEST_CHECK( CullNone == imageActor.GetCullFace() );
+
+ MeshActor meshActor = MeshActor::New();
+
+ DALI_TEST_CHECK( CullBack == meshActor.GetCullFace() );
+ END_TEST;
+}
+
+int UtcDaliRenderableActorSetGetBlendFunc(void)
+{
+ TestApplication application;
+ TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
+
+ tet_infoline("Testing Dali::RenderableActor::UtcDaliRenderableActorSetGetBlendFunc()");
+
+ BitmapImage img = BitmapImage::New( 1,1 );
+ ImageActor actor = ImageActor::New( img );
+ Stage::GetCurrent().Add( actor );
+ application.SendNotification();
+ application.Render();
+
+ // Test the defaults as documented int blending.h
+ {
+ BlendingFactor::Type srcFactorRgb( BlendingFactor::ZERO );
+ BlendingFactor::Type destFactorRgb( BlendingFactor::ZERO );
+ BlendingFactor::Type srcFactorAlpha( BlendingFactor::ZERO );
+ BlendingFactor::Type destFactorAlpha( BlendingFactor::ZERO );
+ actor.GetBlendFunc( srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha );
+ DALI_TEST_EQUALS( BlendingFactor::SRC_ALPHA, srcFactorRgb, TEST_LOCATION );
+ DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_SRC_ALPHA, destFactorRgb, TEST_LOCATION );
+ DALI_TEST_EQUALS( BlendingFactor::ONE, srcFactorAlpha, TEST_LOCATION );
+ DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_SRC_ALPHA, destFactorAlpha, TEST_LOCATION );
+ }
+
+ // Set to non-default values
+ actor.SetBlendFunc( BlendingFactor::ONE_MINUS_SRC_COLOR, BlendingFactor::SRC_ALPHA_SATURATE );
+
+ // Test that Set was successful
+ {
+ BlendingFactor::Type srcFactorRgb( BlendingFactor::ZERO );
+ BlendingFactor::Type destFactorRgb( BlendingFactor::ZERO );
+ BlendingFactor::Type srcFactorAlpha( BlendingFactor::ZERO );
+ BlendingFactor::Type destFactorAlpha( BlendingFactor::ZERO );
+ actor.GetBlendFunc( srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha );
+ DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_SRC_COLOR, srcFactorRgb, TEST_LOCATION );
+ DALI_TEST_EQUALS( BlendingFactor::SRC_ALPHA_SATURATE, destFactorRgb, TEST_LOCATION );
+ DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_SRC_COLOR, srcFactorAlpha, TEST_LOCATION );
+ DALI_TEST_EQUALS( BlendingFactor::SRC_ALPHA_SATURATE, destFactorAlpha, TEST_LOCATION );
+ }
+
+ // Render & check GL commands
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( (GLenum)GL_ONE_MINUS_SRC_COLOR, glAbstraction.GetLastBlendFuncSrcRgb(), TEST_LOCATION );
+ DALI_TEST_EQUALS( (GLenum)GL_SRC_ALPHA_SATURATE, glAbstraction.GetLastBlendFuncDstRgb(), TEST_LOCATION );
+ DALI_TEST_EQUALS( (GLenum)GL_ONE_MINUS_SRC_COLOR, glAbstraction.GetLastBlendFuncSrcAlpha(), TEST_LOCATION );
+ DALI_TEST_EQUALS( (GLenum)GL_SRC_ALPHA_SATURATE, glAbstraction.GetLastBlendFuncDstAlpha(), TEST_LOCATION );
+
+ // Set using separate alpha settings
+ actor.SetBlendFunc( BlendingFactor::CONSTANT_COLOR, BlendingFactor::ONE_MINUS_CONSTANT_COLOR,
+ BlendingFactor::CONSTANT_ALPHA, BlendingFactor::ONE_MINUS_CONSTANT_ALPHA );
+
+ // Test that Set was successful
+ {
+ BlendingFactor::Type srcFactorRgb( BlendingFactor::ZERO );
+ BlendingFactor::Type destFactorRgb( BlendingFactor::ZERO );
+ BlendingFactor::Type srcFactorAlpha( BlendingFactor::ZERO );
+ BlendingFactor::Type destFactorAlpha( BlendingFactor::ZERO );
+ actor.GetBlendFunc( srcFactorRgb, destFactorRgb, srcFactorAlpha, destFactorAlpha );
+ DALI_TEST_EQUALS( BlendingFactor::CONSTANT_COLOR, srcFactorRgb, TEST_LOCATION );
+ DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_CONSTANT_COLOR, destFactorRgb, TEST_LOCATION );
+ DALI_TEST_EQUALS( BlendingFactor::CONSTANT_ALPHA, srcFactorAlpha, TEST_LOCATION );
+ DALI_TEST_EQUALS( BlendingFactor::ONE_MINUS_CONSTANT_ALPHA, destFactorAlpha, TEST_LOCATION );
+ }
+
+ // Render & check GL commands
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( (GLenum)GL_CONSTANT_COLOR, glAbstraction.GetLastBlendFuncSrcRgb(), TEST_LOCATION );
+ DALI_TEST_EQUALS( (GLenum)GL_ONE_MINUS_CONSTANT_COLOR, glAbstraction.GetLastBlendFuncDstRgb(), TEST_LOCATION );
+ DALI_TEST_EQUALS( (GLenum)GL_CONSTANT_ALPHA, glAbstraction.GetLastBlendFuncSrcAlpha(), TEST_LOCATION );
+ DALI_TEST_EQUALS( (GLenum)GL_ONE_MINUS_CONSTANT_ALPHA, glAbstraction.GetLastBlendFuncDstAlpha(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliRenderableActorSetGetBlendEquation(void)
+{
+ TestApplication application;
+ TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
+
+ tet_infoline("Testing Dali::RenderableActor::SetBlendEquation()");
+
+ BitmapImage img = BitmapImage::New( 1,1 );
+ ImageActor actor = ImageActor::New( img );
+ Stage::GetCurrent().Add( actor );
+ application.SendNotification();
+ application.Render();
+
+ // Test the defaults as documented int blending.h
+ {
+ BlendingEquation::Type equationRgb( BlendingEquation::SUBTRACT );
+ BlendingEquation::Type equationAlpha( BlendingEquation::SUBTRACT );
+ actor.GetBlendEquation( equationRgb, equationAlpha );
+ DALI_TEST_EQUALS( BlendingEquation::ADD, equationRgb, TEST_LOCATION );
+ DALI_TEST_EQUALS( BlendingEquation::ADD, equationAlpha, TEST_LOCATION );
+ }
+
+ // Test the single blending equation setting
+ {
+ actor.SetBlendEquation( BlendingEquation::REVERSE_SUBTRACT );
+ BlendingEquation::Type equationRgba( BlendingEquation::SUBTRACT );
+ actor.GetBlendEquation( equationRgba, equationRgba );
+ DALI_TEST_EQUALS( BlendingEquation::REVERSE_SUBTRACT, equationRgba, TEST_LOCATION );
+ }
+
+ actor.SetBlendEquation( BlendingEquation::REVERSE_SUBTRACT, BlendingEquation::REVERSE_SUBTRACT );
+
+ // Test that Set was successful
+ {
+ BlendingEquation::Type equationRgb( BlendingEquation::SUBTRACT );
+ BlendingEquation::Type equationAlpha( BlendingEquation::SUBTRACT );
+ actor.GetBlendEquation( equationRgb, equationAlpha );
+ DALI_TEST_EQUALS( BlendingEquation::REVERSE_SUBTRACT, equationRgb, TEST_LOCATION );
+ DALI_TEST_EQUALS( BlendingEquation::REVERSE_SUBTRACT, equationAlpha, TEST_LOCATION );
+ }
+
+ // Render & check GL commands
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( (GLenum)GL_FUNC_REVERSE_SUBTRACT, glAbstraction.GetLastBlendEquationRgb(), TEST_LOCATION );
+ DALI_TEST_EQUALS( (GLenum)GL_FUNC_REVERSE_SUBTRACT, glAbstraction.GetLastBlendEquationAlpha(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliRenderableActorSetGetBlendColor(void)
+{
+ TestApplication application;
+ TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
+
+ tet_infoline("Testing Dali::RenderableActor::SetBlendColor()");
+
+ BitmapImage img = BitmapImage::New( 1,1 );
+ ImageActor actor = ImageActor::New( img );
+ Stage::GetCurrent().Add( actor );
+ application.SendNotification();
+ application.Render();
+
+ // Test the defaults as documented int blending.h
+ DALI_TEST_EQUALS( Vector4::ZERO, actor.GetBlendColor(), TEST_LOCATION );
+
+ actor.SetBlendColor( Color::RED );
+
+ // Test that Set was successful
+ DALI_TEST_EQUALS( Color::RED, actor.GetBlendColor(), TEST_LOCATION );
+
+ // Render & check GL commands
+ application.SendNotification();
+ application.Render();
+ DALI_TEST_EQUALS( Color::RED, glAbstraction.GetLastBlendColor(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliRenderableActorSetGetAlpha(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::RenderableActor::SetGetAlpha()");
+
+ BitmapImage img = BitmapImage::New( 1,1 );
+ ImageActor actor = ImageActor::New( img );
+ Stage::GetCurrent().Add( actor );
+ application.SendNotification();
+ application.Render();
+
+ // use the image alpha on actor
+ actor.SetBlendMode(BlendingMode::ON);
+
+ // Test that Set was successful
+ DALI_TEST_EQUALS( BlendingMode::ON, actor.GetBlendMode(), TEST_LOCATION );
+
+ // Now test that it can be set to false
+ actor.SetBlendMode(BlendingMode::OFF);
+ DALI_TEST_EQUALS(BlendingMode::OFF, actor.GetBlendMode(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliRenderableActorCreateDestroy(void)
+{
+ tet_infoline("Testing Dali::RenderableActor::CreateDestroy()");
+ RenderableActor* ractor = new RenderableActor;
+ RenderableActor ractor2( *ractor );
+ DALI_TEST_CHECK( ractor );
+ delete ractor;
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_shader_effect_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_shader_effect_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+static const char* VertexSource =
+"void main()\n"
+"{\n"
+" gl_Position = uProjection * uModelView * vec4(aPosition, 1.0);\n"
+" vTexCoord = aTexCoord;\n"
+"}\n";
+
+static const char* FragmentSource =
+"void main()\n"
+"{\n"
+" gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n"
+"}\n";
+
+static const char* FragmentSourceUsingExtensions =
+"void main()\n"
+"{\n"
+" float floatValue = 0.5f;\n"
+" float test = fwidth(floatValue);\n"
+" gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n"
+" gl_FragColor.a *= test;\n"
+"}\n";
+
+const int GETSOURCE_BUFFER_SIZE = 0x10000;
+
+
+struct TestConstraintToVector3
+{
+ TestConstraintToVector3(Vector3 target)
+ : mTarget(target)
+ {
+ }
+
+ Vector3 operator()(const Vector3& current)
+ {
+ return mTarget;
+ }
+
+ Vector3 mTarget;
+};
+
+struct TestConstraintFromPositionToVector3
+{
+ TestConstraintFromPositionToVector3()
+ {
+ }
+
+ Vector3 operator()(const Vector3& current, const PropertyInput& position)
+ {
+
+ return position.GetVector3();
+ }
+};
+
+struct TestConstraintToVector3Double
+{
+ TestConstraintToVector3Double(Vector3 target)
+ : mTarget(target)
+ {
+ }
+
+ Vector3 operator()(const Vector3& current)
+ {
+ return mTarget * 2.0f;
+ }
+
+ Vector3 mTarget;
+};
+
+class ShaderEffectExtension : public ShaderEffect::Extension {};
+
+
+class TestExtension : public ShaderEffect::Extension
+{
+public:
+ TestExtension( bool& deleted )
+ : mDeleted(deleted)
+ {
+ mDeleted = false;
+ }
+ ~TestExtension()
+ {
+ mDeleted = true;
+ }
+ bool IsAlive() const
+ {
+ return !mDeleted;
+ }
+private:
+ bool& mDeleted;
+};
+
+} // anon namespace
+
+
+int UtcDaliShaderEffectMethodNew01(void)
+{
+ TestApplication application;
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK(effect);
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodNew02(void)
+{
+ TestApplication application;
+
+ ShaderEffect effect;
+
+ try
+ {
+ // New must be called to create a ShaderEffect or it wont be valid.
+ effect.SetUniform( "uUniform", 0 );
+ DALI_TEST_CHECK( false );
+ }
+ catch (Dali::DaliException& e)
+ {
+ // Tests that a negative test of an assertion succeeds
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_CHECK( !effect );
+ }
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodNew03(void)
+{
+ TestApplication application;
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource, VertexSource, FragmentSource, ShaderEffect::HINT_NONE );
+ DALI_TEST_CHECK(effect);
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodNew04(void)
+{
+ TestApplication application;
+ tet_infoline("Testing prefixed version of Dali::ShaderEffect::New()");
+
+ std::string fragmentShaderPrefix = "#define TEST_FS 1\n#extension GL_OES_standard_derivatives : enable";
+ std::string vertexShaderPrefix = "#define TEST_VS 1";
+
+ try
+ {
+ // Call render to compile default shaders.
+ application.SendNotification();
+ application.Render();
+ application.Render();
+ application.Render();
+
+ GLuint lastShaderCompiledBefore = application.GetGlAbstraction().GetLastShaderCompiled();
+ ShaderEffect effect = ShaderEffect::NewWithPrefix( vertexShaderPrefix, VertexSource,
+ fragmentShaderPrefix, FragmentSourceUsingExtensions,
+ GEOMETRY_TYPE_IMAGE, ShaderEffect::HINT_NONE );
+
+ BitmapImage image = CreateBitmapImage();
+ ImageActor actor = ImageActor::New( image );
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("TestImageFilenameActor");
+ actor.SetShaderEffect(effect);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+ GLuint lastShaderCompiledAfter = application.GetGlAbstraction().GetLastShaderCompiled();
+ bool testResult = false;
+
+ // we should have compiled 4 shaders.
+ if (lastShaderCompiledAfter - lastShaderCompiledBefore == 4)
+ {
+ char testVertexSourceResult[GETSOURCE_BUFFER_SIZE];
+ char testFragmentSourceResult[GETSOURCE_BUFFER_SIZE];
+
+ // we are interested in the first two.
+ GLuint vertexShaderId = lastShaderCompiledBefore + 1;
+ GLuint fragmentShaderId = lastShaderCompiledBefore + 2;
+
+ GLsizei lengthVertexResult;
+ GLsizei lengthFragmentResult;
+
+ application.GetGlAbstraction().GetShaderSource(vertexShaderId, GETSOURCE_BUFFER_SIZE, &lengthVertexResult, testVertexSourceResult);
+ application.GetGlAbstraction().GetShaderSource(fragmentShaderId, GETSOURCE_BUFFER_SIZE, &lengthFragmentResult, testFragmentSourceResult);
+
+ int vertexShaderHasPrefix = strncmp(testVertexSourceResult, "#define ", strlen("#define "));
+ int fragmentShaderHasPrefix = strncmp(testFragmentSourceResult, "#define ", strlen("#define "));
+ testResult = (vertexShaderHasPrefix == 0) && (fragmentShaderHasPrefix == 0);
+ }
+
+ DALI_TEST_CHECK(testResult);
+ }
+ catch(Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ tet_result( TET_FAIL );
+ }
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodNew05(void)
+{
+ TestApplication application;
+
+ // heap constructor / destructor
+ DefaultFunctionCoverage<ShaderEffect> shaderEffect;
+ DefaultFunctionCoverage<ShaderEffectExtension> shaderEffectExtension;
+
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodNew06(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::ShaderEffect::New() with shader sources for different geometry types");
+
+ ShaderEffect effect = ShaderEffect::New( "imageVertexShader", "imageFragmentShader",
+ "textVertexShader", "textFragmentShader",
+ "texturedMeshVertexShader", "texturedMeshFragmentShader",
+ "meshVertexShader", "meshFragmentShader",
+ ShaderEffect::HINT_NONE );
+ DALI_TEST_CHECK(effect);
+ END_TEST;
+}
+
+
+int UtcDaliShaderEffectMethodDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::ShaderEffect::DownCast()");
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+
+ BaseHandle object(effect);
+
+ ShaderEffect effect2 = ShaderEffect::DownCast(object);
+ DALI_TEST_CHECK(effect2);
+
+ ShaderEffect effect3 = DownCast< ShaderEffect >(object);
+ DALI_TEST_CHECK(effect3);
+
+ BaseHandle unInitializedObject;
+ ShaderEffect effect4 = ShaderEffect::DownCast(unInitializedObject);
+ DALI_TEST_CHECK(!effect4);
+
+ ShaderEffect effect5 = DownCast< ShaderEffect >(unInitializedObject);
+ DALI_TEST_CHECK(!effect5);
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodDelete01(void)
+{
+ TestApplication application;
+
+ // Only want to test the first few characters
+ std::string customFontPrefixVertShader =
+ "\n"
+ " attribute mediump vec3 aPosition;\n"
+ " attribute mediump vec2 aTexCoord;\n";
+
+
+ // get the default shaders built, this is not required but makes it
+ // easier to debug the TET case and isolate the custom shader compilation.
+ application.SendNotification();
+ application.Render();
+
+ application.SendNotification();
+ application.Render();
+
+ // create a new shader effect
+ // the vertex and fragment shader will be cached in the ShaderFactory
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource);
+
+ // destroy the shader effect
+ effect.Reset();
+
+ // Create the same shader effect again, this should now use the cached version
+ // held in the shader factory
+ effect= ShaderEffect::New( VertexSource, FragmentSource );
+
+ // Compile the shader effect
+ application.SendNotification();
+ application.Render();
+
+ GLuint lastShaderCompiled = application.GetGlAbstraction().GetLastShaderCompiled();
+
+ // get the vertex shader (compiled before fragment shader).
+ // this last shaders compiled is for text.
+ GLuint vertexShaderId = lastShaderCompiled-1;
+ GLsizei lengthVertexResult;
+
+ char testVertexSourceResult[GETSOURCE_BUFFER_SIZE];
+ application.GetGlAbstraction().GetShaderSource(vertexShaderId, GETSOURCE_BUFFER_SIZE, &lengthVertexResult, testVertexSourceResult);
+
+ // compare the first 40 bytes of the vertex shader sent to be compiled, with
+ // the shader string that ended up being compiled (in the render task)
+ // this is to confirm the string hasn't been deleted / corrupted.
+ int testPassed = strncmp( testVertexSourceResult , customFontPrefixVertShader.c_str(), 40 ) ;
+
+ DALI_TEST_CHECK( testPassed == 0 );
+ END_TEST;
+
+}
+
+int UtcDaliShaderEffectMethodSetUniformFloat(void)
+{
+ TestApplication application;
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( effect );
+
+ BitmapImage image = CreateBitmapImage();
+
+ effect.SetUniform( "uFloat", 1.0f );
+
+ ImageActor actor = ImageActor::New( image );
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("TestImageFilenameActor");
+ actor.SetShaderEffect(effect);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(
+ application.GetGlAbstraction().CheckUniformValue(
+ "uFloat", 1.0f ) );
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodSetUniformVector2(void)
+{
+ TestApplication application;
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( effect );
+
+ BitmapImage image = CreateBitmapImage();
+
+ effect.SetUniform( "uVec2", Vector2( 2.0f, 3.0f ) );
+
+ ImageActor actor = ImageActor::New( image );
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("TestImageFilenameActor");
+ actor.SetShaderEffect(effect);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(
+ application.GetGlAbstraction().CheckUniformValue(
+ "uVec2", Vector2( 2.0f, 3.0f ) ) );
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodSetUniformVector3(void)
+{
+ TestApplication application;
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( effect );
+
+ BitmapImage image = CreateBitmapImage();
+
+ effect.SetUniform( "uVec3", Vector3( 4.0f, 5.0f, 6.0f ) );
+
+ ImageActor actor = ImageActor::New( image );
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("TestImageFilenameActor");
+ actor.SetShaderEffect(effect);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(
+ application.GetGlAbstraction().CheckUniformValue(
+ "uVec3", Vector3( 4.0f, 5.0f, 6.0f ) ) );
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodSetUniformVector4(void)
+{
+ TestApplication application;
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( effect );
+
+ BitmapImage image = CreateBitmapImage();
+
+ effect.SetUniform( "uVec4", Vector4( 7.0f, 8.0f, 9.0f, 10.0f ) );
+
+ ImageActor actor = ImageActor::New( image );
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("TestImageFilenameActor");
+ actor.SetShaderEffect(effect);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(
+ application.GetGlAbstraction().CheckUniformValue(
+ "uVec4", Vector4( 7.0f, 8.0f, 9.0f, 10.0f ) ) );
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodSetUniformMatrix(void)
+{
+ TestApplication application;
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( effect );
+
+ BitmapImage image = CreateBitmapImage();
+
+ effect.SetUniform( "uModelView", Matrix::IDENTITY );
+
+ ImageActor actor = ImageActor::New( image );
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("TestImageFilenameActor");
+ actor.SetShaderEffect(effect);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK(
+ application.GetGlAbstraction().CheckUniformValue(
+ "uModelView", Matrix::IDENTITY ) );
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodSetUniformMatrix3(void)
+{
+ TestApplication application;
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( effect );
+
+ BitmapImage image = CreateBitmapImage();
+
+ Matrix3 matIdentity(1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f);
+ effect.SetUniform( "uMatrix3", matIdentity );
+
+ ImageActor actor = ImageActor::New( image );
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("TestImageFilenameActor");
+ actor.SetShaderEffect(effect);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK( application.GetGlAbstraction().CheckUniformValue("uMatrix3", matIdentity) );
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodSetUniformViewport(void)
+{
+ TestApplication application;
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( effect );
+
+ BitmapImage image = CreateBitmapImage();
+
+ ImageActor actor = ImageActor::New( image );
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("TestImageFilenameActor");
+ actor.SetShaderEffect(effect);
+ Stage::GetCurrent().Add(actor);
+
+ effect.SetUniform( "uVec2", Vector2( 0.0f, 0.0f ), ShaderEffect::COORDINATE_TYPE_VIEWPORT_POSITION );
+ effect.SetUniform( "uVec2Dir", Vector2( 1.0f, 2.0f ), ShaderEffect::COORDINATE_TYPE_VIEWPORT_DIRECTION );
+
+ application.SendNotification();
+ application.Render();
+
+ const Vector2& stageSize(Stage::GetCurrent().GetSize());
+
+ DALI_TEST_CHECK(
+ application.GetGlAbstraction().CheckUniformValue(
+ "uVec2", Vector2( stageSize.x/2, -stageSize.y/2 ) ) );
+
+ DALI_TEST_CHECK(
+ application.GetGlAbstraction().CheckUniformValue(
+ "uVec2Dir", Vector2( -1.0f, 2.0f ) ) );
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodSetEffectImage(void)
+{
+ TestApplication application;
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( effect );
+
+ BitmapImage image = CreateBitmapImage();
+
+ effect.SetEffectImage(image);
+
+ ImageActor actor = ImageActor::New( image );
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("TestImageFilenameActor");
+ actor.SetShaderEffect(effect);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+
+ DALI_TEST_CHECK( application.GetGlAbstraction().CheckUniformValue( "sEffect", 1 ) );
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodSetEffectImageAndDelete(void)
+{
+ TestApplication application;
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+
+ BitmapImage effectImage = CreateBitmapImage();
+ effect.SetEffectImage(effectImage);
+
+ ImageActor actor = ImageActor::New();
+
+ actor.SetShaderEffect(effect);
+ effect.Reset();
+
+ Stage::GetCurrent().Add(actor);
+
+ // do an update / render cycle
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+ application.SendNotification();
+ application.Render(16);
+
+ printf("removing image actor from stage and Reseting handle\n");
+ Stage::GetCurrent().Remove(actor);
+ actor.Reset();
+
+ tet_printf("### Update & Render \n");
+
+ application.SendNotification();
+ application.Render(16);
+
+ tet_printf("#### Update Only \n");
+
+ tet_printf("effectImage.Reset \n");
+
+ // this releases the effect texture resource,
+ // Update will send a DispatchDiscardTexture message to render
+ effectImage.Reset();
+ application.SendNotification();
+ application.UpdateOnly(16);
+
+ tet_printf("#### Update Only \n");
+
+ // at this point shader is deleted, during clear discard queue
+ // and it sends a Shader:: DispatchRemoveObserver message to render thread
+ application.UpdateOnly(16);
+
+ tet_printf("#### Render Only \n");
+ // This is where it used to crash, there is a message in the queue to perform DispatchDiscardTexture
+ // which tries to call observer->TextureDiscarded, where observer == shader that was deleted
+ // in previous update.
+ application.RenderOnly();
+
+
+ // process the discard texture message
+ application.RenderOnly();
+ application.SendNotification();
+ application.Render(16);
+
+ tet_result(TET_PASS);
+
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodApplyConstraint(void)
+{
+ // Test whether Shader's uniform can be constrained to a stationary constraint.
+ TestApplication application;
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( effect );
+
+ BitmapImage image = CreateBitmapImage();
+
+ effect.SetUniform( "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) );
+
+ ImageActor actor = ImageActor::New( image );
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("TestImageFilenameActor");
+ actor.SetShaderEffect(effect);
+ Stage::GetCurrent().Add(actor);
+
+ Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
+
+ application.SendNotification();
+ application.Render();
+
+ // Test effects of SetUniform...
+ DALI_TEST_CHECK(
+ application.GetGlAbstraction().CheckUniformValue(
+ "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
+
+ Constraint constraint = Constraint::New<Vector3>( uVecProperty,
+ TestConstraintToVector3(Vector3(4.0f, 9.0f, 16.0f)) );
+
+ effect.ApplyConstraint(constraint);
+
+ application.SendNotification();
+ application.Render();
+
+ // Test effects of Constraint.
+ DALI_TEST_CHECK(
+ application.GetGlAbstraction().CheckUniformValue(
+ "uVec3", Vector3( 4.0f, 9.0f, 16.0f ) ) );
+ END_TEST;
+}
+
+
+int UtcDaliShaderEffectMethodApplyConstraintFromActor(void)
+{
+ // Test whether Shader's uniform can be constrained to Actor's position.
+ TestApplication application;
+
+ const Vector3 targetPosition = Vector3( 100.0f, 70.0f, 20.0f);
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( effect );
+
+ BitmapImage image = CreateBitmapImage();
+
+ effect.SetUniform( "uVec3", Vector3( 50.0f, 25.0f, 0.0f ) );
+
+ ImageActor actor = ImageActor::New( image );
+ actor.SetPosition(targetPosition);
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("TestImageFilenameActor");
+ actor.SetShaderEffect(effect);
+ Stage::GetCurrent().Add(actor);
+
+ Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
+
+ Constraint constraint = Constraint::New<Vector3>( uVecProperty,
+ Source(actor, Actor::POSITION),
+ TestConstraintFromPositionToVector3() );
+
+ effect.ApplyConstraint(constraint);
+
+ application.SendNotification();
+ application.Render();
+
+ // Test effects of Constraint.
+ DALI_TEST_CHECK(
+ application.GetGlAbstraction().CheckUniformValue(
+ "uVec3", targetPosition ) );
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodApplyConstraintFromActor2(void)
+{
+ // Test whether Shader's uniform can be constrained to Actor's position.
+ // While Actor's position is constrained to another point * 2.0f
+ TestApplication application;
+
+ const Vector3 targetPosition = Vector3( 25.0f, 36.0f, 49.0f );
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( effect );
+
+ BitmapImage image = CreateBitmapImage();
+
+ effect.SetUniform( "uVec3", Vector3( 50.0f, 25.0f, 0.0f ) );
+
+ ImageActor actor = ImageActor::New( image );
+ actor.SetPosition(Vector3( 100.0f, 70.0f, 20.0f));
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("TestImageFilenameActor");
+ actor.SetShaderEffect(effect);
+ Stage::GetCurrent().Add(actor);
+
+ Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
+
+ Constraint shaderConstraint = Constraint::New<Vector3>( uVecProperty,
+ Source(actor, Actor::POSITION),
+ TestConstraintFromPositionToVector3() );
+
+ effect.ApplyConstraint(shaderConstraint);
+
+ Constraint actorConstraint = Constraint::New<Vector3>( Actor::POSITION,
+ TestConstraintToVector3Double(targetPosition) );
+
+ actor.ApplyConstraint(actorConstraint);
+
+ application.SendNotification();
+ application.Render();
+
+ // Test effects of Constraint.
+ DALI_TEST_CHECK(
+ application.GetGlAbstraction().CheckUniformValue(
+ "uVec3", targetPosition * 2.0f ) );
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodApplyConstraintCallback(void)
+{
+ // Test whether Shader's uniform can be constrained to a stationary constraint.
+ TestApplication application;
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( effect );
+
+ BitmapImage image = CreateBitmapImage();
+
+ effect.SetUniform( "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) );
+
+ ImageActor actor = ImageActor::New( image );
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("TestImageFilenameActor");
+ actor.SetShaderEffect(effect);
+ Stage::GetCurrent().Add(actor);
+
+ Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
+
+ application.SendNotification();
+ application.Render();
+
+ // Test effects of SetUniform...
+ DALI_TEST_CHECK(
+ application.GetGlAbstraction().CheckUniformValue(
+ "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
+
+ Constraint constraint = Constraint::New<Vector3>( uVecProperty,
+ TestConstraintToVector3(Vector3(4.0f, 9.0f, 16.0f)) );
+
+ constraint.SetApplyTime( 10.0f );
+
+ bool constraintCheck( false );
+ ConstraintAppliedCheck appliedCheck( constraintCheck );
+
+ // We should receive the "Applied" signal after 10 seconds
+ ActiveConstraint active = effect.ApplyConstraint(constraint);
+ active.AppliedSignal().Connect( &application, appliedCheck );
+
+ application.SendNotification();
+ application.Render(static_cast<unsigned int>(1000.0f)); // 1 elapsed second
+
+ // Check signal has not fired
+ application.SendNotification();
+ appliedCheck.CheckSignalNotReceived();
+
+ application.Render(static_cast<unsigned int>(4000.0f)); // 5 elapsed seconds
+
+ // Check signal has not fired
+ application.SendNotification();
+ appliedCheck.CheckSignalNotReceived();
+
+ application.Render(static_cast<unsigned int>(5000.0f - 1.0f)); // <10 elapsed seconds
+
+ // Check signal has not fired
+ application.SendNotification();
+ appliedCheck.CheckSignalNotReceived();
+
+ application.Render(static_cast<unsigned int>(2.0f)); // >10 elapsed seconds
+
+ // Signal should have fired
+ application.SendNotification();
+ appliedCheck.CheckSignalReceived();
+
+ // Test effects of Constraint.
+ DALI_TEST_CHECK(
+ application.GetGlAbstraction().CheckUniformValue(
+ "uVec3", Vector3( 4.0f, 9.0f, 16.0f ) ) );
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodRemoveConstraints(void)
+{
+ // Test if constrains can be removed before they are ever applyed.
+ TestApplication application;
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( effect );
+
+ BitmapImage image = CreateBitmapImage();
+
+ effect.SetUniform( "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) );
+
+ ImageActor actor = ImageActor::New( image );
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("TestImageFilenameActor");
+ actor.SetShaderEffect(effect);
+ Stage::GetCurrent().Add(actor);
+
+ Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
+
+ application.SendNotification();
+ application.Render();
+
+ // Test effects of SetUniform...
+ DALI_TEST_CHECK(
+ application.GetGlAbstraction().CheckUniformValue(
+ "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
+
+ Constraint constraint = Constraint::New<Vector3>( uVecProperty,
+ TestConstraintToVector3(Vector3(4.0f, 9.0f, 16.0f)) );
+
+ effect.ApplyConstraint(constraint);
+
+ // Remove the constraints
+ effect.RemoveConstraints();
+
+ application.SendNotification();
+ application.Render();
+
+ // Test effects of Constraint.
+ DALI_TEST_CHECK(
+ application.GetGlAbstraction().CheckUniformValue(
+ "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodRemoveConstraints2(void)
+{
+ // Test whether Shader's uniform constrains can be removed after they are applyed.
+ TestApplication application;
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( effect );
+
+ BitmapImage image = CreateBitmapImage();
+
+ effect.SetUniform( "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) );
+
+ ImageActor actor = ImageActor::New( image );
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("TestImageFilenameActor");
+ actor.SetShaderEffect(effect);
+ Stage::GetCurrent().Add(actor);
+
+ Property::Index uVecProperty = effect.GetPropertyIndex("uVec3");
+
+ application.SendNotification();
+ application.Render();
+
+ // Test effects of SetUniform...
+ DALI_TEST_CHECK(
+ application.GetGlAbstraction().CheckUniformValue(
+ "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
+
+ Constraint constraint = Constraint::New<Vector3>( uVecProperty,
+ TestConstraintToVector3(Vector3(4.0f, 9.0f, 16.0f)) );
+
+ effect.ApplyConstraint(constraint);
+
+ application.SendNotification();
+ application.Render();
+
+ // Reset the value and remove the constraints
+ effect.SetUniform( "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) );
+ effect.RemoveConstraints();
+
+ application.SendNotification();
+ application.Render();
+
+ // Test effects of Constraint.
+ DALI_TEST_CHECK(
+ application.GetGlAbstraction().CheckUniformValue(
+ "uVec3", Vector3( 1.0f, 2.0f, 3.0f ) ) );
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodCreateExtension(void)
+{
+ // Test creation of a shader extension
+ TestApplication aplication;
+
+ bool deleted;
+ {
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( effect );
+
+ TestExtension* extension = new TestExtension ( deleted );
+
+ effect.AttachExtension( extension );
+
+ DALI_TEST_CHECK( static_cast<TestExtension&>(effect.GetExtension()).IsAlive() );
+ }
+
+ DALI_TEST_CHECK( deleted );
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodCreateExtension2(void)
+{
+ // Test creation of a shader extension
+ bool deleted;
+ {
+ TestApplication application;
+
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( effect );
+
+ BitmapImage image = CreateBitmapImage();
+
+ effect.SetUniform( "uFloat", 1.0f );
+
+ ImageActor actor = ImageActor::New( image );
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetName("TestImageFilenameActor");
+ actor.SetShaderEffect(effect);
+ Stage::GetCurrent().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+
+ TestExtension* extension = new TestExtension ( deleted );
+
+ effect.AttachExtension( extension );
+
+ const ShaderEffect& constEffect(effect);
+ const TestExtension& ext( static_cast<const TestExtension&>(constEffect.GetExtension()) );
+
+ DALI_TEST_CHECK( ext.IsAlive() );
+ }
+
+ DALI_TEST_CHECK( deleted );
+ END_TEST;
+}
+
+int UtcDaliShaderEffectMethodNoExtension(void)
+{
+ TestApplication application;
+
+ ShaderEffect effect;
+
+ try
+ {
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+ DALI_TEST_CHECK( effect );
+
+ // Don't attach extension
+ ShaderEffect::Extension& extension = effect.GetExtension();
+ (void) extension;
+
+ DALI_TEST_CHECK( false );
+ }
+ catch (Dali::DaliException& e)
+ {
+ // Tests that a negative test of an assertion succeeds
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_CHECK( !effect );
+ }
+ END_TEST;
+}
+
+
+int UtcDaliShaderEffectPropertyIndices(void)
+{
+ TestApplication application;
+ ShaderEffect effect = ShaderEffect::New( VertexSource, FragmentSource );
+
+ Property::IndexContainer indices;
+ effect.GetPropertyIndices( indices );
+ DALI_TEST_CHECK( ! indices.empty() );
+ DALI_TEST_EQUALS( indices.size(), effect.GetPropertyCount(), TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+// EXTERNAL INCLUDES
+#include <iostream>
+#include <stdlib.h>
+
+// INTERNAL INCLUDES
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_signal_templates_functors_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_signal_templates_functors_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+class TestSignals
+{
+public:
+
+ typedef SignalV2<void ()> VoidSignalVoid;
+ typedef SignalV2<void (float)> VoidSignalFloat;
+
+ typedef SignalV2<float ()> FloatSignalVoid;
+ typedef SignalV2<float (float)> FloatSignalFloat;
+
+ TestSignals()
+ {
+ }
+
+ void CheckNoConnections()
+ {
+ DALI_TEST_EQUALS( mVoidSignalVoid.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( mVoidSignalFloat.GetConnectionCount(), 0u, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( mFloatSignalVoid.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( mFloatSignalFloat.GetConnectionCount(), 0u, TEST_LOCATION );
+ }
+
+ VoidSignalVoid mVoidSignalVoid;
+ VoidSignalFloat mVoidSignalFloat;
+
+ FloatSignalVoid mFloatSignalVoid;
+ FloatSignalFloat mFloatSignalFloat;
+};
+
+class TestConnectionTracker : public ConnectionTracker
+{
+public:
+
+ TestConnectionTracker()
+ {
+ }
+};
+
+struct VoidFunctorVoid
+{
+ VoidFunctorVoid()
+ {
+ ++mTotalInstanceCount;
+ ++mCurrentInstanceCount;
+ }
+
+ VoidFunctorVoid( const VoidFunctorVoid& copyMe )
+ {
+ ++mTotalInstanceCount;
+ ++mCurrentInstanceCount;
+ }
+
+ ~VoidFunctorVoid()
+ {
+ --mCurrentInstanceCount;
+ }
+
+ void operator()()
+ {
+ ++mCallbackCount;
+ }
+
+ static int mTotalInstanceCount;
+ static int mCurrentInstanceCount;
+ static int mCallbackCount;
+};
+
+struct VoidFunctorFloat
+{
+ VoidFunctorFloat( float* lastReceivedValue )
+ : mLastReceivedValue( lastReceivedValue )
+ {
+ ++mTotalInstanceCount;
+ ++mCurrentInstanceCount;
+ }
+
+ VoidFunctorFloat( const VoidFunctorFloat& copyMe )
+ : mLastReceivedValue( copyMe.mLastReceivedValue )
+ {
+ ++mTotalInstanceCount;
+ ++mCurrentInstanceCount;
+ }
+
+ ~VoidFunctorFloat()
+ {
+ --mCurrentInstanceCount;
+ }
+
+ void operator()(float value)
+ {
+ ++mCallbackCount;
+
+ if( mLastReceivedValue )
+ {
+ *mLastReceivedValue = value;
+ }
+ }
+
+ float* mLastReceivedValue;
+
+ static int mTotalInstanceCount;
+ static int mCurrentInstanceCount;
+ static int mCallbackCount;
+};
+
+struct FloatFunctorVoid
+{
+ static float DEFAULT_RETURN_VALUE;
+
+ FloatFunctorVoid()
+ {
+ ++mTotalInstanceCount;
+ ++mCurrentInstanceCount;
+ }
+
+ FloatFunctorVoid( const FloatFunctorVoid& copyMe )
+ {
+ ++mTotalInstanceCount;
+ ++mCurrentInstanceCount;
+ }
+
+ ~FloatFunctorVoid()
+ {
+ --mCurrentInstanceCount;
+ }
+
+ float operator()()
+ {
+ ++mCallbackCount;
+
+ return DEFAULT_RETURN_VALUE;
+ }
+
+ static int mTotalInstanceCount;
+ static int mCurrentInstanceCount;
+ static int mCallbackCount;
+};
+
+float FloatFunctorVoid::DEFAULT_RETURN_VALUE = 5.0f;
+
+struct FloatFunctorFloat
+{
+ FloatFunctorFloat()
+ : mLastReceivedValue()
+ {
+ ++mTotalInstanceCount;
+ ++mCurrentInstanceCount;
+ }
+
+ FloatFunctorFloat( const FloatFunctorFloat& copyMe )
+ {
+ ++mTotalInstanceCount;
+ ++mCurrentInstanceCount;
+ }
+
+ ~FloatFunctorFloat()
+ {
+ --mCurrentInstanceCount;
+ }
+
+ float operator()(float value)
+ {
+ ++mCallbackCount;
+
+ return value + 1.0f;
+ }
+
+ float* mLastReceivedValue;
+
+ static int mTotalInstanceCount;
+ static int mCurrentInstanceCount;
+ static int mCallbackCount;
+};
+
+static void ResetFunctorCounts()
+{
+ VoidFunctorVoid::mTotalInstanceCount = 0;
+ VoidFunctorVoid::mCurrentInstanceCount = 0;
+ VoidFunctorVoid::mCallbackCount = 0;
+
+ VoidFunctorFloat::mTotalInstanceCount = 0;
+ VoidFunctorFloat::mCurrentInstanceCount = 0;
+ VoidFunctorFloat::mCallbackCount = 0;
+
+ FloatFunctorVoid::mTotalInstanceCount = 0;
+ FloatFunctorVoid::mCurrentInstanceCount = 0;
+ FloatFunctorVoid::mCallbackCount = 0;
+
+ FloatFunctorFloat::mTotalInstanceCount = 0;
+ FloatFunctorFloat::mCurrentInstanceCount = 0;
+ FloatFunctorFloat::mCallbackCount = 0;
+}
+
+int VoidFunctorVoid::mTotalInstanceCount = 0;
+int VoidFunctorVoid::mCurrentInstanceCount = 0;
+int VoidFunctorVoid::mCallbackCount = 0;
+
+int VoidFunctorFloat::mTotalInstanceCount = 0;
+int VoidFunctorFloat::mCurrentInstanceCount = 0;
+int VoidFunctorFloat::mCallbackCount = 0;
+
+int FloatFunctorVoid::mTotalInstanceCount = 0;
+int FloatFunctorVoid::mCurrentInstanceCount = 0;
+int FloatFunctorVoid::mCallbackCount = 0;
+
+int FloatFunctorFloat::mTotalInstanceCount = 0;
+int FloatFunctorFloat::mCurrentInstanceCount = 0;
+int FloatFunctorFloat::mCallbackCount = 0;
+
+} // anon namespace
+
+
+int UtcDaliSignalFunctorsEmptyCheck(void)
+{
+ // Test that Empty() check works before & after signal connection
+
+ ResetFunctorCounts();
+
+ {
+ TestSignals::VoidSignalVoid signal;
+ DALI_TEST_CHECK( signal.Empty() );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mTotalInstanceCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCurrentInstanceCount, 0, TEST_LOCATION );
+ TestConnectionTracker tracker;
+ signal.Connect( &tracker, VoidFunctorVoid() );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCurrentInstanceCount, 1, TEST_LOCATION );
+ }
+ // TestConnectionTracker should auto-disconnect
+ DALI_TEST_EQUALS( VoidFunctorVoid::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCurrentInstanceCount, 0, TEST_LOCATION );
+
+ {
+ TestSignals::VoidSignalFloat signal;
+ DALI_TEST_CHECK( signal.Empty() );
+ DALI_TEST_EQUALS( VoidFunctorFloat::mTotalInstanceCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorFloat::mCurrentInstanceCount, 0, TEST_LOCATION );
+ TestConnectionTracker tracker;
+ signal.Connect( &tracker, VoidFunctorFloat(NULL) );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ DALI_TEST_EQUALS( VoidFunctorFloat::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorFloat::mCurrentInstanceCount, 1, TEST_LOCATION );
+ }
+ // TestConnectionTracker should auto-disconnect
+ DALI_TEST_EQUALS( VoidFunctorFloat::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorFloat::mCurrentInstanceCount, 0, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliSignalFunctorsEmit(void)
+{
+ // Test basic signal emission for each functor type
+
+ ResetFunctorCounts();
+
+ TestSignals signals;
+
+ {
+ TestConnectionTracker tracker;
+
+ DALI_TEST_EQUALS( VoidFunctorVoid::mTotalInstanceCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCurrentInstanceCount, 0, TEST_LOCATION );
+
+ signals.mVoidSignalVoid.Connect( &tracker, VoidFunctorVoid() );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCurrentInstanceCount, 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCallbackCount, 0, TEST_LOCATION );
+
+ signals.mVoidSignalVoid.Emit();
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCallbackCount, 1, TEST_LOCATION );
+
+ // Test double emission
+ signals.mVoidSignalVoid.Emit();
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCallbackCount, 2, TEST_LOCATION );
+ }
+ // TestConnectionTracker should auto-disconnect
+ DALI_TEST_EQUALS( VoidFunctorVoid::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCurrentInstanceCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCallbackCount, 2, TEST_LOCATION );
+ signals.CheckNoConnections();
+
+ {
+ TestConnectionTracker tracker;
+ float lastReceivedValue( 0.0f );
+
+ DALI_TEST_EQUALS( VoidFunctorFloat::mTotalInstanceCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorFloat::mCurrentInstanceCount, 0, TEST_LOCATION );
+
+ signals.mVoidSignalFloat.Connect( &tracker, VoidFunctorFloat(&lastReceivedValue) );
+ DALI_TEST_EQUALS( VoidFunctorFloat::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorFloat::mCurrentInstanceCount, 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorFloat::mCallbackCount, 0, TEST_LOCATION );
+
+ signals.mVoidSignalFloat.Emit( 3.5f );
+ DALI_TEST_EQUALS( VoidFunctorFloat::mCallbackCount, 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( lastReceivedValue, 3.5f, TEST_LOCATION );
+
+ // Test double emission
+ signals.mVoidSignalFloat.Emit( 7.0f );
+ DALI_TEST_EQUALS( VoidFunctorFloat::mCallbackCount, 2, TEST_LOCATION );
+ DALI_TEST_EQUALS( lastReceivedValue, 7.0f, TEST_LOCATION );
+ }
+ // TestConnectionTracker should auto-disconnect
+ DALI_TEST_EQUALS( VoidFunctorFloat::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorFloat::mCurrentInstanceCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorFloat::mCallbackCount, 2, TEST_LOCATION );
+ signals.CheckNoConnections();
+ END_TEST;
+}
+
+int UtcDaliSignalFunctorsEmitReturn(void)
+{
+ // Test signals with return values
+
+ ResetFunctorCounts();
+
+ TestSignals signals;
+
+ {
+ TestConnectionTracker tracker;
+
+ DALI_TEST_EQUALS( FloatFunctorVoid::mTotalInstanceCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( FloatFunctorVoid::mCurrentInstanceCount, 0, TEST_LOCATION );
+
+ signals.mFloatSignalVoid.Connect( &tracker, FloatFunctorVoid() );
+ DALI_TEST_EQUALS( FloatFunctorVoid::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( FloatFunctorVoid::mCurrentInstanceCount, 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( FloatFunctorVoid::mCallbackCount, 0, TEST_LOCATION );
+
+ float returnValue = signals.mFloatSignalVoid.Emit();
+ DALI_TEST_EQUALS( FloatFunctorVoid::mCallbackCount, 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( returnValue, FloatFunctorVoid::DEFAULT_RETURN_VALUE, TEST_LOCATION );
+
+ // Test double emission
+ returnValue = 0.0f;
+ returnValue = signals.mFloatSignalVoid.Emit();
+ DALI_TEST_EQUALS( FloatFunctorVoid::mCallbackCount, 2, TEST_LOCATION );
+ DALI_TEST_EQUALS( returnValue, FloatFunctorVoid::DEFAULT_RETURN_VALUE, TEST_LOCATION );
+ }
+ // TestConnectionTracker should auto-disconnect
+ DALI_TEST_EQUALS( FloatFunctorVoid::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( FloatFunctorVoid::mCurrentInstanceCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( FloatFunctorVoid::mCallbackCount, 2, TEST_LOCATION );
+ signals.CheckNoConnections();
+
+ {
+ TestConnectionTracker tracker;
+
+ DALI_TEST_EQUALS( FloatFunctorFloat::mTotalInstanceCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( FloatFunctorFloat::mCurrentInstanceCount, 0, TEST_LOCATION );
+
+ signals.mFloatSignalFloat.Connect( &tracker, FloatFunctorFloat() );
+ DALI_TEST_EQUALS( FloatFunctorFloat::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( FloatFunctorFloat::mCurrentInstanceCount, 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( FloatFunctorFloat::mCallbackCount, 0, TEST_LOCATION );
+
+ float returnValue = signals.mFloatSignalFloat.Emit( 0.1f );
+ DALI_TEST_EQUALS( FloatFunctorFloat::mCallbackCount, 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( returnValue, 1.0f + 0.1f, TEST_LOCATION );
+
+ // Test double emission
+ returnValue = signals.mFloatSignalFloat.Emit( 0.2f );
+ DALI_TEST_EQUALS( FloatFunctorFloat::mCallbackCount, 2, TEST_LOCATION );
+ DALI_TEST_EQUALS( returnValue, 1.0f + 0.2f, TEST_LOCATION );
+ }
+ // TestConnectionTracker should auto-disconnect
+ DALI_TEST_EQUALS( FloatFunctorFloat::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( FloatFunctorFloat::mCurrentInstanceCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( FloatFunctorFloat::mCallbackCount, 2, TEST_LOCATION );
+ signals.CheckNoConnections();
+ END_TEST;
+}
+
+int UtcDaliSignalFunctorsDisconnectBeforeEmit(void)
+{
+ // Test explicit disconnect using ConnectionTracker
+
+ ResetFunctorCounts();
+
+ TestSignals signals;
+
+ {
+ TestConnectionTracker tracker;
+
+ DALI_TEST_EQUALS( VoidFunctorVoid::mTotalInstanceCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCurrentInstanceCount, 0, TEST_LOCATION );
+
+ signals.mVoidSignalVoid.Connect( &tracker, VoidFunctorVoid() );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCurrentInstanceCount, 1, TEST_LOCATION );
+
+ tracker.DisconnectAll();
+ DALI_TEST_EQUALS( VoidFunctorVoid::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCurrentInstanceCount, 0, TEST_LOCATION );
+
+ signals.mVoidSignalVoid.Emit();
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCallbackCount, 0, TEST_LOCATION );
+
+ // Test double emission
+ signals.mVoidSignalVoid.Emit();
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCallbackCount, 0, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliSignalFunctorsDestroySignal(void)
+{
+ // Test destruction of signal before slot
+
+ ResetFunctorCounts();
+
+ TestConnectionTracker tracker;
+
+ {
+ TestSignals signals;
+
+ DALI_TEST_EQUALS( VoidFunctorVoid::mTotalInstanceCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCurrentInstanceCount, 0, TEST_LOCATION );
+
+ signals.mVoidSignalVoid.Connect( &tracker, VoidFunctorVoid() );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCurrentInstanceCount, 1, TEST_LOCATION );
+
+ signals.mVoidSignalVoid.Emit();
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCallbackCount,1, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( tracker.GetConnectionCount(), 1u, TEST_LOCATION );
+ }
+
+ // Functor should have been deleted with signal
+ DALI_TEST_EQUALS( VoidFunctorVoid::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCurrentInstanceCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCallbackCount, 1, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( tracker.GetConnectionCount(), 0u, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliSignalConnectVoidFunctor(void)
+{
+ // Test connecting a functor using the VoidFunctor wrapper
+
+ ResetFunctorCounts();
+
+ TestSignals signals;
+
+ {
+ TestConnectionTracker tracker;
+
+ DALI_TEST_EQUALS( VoidFunctorVoid::mTotalInstanceCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCurrentInstanceCount, 0, TEST_LOCATION );
+
+ signals.mVoidSignalVoid.Connect( &tracker, FunctorDelegate::New( VoidFunctorVoid() ) );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCurrentInstanceCount, 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCallbackCount, 0, TEST_LOCATION );
+
+ signals.mVoidSignalVoid.Emit();
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCallbackCount, 1, TEST_LOCATION );
+
+ // Test double emission
+ signals.mVoidSignalVoid.Emit();
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCallbackCount, 2, TEST_LOCATION );
+ }
+ // TestConnectionTracker should auto-disconnect
+ DALI_TEST_EQUALS( VoidFunctorVoid::mTotalInstanceCount, 2/*temporary copy + signal copy*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCurrentInstanceCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( VoidFunctorVoid::mCallbackCount, 2, TEST_LOCATION );
+ signals.CheckNoConnections();
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+// EXTERNAL INCLUDES
+#include <iostream>
+#include <stdlib.h>
+
+// INTERNAL INCLUDES
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_signal_templates_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_signal_templates_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace {
+
+class TestButton
+{
+public:
+
+ TestButton( unsigned int id )
+ : mId(id)
+ {
+ }
+
+ void Press()
+ {
+ mPanelDown.Emit( *this );
+ }
+
+ void Release()
+ {
+ mPanelUp.Emit( *this );
+ }
+
+ typedef SignalV2< void (TestButton&) > PanelDownSignal;
+ typedef SignalV2< void (TestButton&) > PanelUpSignal;
+
+ PanelDownSignal& DownSignal()
+ {
+ return mPanelDown;
+ }
+
+ PanelUpSignal& SignalUp()
+ {
+ return mPanelUp;
+ }
+
+ int GetId()
+ {
+ return mId;
+ }
+
+private:
+
+ int mId;
+ PanelDownSignal mPanelDown;
+ PanelUpSignal mPanelUp;
+};
+
+class TestApp : public ConnectionTracker
+{
+public:
+
+ TestApp()
+ : mButtonPressed( false ),
+ mVoidFunctionCalled( false )
+ {
+ }
+
+ void OnButtonPress( TestButton& button )
+ {
+ mButtonPressed = true;
+ mButtonId = button.GetId();
+ }
+
+ void OnButtonRelease( TestButton& button )
+ {
+ mButtonPressed = false;
+ mButtonId = button.GetId();
+ }
+
+ int GetButtonPressedId()
+ {
+ return mButtonId;
+ }
+
+ bool BoolReturnTestFalse()
+ {
+ return false;
+ }
+
+ bool BoolReturnTestTrue()
+ {
+ return true;
+ }
+
+ void VoidFunction()
+ {
+ mVoidFunctionCalled = true;
+ }
+
+ bool mButtonPressed;
+ bool mVoidFunctionCalled;
+ int mButtonId;
+};
+
+class TestSignals
+{
+public:
+
+ // Void return, no parameters
+ typedef SignalV2<void ()> VoidRetNoParamSignal;
+
+ // Void return, 1 value parameter
+ typedef SignalV2<void (int)> VoidRet1ValueParamSignal;
+
+ // Void return, 1 reference parameter
+ typedef SignalV2< void (int&)> VoidRet1RefParamSignal;
+
+ // Void return, 2 value parameters
+ typedef SignalV2<void (int, int)> VoidRet2ValueParamSignal;
+
+ // bool return, 1 value parameter
+ typedef SignalV2< bool (float)> BoolRet1ValueParamSignal;
+
+ // bool return, 2 value parameter
+ typedef SignalV2<bool (float, int) > BoolRet2ValueParamSignal;
+
+ // int return, 2 value parameter
+ typedef SignalV2<int (float, int)> IntRet2ValueParamSignal;
+
+ // float return, 0 parameters
+ typedef SignalV2< float () > FloatRet0ParamSignal;
+
+ // float return, 2 value parameters
+ typedef SignalV2<float (float, float) > FloatRet2ValueParamSignal;
+
+ // void return, 3 value parameters
+ typedef SignalV2<void (float, float, float) > VoidSignalTypeFloatValue3;
+
+ // float return, 3 value parameters
+ typedef SignalV2<float (float, float, float) > FloatSignalTypeFloatValue3;
+
+ VoidRetNoParamSignal& SignalVoidNone() { return mSignalVoid0; }
+ VoidRet1RefParamSignal& SignalVoid1Ref() { return mSignalVoid1R; }
+ VoidRet1ValueParamSignal& SignalVoid1Value() { return mSignalVoid1V; }
+ VoidRet2ValueParamSignal& SignalVoid2Value() { return mSignalVoid2V; }
+
+ BoolRet1ValueParamSignal& SignalBool1Value() { return mSignalBool1V; }
+ BoolRet2ValueParamSignal& SignalBool2Value() { return mSignalBool2V; }
+ IntRet2ValueParamSignal& SignalInt2Value() { return mSignalInt2V; }
+ FloatRet0ParamSignal& SignalFloat0() { return mSignalFloat0; }
+ FloatRet2ValueParamSignal& SignalFloat2Value() { return mSignalFloat2V; }
+
+ VoidSignalTypeFloatValue3& VoidSignalFloatValue3() { return mVoidSignalFloatValue3; }
+ FloatSignalTypeFloatValue3& FloatSignalFloatValue3() { return mFloatSignalFloatValue3; }
+
+ TestSignals()
+ {
+ }
+
+ void CheckNoConnections()
+ {
+ DALI_TEST_EQUALS( mSignalVoid0.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( mSignalVoid1R.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( mSignalVoid1V.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( mSignalVoid2V.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( mSignalBool1V.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( mSignalBool2V.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( mSignalInt2V.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( mSignalFloat0.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( mSignalFloat2V.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( mVoidSignalFloatValue3.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( mFloatSignalFloatValue3.GetConnectionCount(), 0u, TEST_LOCATION );
+ }
+
+ void EmitVoidSignalVoid()
+ {
+ mSignalVoid0.Emit();
+ }
+
+ void EmitVoidSignalIntRef(int& ref)
+ {
+ mSignalVoid1R.Emit(ref);
+ }
+
+ void EmitVoidSignalIntValue(int p1)
+ {
+ mSignalVoid1V.Emit(p1);
+ }
+
+ void EmitVoidSignalIntValueIntValue(int p1, int p2)
+ {
+ mSignalVoid2V.Emit(p1,p2);
+ }
+
+ bool EmitBoolSignalFloatValue(float p1)
+ {
+ return mSignalBool1V.Emit(p1);
+ }
+
+ bool EmitBoolSignalFloatValueIntValue(float p1, int p2)
+ {
+ return mSignalBool2V.Emit(p1, p2);
+ }
+
+ int EmitIntSignalFloatValueIntValue(float p1, int p2)
+ {
+ return mSignalInt2V.Emit(p1, p2);
+ }
+
+ float EmitFloat2VSignal(float p1, float p2)
+ {
+ return mSignalFloat2V.Emit(p1, p2);
+ }
+
+ float EmitFloat0Signal()
+ {
+ return mSignalFloat0.Emit();
+ }
+
+ void EmitVoidSignalFloatValue3(float p1, float p2, float p3)
+ {
+ mVoidSignalFloatValue3.Emit(p1, p2, p3);
+ }
+
+ float EmitFloatSignalFloatValue3(float p1, float p2, float p3)
+ {
+ return mFloatSignalFloatValue3.Emit(p1, p2, p3);
+ }
+
+private:
+
+ VoidRetNoParamSignal mSignalVoid0;
+ VoidRet1RefParamSignal mSignalVoid1R;
+ VoidRet1ValueParamSignal mSignalVoid1V;
+ VoidRet2ValueParamSignal mSignalVoid2V;
+ BoolRet1ValueParamSignal mSignalBool1V;
+ BoolRet2ValueParamSignal mSignalBool2V;
+ IntRet2ValueParamSignal mSignalInt2V;
+ FloatRet0ParamSignal mSignalFloat0;
+ FloatRet2ValueParamSignal mSignalFloat2V;
+ VoidSignalTypeFloatValue3 mVoidSignalFloatValue3;
+ FloatSignalTypeFloatValue3 mFloatSignalFloatValue3;
+};
+
+/**
+ * A helper class with various slots
+ */
+class TestSlotHandler : public ConnectionTracker
+{
+public:
+
+ TestSlotHandler()
+ : mIntParam1( 0 ),
+ mIntParam2( 0 ),
+ mIntParam3( 0 ),
+ mFloatParam1( 0.0f ),
+ mFloatParam2( 0.0f ),
+ mFloatParam3( 0.0f ),
+ mBoolReturn( false ),
+ mIntReturn( 0 ),
+ mFloatReturn( 0.0f ),
+ mHandled( false ),
+ mHandledCount( 0 )
+ {
+ }
+
+ void Reset()
+ {
+ mIntParam1 = 0;
+ mIntParam2 = 0;
+ mIntParam3 = 0;
+ mFloatParam1 = 0.0f;
+ mFloatParam2 = 0.0f;
+ mFloatParam3 = 0.0f;
+ mBoolReturn = false;
+ mIntReturn = 0;
+ mFloatReturn = 0.0f;
+ mHandled = false;
+ }
+
+ void VoidSlotVoid()
+ {
+ mHandled = true;
+ ++mHandledCount;
+ }
+
+ void VoidSlotIntRef( int& p1 )
+ {
+ mIntParam1 = p1;
+ mHandled = true;
+ ++mHandledCount;
+ }
+
+ void VoidSlotIntValue( int p1 )
+ {
+ mIntParam1 = p1;
+ mHandled = true;
+ ++mHandledCount;
+ }
+
+ void VoidDuplicateSlotIntValue( int p1 )
+ {
+ mIntParam2 = p1;
+ mHandled = true;
+ ++mHandledCount;
+ }
+
+ void VoidSlotIntValueIntValue( int p1, int p2 )
+ {
+ mIntParam1 = p1;
+ mIntParam2 = p2;
+ mHandled = true;
+ ++mHandledCount;
+ }
+
+ bool BoolSlotFloatValue( float p1 )
+ {
+ mFloatParam1 = p1;
+ mHandled = true;
+ ++mHandledCount;
+ return mBoolReturn;
+ }
+
+ bool BoolSlotFloatValueIntValue( float p1, int p2 )
+ {
+ mFloatParam1 = p1;
+ mIntParam2 = p2;
+ mHandled = true;
+ ++mHandledCount;
+ return mBoolReturn;
+ }
+
+ int IntSlotFloatValueIntValue( float p1, int p2 )
+ {
+ mFloatParam1 = p1;
+ mIntParam2 = p2;
+ mHandled = true;
+ ++mHandledCount;
+ return mIntReturn;
+ }
+
+ float FloatSlotVoid()
+ {
+ mHandled = true;
+ ++mHandledCount;
+ return mFloatReturn;
+ }
+
+ float FloatSlotFloatValueFloatValue( float p1, float p2 )
+ {
+ mFloatParam1 = p1;
+ mFloatParam2 = p2;
+ mHandled = true;
+ ++mHandledCount;
+ return mFloatReturn;
+ }
+
+ void VoidSlotFloatValue3( float p1, float p2, float p3 )
+ {
+ mFloatParam1 = p1;
+ mFloatParam2 = p2;
+ mFloatParam3 = p3;
+ mHandled = true;
+ ++mHandledCount;
+ }
+
+ float FloatSlotFloatValue3( float p1, float p2, float p3 )
+ {
+ mFloatParam1 = p1;
+ mFloatParam2 = p2;
+ mFloatParam3 = p3;
+ mHandled = true;
+ ++mHandledCount;
+ return mFloatReturn;
+ }
+
+ int mIntParam1, mIntParam2, mIntParam3;
+ float mFloatParam1, mFloatParam2, mFloatParam3;
+ bool mBoolReturn;
+ int mIntReturn;
+ float mFloatReturn;
+ bool mHandled;
+ int mHandledCount;
+};
+
+/**
+ * A version of TestSlotHandler which disconnects during the callback
+ */
+class TestSlotDisconnector : public ConnectionTracker
+{
+public:
+
+ TestSlotDisconnector()
+ : mIntParam1( 0 ),
+ mIntParam2( 0 ),
+ mIntParam3( 0 ),
+ mFloatParam1( 0.0f ),
+ mFloatParam2( 0.0f ),
+ mBoolReturn( false ),
+ mIntReturn( 0 ),
+ mFloatReturn( 0.0f ),
+ mHandled( false )
+ {
+ }
+
+ void Reset()
+ {
+ mIntParam1 = 0;
+ mIntParam2 = 0;
+ mIntParam3 = 0;
+ mFloatParam1 = 0.0f;
+ mFloatParam2 = 0.0f;
+ mBoolReturn = false;
+ mIntReturn = 0;
+ mFloatReturn = 0.0f;
+ mHandled = false;
+ }
+
+ void VoidConnectVoid( TestSignals::VoidRetNoParamSignal& signal )
+ {
+ mVoidSignalVoid = &signal;
+ signal.Connect( this, &TestSlotDisconnector::VoidSlotVoid );
+ }
+
+ void VoidSlotVoid()
+ {
+ mVoidSignalVoid->Disconnect( this, &TestSlotDisconnector::VoidSlotVoid );
+ mHandled = true;
+ }
+
+ void VoidConnectIntRef( TestSignals::VoidRet1RefParamSignal& signal )
+ {
+ mVoidSignalIntRef = &signal;
+ signal.Connect( this, &TestSlotDisconnector::VoidSlotIntRef );
+ }
+
+ void VoidSlotIntRef( int& p1 )
+ {
+ mVoidSignalIntRef->Disconnect( this, &TestSlotDisconnector::VoidSlotIntRef );
+ mIntParam1 = p1;
+ mHandled = true;
+ }
+
+ void VoidSlotIntValue( int p1 )
+ {
+ mIntParam1 = p1;
+ mHandled = true;
+ }
+
+ void VoidSlotIntValueIntValue( int p1, int p2 )
+ {
+ mIntParam1 = p1;
+ mIntParam2 = p2;
+ mHandled = true;
+ }
+
+ bool BoolSlotFloatValue( float p1 )
+ {
+ mFloatParam1 = p1;
+ mHandled = true;
+ return mBoolReturn;
+ }
+
+ bool BoolSlotFloatValueIntValue( float p1, int p2 )
+ {
+ mFloatParam1 = p1;
+ mIntParam2 = p2;
+ mHandled = true;
+ return mBoolReturn;
+ }
+
+ int IntSlotFloatValueIntValue( float p1, int p2 )
+ {
+ mFloatParam1 = p1;
+ mIntParam2 = p2;
+ mHandled = true;
+ return mIntReturn;
+ }
+
+ float FloatSlotVoid()
+ {
+ mHandled = true;
+ return mFloatReturn;
+ }
+
+ float FloatSlotFloatValueFloatValue( float p1, float p2 )
+ {
+ mFloatParam1 = p1;
+ mFloatParam2 = p2;
+ mHandled = true;
+ return mFloatReturn;
+ }
+
+ TestSignals::VoidRetNoParamSignal* mVoidSignalVoid;
+ TestSignals::VoidRet1RefParamSignal* mVoidSignalIntRef;
+
+ int mIntParam1, mIntParam2, mIntParam3;
+ float mFloatParam1, mFloatParam2;
+ bool mBoolReturn;
+ int mIntReturn;
+ float mFloatReturn;
+ bool mHandled;
+};
+
+/**
+ * A more complicated version of TestSlotDisconnector, which disconnects some but not all callbacks
+ */
+class TestSlotMultiDisconnector : public ConnectionTracker
+{
+public:
+
+ static const int NUM_SLOTS = 10;
+
+ TestSlotMultiDisconnector()
+ : mVoidSignalVoid( NULL )
+ {
+ Reset();
+ }
+
+ void Reset()
+ {
+ for( int i=0; i<NUM_SLOTS; ++i )
+ {
+ mSlotHandled[i] = false;
+ }
+ }
+
+ void ConnectAll( TestSignals::VoidRetNoParamSignal& signal )
+ {
+ mVoidSignalVoid = &signal;
+ signal.Connect( this, &TestSlotMultiDisconnector::Slot0 );
+ signal.Connect( this, &TestSlotMultiDisconnector::Slot1 );
+ signal.Connect( this, &TestSlotMultiDisconnector::Slot2 );
+ signal.Connect( this, &TestSlotMultiDisconnector::Slot3 );
+ signal.Connect( this, &TestSlotMultiDisconnector::Slot4 );
+ signal.Connect( this, &TestSlotMultiDisconnector::Slot5 );
+ signal.Connect( this, &TestSlotMultiDisconnector::Slot6 );
+ signal.Connect( this, &TestSlotMultiDisconnector::Slot7 );
+ signal.Connect( this, &TestSlotMultiDisconnector::Slot8 );
+ signal.Connect( this, &TestSlotMultiDisconnector::Slot9 );
+ }
+
+ void Slot0()
+ {
+ mSlotHandled[0] = true;
+ }
+
+ void Slot1()
+ {
+ mSlotHandled[1] = true;
+ }
+
+ void Slot2()
+ {
+ mSlotHandled[2] = true;
+ }
+
+ void Slot3()
+ {
+ mSlotHandled[3] = true;
+
+ // Disconnect the odd numbered lots, because we can
+ mVoidSignalVoid->Disconnect( this, &TestSlotMultiDisconnector::Slot1 );
+ mVoidSignalVoid->Disconnect( this, &TestSlotMultiDisconnector::Slot3 );
+ mVoidSignalVoid->Disconnect( this, &TestSlotMultiDisconnector::Slot5 );
+ mVoidSignalVoid->Disconnect( this, &TestSlotMultiDisconnector::Slot7 );
+ mVoidSignalVoid->Disconnect( this, &TestSlotMultiDisconnector::Slot9 );
+ }
+
+ void Slot4()
+ {
+ mSlotHandled[4] = true;
+ }
+
+ void Slot5()
+ {
+ mSlotHandled[5] = true;
+ }
+
+ void Slot6()
+ {
+ mSlotHandled[6] = true;
+ }
+
+ void Slot7()
+ {
+ mSlotHandled[7] = true;
+ }
+
+ void Slot8()
+ {
+ mSlotHandled[8] = true;
+ }
+
+ void Slot9()
+ {
+ mSlotHandled[9] = true;
+ }
+
+ TestSignals::VoidRetNoParamSignal* mVoidSignalVoid;
+
+ bool mSlotHandled[NUM_SLOTS];
+};
+
+
+/**
+ * A version of TestSlotHandler which disconnects during the callback
+ */
+class TestEmitDuringCallback : public ConnectionTracker
+{
+public:
+
+ TestEmitDuringCallback()
+ : mVoidSignalVoid( NULL ),
+ mHandled( false )
+ {
+ }
+
+ void VoidConnectVoid( TestSignals::VoidRetNoParamSignal& signal )
+ {
+ mVoidSignalVoid = &signal;
+ signal.Connect( this, &TestEmitDuringCallback::VoidSlotVoid );
+ }
+
+ void VoidSlotVoid()
+ {
+ // Emitting during Emit is very bad!
+ mVoidSignalVoid->Emit();
+
+ mHandled = true;
+ }
+
+ TestSignals::VoidRetNoParamSignal* mVoidSignalVoid;
+
+ bool mHandled;
+};
+
+
+/**
+ * A version of TestSlotHandler which uses SlotDelegate
+ */
+class TestSlotDelegateHandler // This does not inherit from ConnectionTrackerInterface!
+{
+public:
+
+ TestSlotDelegateHandler()
+ : mSlotDelegate( this ),
+ mIntParam1( 0 ),
+ mIntParam2( 0 ),
+ mIntParam3( 0 ),
+ mFloatParam1( 0.0f ),
+ mFloatParam2( 0.0f ),
+ mFloatParam3( 0.0f ),
+ mBoolReturn( false ),
+ mIntReturn( 0 ),
+ mFloatReturn( 0.0f ),
+ mHandled( false ),
+ mHandledCount( 0 )
+ {
+ }
+
+ void Reset()
+ {
+ mIntParam1 = 0;
+ mIntParam2 = 0;
+ mIntParam3 = 0;
+ mFloatParam1 = 0.0f;
+ mFloatParam2 = 0.0f;
+ mFloatParam3 = 0.0f;
+ mBoolReturn = false;
+ mIntReturn = 0;
+ mFloatReturn = 0.0f;
+ mHandled = false;
+ }
+
+ void VoidSlotVoid()
+ {
+ mHandled = true;
+ ++mHandledCount;
+ }
+
+ void VoidSlotIntRef( int& p1 )
+ {
+ mIntParam1 = p1;
+ mHandled = true;
+ ++mHandledCount;
+ }
+
+ void VoidSlotIntValue( int p1 )
+ {
+ mIntParam1 = p1;
+ mHandled = true;
+ ++mHandledCount;
+ }
+
+ void VoidDuplicateSlotIntValue( int p1 )
+ {
+ mIntParam2 = p1;
+ mHandled = true;
+ ++mHandledCount;
+ }
+
+ void VoidSlotIntValueIntValue( int p1, int p2 )
+ {
+ mIntParam1 = p1;
+ mIntParam2 = p2;
+ mHandled = true;
+ ++mHandledCount;
+ }
+
+ bool BoolSlotFloatValue( float p1 )
+ {
+ mFloatParam1 = p1;
+ mHandled = true;
+ ++mHandledCount;
+ return mBoolReturn;
+ }
+
+ bool BoolSlotFloatValueIntValue( float p1, int p2 )
+ {
+ mFloatParam1 = p1;
+ mIntParam2 = p2;
+ mHandled = true;
+ ++mHandledCount;
+ return mBoolReturn;
+ }
+
+ int IntSlotFloatValueIntValue( float p1, int p2 )
+ {
+ mFloatParam1 = p1;
+ mIntParam2 = p2;
+ mHandled = true;
+ ++mHandledCount;
+ return mIntReturn;
+ }
+
+ float FloatSlotVoid()
+ {
+ mHandled = true;
+ ++mHandledCount;
+ return mFloatReturn;
+ }
+
+ float FloatSlotFloatValueFloatValue( float p1, float p2 )
+ {
+ mFloatParam1 = p1;
+ mFloatParam2 = p2;
+ mHandled = true;
+ ++mHandledCount;
+ return mFloatReturn;
+ }
+
+ void VoidSlotFloatValue3( float p1, float p2, float p3 )
+ {
+ mFloatParam1 = p1;
+ mFloatParam2 = p2;
+ mFloatParam3 = p3;
+ mHandled = true;
+ ++mHandledCount;
+ }
+
+ float FloatSlotFloatValue3( float p1, float p2, float p3 )
+ {
+ mFloatParam1 = p1;
+ mFloatParam2 = p2;
+ mFloatParam3 = p3;
+ mHandled = true;
+ ++mHandledCount;
+ return mFloatReturn;
+ }
+
+ SlotDelegate<TestSlotDelegateHandler> mSlotDelegate;
+
+ int mIntParam1, mIntParam2, mIntParam3;
+ float mFloatParam1, mFloatParam2, mFloatParam3;
+ bool mBoolReturn;
+ int mIntReturn;
+ float mFloatReturn;
+ bool mHandled;
+ int mHandledCount;
+};
+
+/**
+ * Test that reimplmenting ConnectionTrackerInterface actually works.
+ * This basic connection tracker only allows one callback to be connected.
+ */
+class TestBasicConnectionTrackerInterface : public ConnectionTrackerInterface
+{
+public:
+
+ TestBasicConnectionTrackerInterface()
+ : mCallbackHandled( false ),
+ mCallback( NULL ),
+ mSlotObserver( NULL )
+ {
+ }
+
+ ~TestBasicConnectionTrackerInterface()
+ {
+ if( mCallback )
+ {
+ // Notify signal since the slot has been destroyed
+ mSlotObserver->SlotDisconnected( mCallback );
+ delete mCallback;
+ }
+ }
+
+ /**
+ * An example slot
+ */
+ void VoidSlotVoid()
+ {
+ mCallbackHandled = true;
+ }
+
+ /**
+ * @copydoc ConnectionTrackerInterface::GetConnectionCount
+ */
+ virtual std::size_t GetConnectionCount() const
+ {
+ if( mCallback )
+ {
+ return 1u;
+ }
+
+ return 0u;
+ }
+
+ /**
+ * @copydoc ConnectionTrackerInterface::SignalConnected
+ */
+ virtual void SignalConnected( SlotObserver* slotObserver, CallbackBase* callback )
+ {
+ DALI_ASSERT_ALWAYS( NULL == mCallback && "Only one connection supported!" );
+
+ mCallback = callback;
+ mSlotObserver = slotObserver;
+ }
+
+ /**
+ * @copydoc ConnectionTrackerInterface::SignalDisconnected
+ */
+ virtual void SignalDisconnected( SlotObserver* slotObserver, CallbackBase* callback )
+ {
+ if( mSlotObserver == slotObserver )
+ {
+ mSlotObserver = NULL;
+
+ delete mCallback;
+ mCallback = NULL;
+ }
+ }
+
+private:
+
+ TestBasicConnectionTrackerInterface( const TestBasicConnectionTrackerInterface& ); ///< undefined copy constructor
+ TestBasicConnectionTrackerInterface& operator=( const TestBasicConnectionTrackerInterface& ); ///< undefined assignment operator
+
+public:
+
+ bool mCallbackHandled;
+
+private:
+
+ CallbackBase* mCallback; ///< callback, has ownership
+ SlotObserver* mSlotObserver; ///< a pointer to the slot observer (not owned)
+};
+
+
+bool wasStaticVoidCallbackVoidCalled = false;
+bool wasStaticFloatCallbackVoidCalled = false;
+bool wasStaticVoidCallbackIntValueCalled = false;
+int staticIntValue = 0;
+bool wasStaticFloatCallbackFloatValueFloatValueCalled = false;
+float staticFloatValue1 = 0.0f;
+float staticFloatValue2 = 0.0f;
+
+static void StaticVoidCallbackVoid()
+{
+ wasStaticVoidCallbackVoidCalled = true;
+}
+
+static float StaticFloatCallbackVoid()
+{
+ wasStaticFloatCallbackVoidCalled = true;
+ return 7.0f;
+}
+
+static void StaticVoidCallbackIntValue( int value )
+{
+ wasStaticVoidCallbackIntValueCalled = true;
+ staticIntValue = value;
+}
+
+static float StaticFloatCallbackFloatValueFloatValue( float value1, float value2 )
+{
+ wasStaticFloatCallbackFloatValueFloatValueCalled = true;
+ staticFloatValue1 = value1;
+ staticFloatValue2 = value2;
+ return value1 + value2;
+}
+
+} // anon namespace
+
+
+int UtcDaliSignalEmptyCheck(void)
+{
+ // Test that Empty() check works before & after signal connection
+
+ {
+ TestSignals::VoidRetNoParamSignal signal;
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect( &handler, &TestSlotHandler::VoidSlotVoid );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+
+ {
+ TestSignals::VoidRet1ValueParamSignal signal;
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect( &handler, &TestSlotHandler::VoidSlotIntValue );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+
+ {
+ TestSignals::VoidRet1RefParamSignal signal;
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect( &handler, &TestSlotHandler::VoidSlotIntRef );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+
+ {
+ TestSignals::VoidRet2ValueParamSignal signal;
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect( &handler, &TestSlotHandler::VoidSlotIntValueIntValue );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+
+ {
+ TestSignals::BoolRet1ValueParamSignal signal;
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect( &handler, &TestSlotHandler::BoolSlotFloatValue );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+
+ {
+ TestSignals::BoolRet2ValueParamSignal signal;
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect( &handler, &TestSlotHandler::BoolSlotFloatValueIntValue );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+
+ {
+ TestSignals::IntRet2ValueParamSignal signal;
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect( &handler, &TestSlotHandler::IntSlotFloatValueIntValue );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+
+ {
+ TestSignals::FloatRet0ParamSignal signal;
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect( &handler, &TestSlotHandler::FloatSlotVoid );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+
+ {
+ TestSignals::FloatRet2ValueParamSignal signal;
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect(&handler, &TestSlotHandler::FloatSlotFloatValueFloatValue);
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ END_TEST;
+}
+
+int UtcDaliSignalEmptyCheckSlotDestruction(void)
+{
+ // Test that signal disconnect works when slot is destroyed (goes out of scope)
+
+ {
+ TestSignals::VoidRetNoParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect( &handler, &TestSlotHandler::VoidSlotVoid );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ signal.Emit();
+ }
+
+ {
+ TestSignals::VoidRet1ValueParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect( &handler, &TestSlotHandler::VoidSlotIntValue );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ signal.Emit( 10 );
+ }
+
+ {
+ TestSignals::VoidRet1RefParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect( &handler, &TestSlotHandler::VoidSlotIntRef );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ int temp( 5 );
+ signal.Emit( temp );
+ }
+
+ {
+ TestSignals::VoidRet2ValueParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect( &handler, &TestSlotHandler::VoidSlotIntValueIntValue );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ signal.Emit( 1, 2 );
+ }
+
+ {
+ TestSignals::BoolRet1ValueParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect( &handler, &TestSlotHandler::BoolSlotFloatValue );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ bool blah = signal.Emit( 1.0f );
+ DALI_TEST_CHECK( ! blah );
+ }
+
+ {
+ TestSignals::BoolRet2ValueParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect( &handler, &TestSlotHandler::BoolSlotFloatValueIntValue );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ bool blah = signal.Emit( 1.0f, 2 );
+ DALI_TEST_CHECK( ! blah );
+ }
+
+ {
+ TestSignals::IntRet2ValueParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect( &handler, &TestSlotHandler::IntSlotFloatValueIntValue );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ int blah = signal.Emit( 10.0f, 100 );
+ DALI_TEST_CHECK( 0 == blah );
+ }
+
+ {
+ TestSignals::FloatRet0ParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect( &handler, &TestSlotHandler::FloatSlotVoid );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ float blah = signal.Emit();
+ DALI_TEST_CHECK( 0.0f == blah );
+ }
+
+ {
+ TestSignals::FloatRet2ValueParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotHandler handler;
+ signal.Connect(&handler, &TestSlotHandler::FloatSlotFloatValueFloatValue);
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ float blah = signal.Emit( 3.0f, 4.0f );
+ DALI_TEST_CHECK( 0.0f == blah );
+ }
+ END_TEST;
+}
+
+// Positive test case for a method
+int UtcDaliSignalConnectAndEmit(void)
+{
+ // Test basic signal emission for each slot type
+
+ TestSignals signals;
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalVoidNone().Connect(&handlers, &TestSlotHandler::VoidSlotVoid);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ signals.EmitVoidSignalVoid();
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+
+ // Test double emission
+ handlers.mHandled = false;
+ signals.EmitVoidSignalVoid();
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalVoid1Ref().Connect(&handlers, &TestSlotHandler::VoidSlotIntRef);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ int x = 7;
+ signals.EmitVoidSignalIntRef(x);
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 7, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalVoid1Value().Connect(&handlers, &TestSlotHandler::VoidSlotIntValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ signals.EmitVoidSignalIntValue(5);
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 5, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalVoid2Value().Connect(&handlers, &TestSlotHandler::VoidSlotIntValueIntValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ signals.EmitVoidSignalIntValueIntValue(6, 7);
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 6, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam2, 7, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalBool1Value().Connect(&handlers, &TestSlotHandler::BoolSlotFloatValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+
+ handlers.mBoolReturn = true;
+ DALI_TEST_EQUALS( signals.EmitBoolSignalFloatValue(5.0f), true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 5.0f, TEST_LOCATION );
+
+ // repeat with opposite return value
+ handlers.mBoolReturn = false;
+ handlers.mHandled = false;
+ DALI_TEST_EQUALS( signals.EmitBoolSignalFloatValue(6.0f), false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 6.0f, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalBool2Value().Connect(&handlers, &TestSlotHandler::BoolSlotFloatValueIntValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mBoolReturn = true;
+ DALI_TEST_EQUALS( signals.EmitBoolSignalFloatValueIntValue(5.0f, 10), true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 5.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam2, 10, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalInt2Value().Connect(&handlers, &TestSlotHandler::IntSlotFloatValueIntValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mIntReturn = 27;
+ int x = signals.EmitIntSignalFloatValueIntValue(33.5f, 5);
+ DALI_TEST_EQUALS( x, 27, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 33.5f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam2, 5, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalFloat0().Connect(&handlers, &TestSlotHandler::FloatSlotVoid);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mFloatReturn = 27.0f;
+ float f = signals.EmitFloat0Signal();
+ DALI_TEST_EQUALS( f, 27.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam2, 0.0f, 0.001f, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalFloat2Value().Connect(&handlers, &TestSlotHandler::FloatSlotFloatValueFloatValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mFloatReturn = 27.0f;
+ float f = signals.EmitFloat2VSignal(5, 33.0f);
+ DALI_TEST_EQUALS( f, 27.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 5.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam2, 33.0f, 0.001f, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotHandler handlers;
+ signals.VoidSignalFloatValue3().Connect(&handlers, &TestSlotHandler::VoidSlotFloatValue3);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ signals.EmitVoidSignalFloatValue3(5, 33.0f, 100.0f);
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 5.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam2, 33.0f, 0.001f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam3, 100.0f, 0.001f, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotHandler handlers;
+ signals.FloatSignalFloatValue3().Connect(&handlers, &TestSlotHandler::FloatSlotFloatValue3);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mFloatReturn = 27.0f;
+ float returnValue = signals.EmitFloatSignalFloatValue3(5, 33.0f, 100.0f);
+ DALI_TEST_EQUALS( returnValue, 27.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 5.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam2, 33.0f, 0.001f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam3, 100.0f, 0.001f, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+ END_TEST;
+}
+
+int UtcDaliSignalDisconnect(void)
+{
+ // Test that callbacks don't occur if a signal is disconnected before emission
+
+ TestSignals signals;
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalVoidNone().Connect(&handlers, &TestSlotHandler::VoidSlotVoid);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ signals.SignalVoidNone().Disconnect(&handlers, &TestSlotHandler::VoidSlotVoid);
+ signals.EmitVoidSignalVoid();
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalVoid1Ref().Connect(&handlers, &TestSlotHandler::VoidSlotIntRef);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ int r = 7;
+ handlers.mIntReturn = 5;
+ signals.SignalVoid1Ref().Disconnect(&handlers, &TestSlotHandler::VoidSlotIntRef);
+ signals.EmitVoidSignalIntRef(r);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( r, 7, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalVoid1Value().Connect(&handlers, &TestSlotHandler::VoidSlotIntValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ signals.SignalVoid1Value().Disconnect(&handlers, &TestSlotHandler::VoidSlotIntValue);
+ signals.EmitVoidSignalIntValue(5);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalVoid2Value().Connect(&handlers, &TestSlotHandler::VoidSlotIntValueIntValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ signals.SignalVoid2Value().Disconnect(&handlers, &TestSlotHandler::VoidSlotIntValueIntValue);
+ signals.EmitVoidSignalIntValueIntValue(5, 10);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam2, 0, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalBool1Value().Connect(&handlers, &TestSlotHandler::BoolSlotFloatValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mBoolReturn = true;
+ signals.SignalBool1Value().Disconnect(&handlers, &TestSlotHandler::BoolSlotFloatValue);
+ DALI_TEST_EQUALS( signals.EmitBoolSignalFloatValue(5.0f), false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 0.0f, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalBool2Value().Connect(&handlers, &TestSlotHandler::BoolSlotFloatValueIntValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mBoolReturn = true;
+ signals.SignalBool2Value().Disconnect(&handlers, &TestSlotHandler::BoolSlotFloatValueIntValue);
+ DALI_TEST_EQUALS( signals.EmitBoolSignalFloatValueIntValue(5.0f, 10), false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam2, 0, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalInt2Value().Connect(&handlers, &TestSlotHandler::IntSlotFloatValueIntValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mIntReturn = 27;
+ signals.SignalInt2Value().Disconnect(&handlers, &TestSlotHandler::IntSlotFloatValueIntValue);
+ signals.EmitIntSignalFloatValueIntValue(5, 33.0f);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam2, 0.0f, 0.001f, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalFloat0().Connect(&handlers, &TestSlotHandler::FloatSlotVoid);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mFloatReturn = 27.0f;
+ signals.SignalFloat0().Disconnect(&handlers, &TestSlotHandler::FloatSlotVoid);
+ signals.EmitFloat0Signal();
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 0.0f, 0.001f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam2, 0.0f, 0.001f, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalFloat2Value().Connect(&handlers, &TestSlotHandler::FloatSlotFloatValueFloatValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mFloatReturn = 27.0f;
+ signals.SignalFloat2Value().Disconnect(&handlers, &TestSlotHandler::FloatSlotFloatValueFloatValue);
+ signals.EmitFloat2VSignal(5, 33.0f);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 0.0f, 0.001f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam2, 0.0f, 0.001f, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliSignalDisconnect2(void)
+{
+ // Test that nothing happens when attempting to disconnect an unconnected slot
+
+ TestSignals signals;
+ {
+ TestSlotHandler handlers;
+ signals.SignalVoidNone().Disconnect(&handlers, &TestSlotHandler::VoidSlotVoid);
+ signals.EmitVoidSignalVoid();
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handlers;
+ int r = 7;
+ signals.SignalVoid1Ref().Disconnect(&handlers, &TestSlotHandler::VoidSlotIntRef);
+ signals.EmitVoidSignalIntRef(r);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( r, 7, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalVoid1Value().Disconnect(&handlers, &TestSlotHandler::VoidSlotIntValue);
+ signals.EmitVoidSignalIntValue(5);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalVoid2Value().Disconnect(&handlers, &TestSlotHandler::VoidSlotIntValueIntValue);
+ signals.EmitVoidSignalIntValueIntValue(5, 10);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam2, 0, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handlers;
+ handlers.mBoolReturn = true;
+ signals.SignalBool1Value().Disconnect(&handlers, &TestSlotHandler::BoolSlotFloatValue);
+ DALI_TEST_EQUALS( signals.EmitBoolSignalFloatValue(5.0f), false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 0.0f, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handlers;
+ handlers.mBoolReturn = true;
+ signals.SignalBool2Value().Disconnect(&handlers, &TestSlotHandler::BoolSlotFloatValueIntValue);
+ DALI_TEST_EQUALS( signals.EmitBoolSignalFloatValueIntValue(5.0f, 10), false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam2, 0, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handlers;
+ handlers.mIntReturn = 27;
+ signals.SignalInt2Value().Disconnect(&handlers, &TestSlotHandler::IntSlotFloatValueIntValue);
+ signals.EmitIntSignalFloatValueIntValue(5, 33.0f);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam2, 0.0f, 0.001f, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handlers;
+ handlers.mFloatReturn = 27.0f;
+ signals.SignalFloat2Value().Disconnect(&handlers, &TestSlotHandler::FloatSlotFloatValueFloatValue);
+ signals.EmitFloat2VSignal(5, 33.0f);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 0.0f, 0.001f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam2, 0.0f, 0.001f, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handlers;
+ handlers.mFloatReturn = 27.0f;
+ signals.SignalFloat0().Disconnect(&handlers, &TestSlotHandler::FloatSlotVoid);
+ signals.EmitFloat0Signal();
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 0.0f, 0.001f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam2, 0.0f, 0.001f, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliSignalDisconnect3(void)
+{
+ // Test that callbacks stop after a signal is disconnected
+
+ TestSignals signals;
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalVoidNone().Connect(&handlers, &TestSlotHandler::VoidSlotVoid);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+
+ // Emit first
+ signals.EmitVoidSignalVoid();
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+
+ // Disconnect and emit again
+ handlers.mHandled = false;
+ signals.SignalVoidNone().Disconnect(&handlers, &TestSlotHandler::VoidSlotVoid);
+ signals.EmitVoidSignalVoid();
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handlers;
+ signals.SignalVoid1Ref().Connect(&handlers, &TestSlotHandler::VoidSlotIntRef);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ int r = 7;
+
+ // Emit first
+ signals.EmitVoidSignalIntRef(r);
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 7, TEST_LOCATION );
+
+ // Disconnect and emit again
+ handlers.mHandled = false;
+ handlers.mIntParam1 = 0;
+ signals.SignalVoid1Ref().Disconnect(&handlers, &TestSlotHandler::VoidSlotIntRef);
+ signals.EmitVoidSignalIntRef(r);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( r, 7, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliSignalCustomConnectionTracker(void)
+{
+ // Test slot destruction
+ {
+ TestSignals::VoidRetNoParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestBasicConnectionTrackerInterface customTracker;
+ signal.Connect( &customTracker, &TestBasicConnectionTrackerInterface::VoidSlotVoid );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ signal.Emit();
+ }
+
+ TestBasicConnectionTrackerInterface customTracker2;
+
+ // Test signal emission & destruction
+ {
+ TestSignals::VoidRetNoParamSignal signal;
+ DALI_TEST_CHECK( signal.Empty() );
+ DALI_TEST_EQUALS( 0u, customTracker2.GetConnectionCount(), TEST_LOCATION );
+
+ signal.Connect( &customTracker2, &TestBasicConnectionTrackerInterface::VoidSlotVoid );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ DALI_TEST_EQUALS( 1u, customTracker2.GetConnectionCount(), TEST_LOCATION );
+
+ DALI_TEST_EQUALS( customTracker2.mCallbackHandled, false, TEST_LOCATION );
+ signal.Emit();
+ DALI_TEST_EQUALS( customTracker2.mCallbackHandled, true, TEST_LOCATION );
+ }
+ DALI_TEST_EQUALS( 0u, customTracker2.GetConnectionCount(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliSignalMultipleConnections(void)
+{
+ // Test that multiple callbacks can be connected to the same signal
+
+ TestSignals signals;
+
+ {
+ TestSlotHandler handler1;
+ signals.SignalVoidNone().Connect( &handler1, &TestSlotHandler::VoidSlotVoid );
+ DALI_TEST_EQUALS( handler1.mHandled, false, TEST_LOCATION );
+
+ TestSlotHandler handler2;
+ signals.SignalVoidNone().Connect( &handler2, &TestSlotHandler::VoidSlotVoid );
+ DALI_TEST_EQUALS( handler2.mHandled, false, TEST_LOCATION );
+
+ signals.EmitVoidSignalVoid();
+ DALI_TEST_EQUALS( handler1.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler2.mHandled, true, TEST_LOCATION );
+
+ // Remove first connection and repeat
+ handler1.Reset();
+ handler2.Reset();
+ signals.SignalVoidNone().Disconnect( &handler1, &TestSlotHandler::VoidSlotVoid );
+
+ signals.EmitVoidSignalVoid();
+ DALI_TEST_EQUALS( handler1.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler2.mHandled, true, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handler1;
+ signals.SignalVoid1Ref().Connect( &handler1, &TestSlotHandler::VoidSlotIntRef );
+ DALI_TEST_EQUALS( handler1.mHandled, false, TEST_LOCATION );
+
+ TestSlotHandler handler2;
+ signals.SignalVoid1Ref().Connect( &handler2, &TestSlotHandler::VoidSlotIntRef );
+ DALI_TEST_EQUALS( handler2.mHandled, false, TEST_LOCATION );
+
+ int x = 7;
+ signals.EmitVoidSignalIntRef(x);
+ DALI_TEST_EQUALS( handler1.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler2.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler1.mIntParam1, 7, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler2.mIntParam1, 7, TEST_LOCATION );
+
+ // Remove second connection and repeat
+ handler1.Reset();
+ handler2.Reset();
+ x = 8;
+ signals.SignalVoid1Ref().Disconnect( &handler2, &TestSlotHandler::VoidSlotIntRef );
+
+ signals.EmitVoidSignalIntRef(x);
+ DALI_TEST_EQUALS( handler1.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler2.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler1.mIntParam1, 8, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler2.mIntParam1, 0, TEST_LOCATION );
+ }
+
+ {
+ TestSlotHandler handler1;
+ signals.SignalVoid1Value().Connect( &handler1, &TestSlotHandler::VoidSlotIntValue );
+ DALI_TEST_EQUALS( handler1.mHandled, false, TEST_LOCATION );
+
+ TestSlotHandler handler2;
+ signals.SignalVoid1Value().Connect( &handler2, &TestSlotHandler::VoidSlotIntValue );
+ DALI_TEST_EQUALS( handler2.mHandled, false, TEST_LOCATION );
+
+ TestSlotHandler handler3;
+ signals.SignalVoid1Value().Connect( &handler3, &TestSlotHandler::VoidSlotIntValue );
+ DALI_TEST_EQUALS( handler3.mHandled, false, TEST_LOCATION );
+
+ signals.EmitVoidSignalIntValue( 5 );
+ DALI_TEST_EQUALS( handler1.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler1.mIntParam1, 5, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler2.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler2.mIntParam1, 5, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler3.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler3.mIntParam1, 5, TEST_LOCATION );
+
+ // Remove middle connection and repeat
+ handler1.Reset();
+ handler2.Reset();
+ handler3.Reset();
+ signals.SignalVoid1Value().Disconnect( &handler2, &TestSlotHandler::VoidSlotIntValue );
+
+ signals.EmitVoidSignalIntValue( 6 );
+ DALI_TEST_EQUALS( handler1.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler1.mIntParam1, 6, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler2.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler2.mIntParam1, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler3.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler3.mIntParam1, 6, TEST_LOCATION );
+ }
+
+ // Test that multiple callbacks are disconnected when a signal is destroyed
+
+ TestSlotHandler handler4;
+ TestSlotHandler handler5;
+ TestSlotHandler handler6;
+
+ {
+ TestSignals::VoidRet1ValueParamSignal tempSignal;
+
+ DALI_TEST_EQUALS( handler4.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler5.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler6.GetConnectionCount(), 0u, TEST_LOCATION );
+
+ tempSignal.Connect( &handler4, &TestSlotHandler::VoidSlotIntValue );
+ tempSignal.Connect( &handler5, &TestSlotHandler::VoidSlotIntValue );
+ tempSignal.Connect( &handler6, &TestSlotHandler::VoidSlotIntValue );
+
+ DALI_TEST_EQUALS( handler4.GetConnectionCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler5.GetConnectionCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler6.GetConnectionCount(), 1u, TEST_LOCATION );
+ }
+ // End of tempSignal lifetime
+
+ DALI_TEST_EQUALS( handler4.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler5.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler6.GetConnectionCount(), 0u, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliSignalMultipleConnections2(void)
+{
+ TestSignals signals;
+
+ // Test that connecting the same callback twice is a NOOP
+ {
+ TestSlotHandler handler1;
+
+ // Note the double connection is intentional
+ signals.SignalVoid1Value().Connect( &handler1, &TestSlotHandler::VoidSlotIntValue );
+ signals.SignalVoid1Value().Connect( &handler1, &TestSlotHandler::VoidSlotIntValue );
+ DALI_TEST_EQUALS( handler1.mHandledCount, 0, TEST_LOCATION );
+
+ signals.EmitVoidSignalIntValue( 6 );
+ DALI_TEST_EQUALS( handler1.mHandledCount, 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler1.mIntParam1, 6, TEST_LOCATION );
+
+ // Calling Disconnect once should be enough
+ signals.SignalVoid1Value().Disconnect( &handler1, &TestSlotHandler::VoidSlotIntValue );
+ DALI_TEST_CHECK( signals.SignalVoid1Value().Empty() );
+ handler1.mIntParam1 = 0;
+
+ signals.EmitVoidSignalIntValue( 7 );
+ DALI_TEST_EQUALS( handler1.mHandledCount, 1/*not incremented since last check*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler1.mIntParam1, 0, TEST_LOCATION );
+ }
+
+ // Test automatic disconnect after multiple Connect() calls
+ {
+ TestSlotHandler handler2;
+ signals.SignalVoid1Value().Connect( &handler2, &TestSlotHandler::VoidSlotIntValue );
+ signals.SignalVoid1Value().Connect( &handler2, &TestSlotHandler::VoidSlotIntValue );
+
+ TestSlotHandler handler3;
+ signals.SignalBool1Value().Connect( &handler3, &TestSlotHandler::BoolSlotFloatValue );
+ signals.SignalBool1Value().Connect( &handler3, &TestSlotHandler::BoolSlotFloatValue );
+
+ DALI_TEST_EQUALS( handler2.mHandledCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler3.mHandledCount, 0, TEST_LOCATION );
+ DALI_TEST_CHECK( ! signals.SignalVoid1Value().Empty() );
+ DALI_TEST_CHECK( ! signals.SignalBool1Value().Empty() );
+ }
+ DALI_TEST_CHECK( signals.SignalVoid1Value().Empty() );
+ DALI_TEST_CHECK( signals.SignalBool1Value().Empty() );
+
+ // Should be NOOP
+ signals.EmitVoidSignalIntValue( 1 );
+ signals.EmitBoolSignalFloatValue( 1.0f );
+
+ // Test that connecting the same callback 10 times is a NOOP
+ TestSlotHandler handler4;
+ DALI_TEST_EQUALS( handler4.mHandledCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler4.mFloatParam1, 0.0f, TEST_LOCATION );
+
+ signals.SignalBool1Value().Connect( &handler4, &TestSlotHandler::BoolSlotFloatValue );
+ signals.SignalBool1Value().Connect( &handler4, &TestSlotHandler::BoolSlotFloatValue );
+ signals.SignalBool1Value().Connect( &handler4, &TestSlotHandler::BoolSlotFloatValue );
+ signals.SignalBool1Value().Connect( &handler4, &TestSlotHandler::BoolSlotFloatValue );
+ signals.SignalBool1Value().Connect( &handler4, &TestSlotHandler::BoolSlotFloatValue );
+ signals.SignalBool1Value().Connect( &handler4, &TestSlotHandler::BoolSlotFloatValue );
+ signals.SignalBool1Value().Connect( &handler4, &TestSlotHandler::BoolSlotFloatValue );
+ signals.SignalBool1Value().Connect( &handler4, &TestSlotHandler::BoolSlotFloatValue );
+ signals.SignalBool1Value().Connect( &handler4, &TestSlotHandler::BoolSlotFloatValue );
+ signals.SignalBool1Value().Connect( &handler4, &TestSlotHandler::BoolSlotFloatValue );
+
+ signals.EmitBoolSignalFloatValue( 2.0f );
+ DALI_TEST_EQUALS( handler4.mHandledCount, 1, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler4.mFloatParam1, 2.0f, TEST_LOCATION );
+
+ // Calling Disconnect once should be enough
+ signals.SignalBool1Value().Disconnect( &handler4, &TestSlotHandler::BoolSlotFloatValue );
+ DALI_TEST_CHECK( signals.SignalBool1Value().Empty() );
+
+ signals.EmitBoolSignalFloatValue( 3.0f );
+ DALI_TEST_EQUALS( handler4.mHandledCount, 1/*not incremented since last check*/, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler4.mFloatParam1, 2.0f, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliSignalMultipleConnections3(void)
+{
+ TestSignals signals;
+
+ // Test connecting two difference callbacks for the same ConnectionTracker
+
+ TestSlotHandler handler1;
+
+ {
+ TestSignals::VoidRet1ValueParamSignal tempSignal;
+
+ DALI_TEST_EQUALS( handler1.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler1.mHandledCount, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler1.mIntParam1, 0, TEST_LOCATION );
+
+ // Note that the duplicate connection is deliberate
+ tempSignal.Connect( &handler1, &TestSlotHandler::VoidSlotIntValue );
+ tempSignal.Connect( &handler1, &TestSlotHandler::VoidDuplicateSlotIntValue );
+
+ DALI_TEST_EQUALS( handler1.GetConnectionCount(), 2u, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler1.mHandledCount, 0, TEST_LOCATION );
+
+ tempSignal.Emit( 10 );
+
+ DALI_TEST_EQUALS( handler1.mHandledCount, 2, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler1.mIntParam1, 10, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler1.mIntParam2, 10, TEST_LOCATION );
+ }
+ // End of tempSignal lifetime
+
+ DALI_TEST_EQUALS( handler1.GetConnectionCount(), 0u, TEST_LOCATION );
+ END_TEST;
+}
+
+
+int UtcDaliSignalDisconnectStatic(void)
+{
+ // void Func()
+
+ {
+ TestSignals::VoidRetNoParamSignal signal;
+ DALI_TEST_CHECK( signal.Empty() );
+
+ signal.Connect( StaticVoidCallbackVoid );
+ DALI_TEST_CHECK( ! signal.Empty() );
+
+ wasStaticVoidCallbackVoidCalled = false;
+ signal.Emit();
+ DALI_TEST_EQUALS( wasStaticVoidCallbackVoidCalled, true, TEST_LOCATION );
+
+ signal.Disconnect( StaticVoidCallbackVoid );
+ DALI_TEST_CHECK( signal.Empty() );
+
+ wasStaticVoidCallbackVoidCalled = false;
+ signal.Emit();
+ DALI_TEST_EQUALS( wasStaticVoidCallbackVoidCalled, false, TEST_LOCATION );
+ }
+
+ // float Func()
+
+ {
+ TestSignals::FloatRet0ParamSignal signal;
+ DALI_TEST_CHECK( signal.Empty() );
+
+ signal.Connect( StaticFloatCallbackVoid );
+ DALI_TEST_CHECK( ! signal.Empty() );
+
+ wasStaticFloatCallbackVoidCalled = false;
+ float result = signal.Emit();
+ DALI_TEST_EQUALS( wasStaticFloatCallbackVoidCalled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( result, 7.0f, TEST_LOCATION );
+
+ signal.Disconnect( StaticFloatCallbackVoid );
+ DALI_TEST_CHECK( signal.Empty() );
+
+ wasStaticFloatCallbackVoidCalled = false;
+ result = signal.Emit();
+ DALI_TEST_EQUALS( wasStaticFloatCallbackVoidCalled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( result, 0.0f, TEST_LOCATION );
+ }
+
+ // void Func( int )
+
+ {
+ TestSignals::VoidRet1ValueParamSignal signal;
+ DALI_TEST_CHECK( signal.Empty() );
+
+ signal.Connect( StaticVoidCallbackIntValue );
+ DALI_TEST_CHECK( ! signal.Empty() );
+
+ wasStaticVoidCallbackIntValueCalled = false;
+ staticIntValue = 0;
+ signal.Emit( 10 );
+ DALI_TEST_EQUALS( wasStaticVoidCallbackIntValueCalled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( staticIntValue, 10, TEST_LOCATION );
+
+ signal.Disconnect( StaticVoidCallbackIntValue );
+ DALI_TEST_CHECK( signal.Empty() );
+
+ wasStaticVoidCallbackIntValueCalled = false;
+ staticIntValue = 0;
+ signal.Emit( 11 );
+ DALI_TEST_EQUALS( wasStaticVoidCallbackIntValueCalled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( staticIntValue, 0, TEST_LOCATION );
+ }
+
+ // float Func( float, float )
+
+ {
+ TestSignals::FloatRet2ValueParamSignal signal;
+ DALI_TEST_CHECK( signal.Empty() );
+
+ signal.Connect( StaticFloatCallbackFloatValueFloatValue );
+ DALI_TEST_CHECK( ! signal.Empty() );
+
+ wasStaticFloatCallbackFloatValueFloatValueCalled = false;
+ staticFloatValue1 = 0.0f;
+ staticFloatValue2 = 0.0f;
+ float result = signal.Emit( 5.0f, 6.0f );
+ DALI_TEST_EQUALS( wasStaticFloatCallbackFloatValueFloatValueCalled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( staticFloatValue1, 5.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( staticFloatValue2, 6.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( result, 5.0f+6.0f, TEST_LOCATION );
+
+ signal.Disconnect( StaticFloatCallbackFloatValueFloatValue );
+ DALI_TEST_CHECK( signal.Empty() );
+
+ wasStaticFloatCallbackFloatValueFloatValueCalled = false;
+ staticFloatValue1 = 0.0f;
+ staticFloatValue2 = 0.0f;
+ result = signal.Emit( 7.0f, 8.0f );
+ DALI_TEST_EQUALS( wasStaticFloatCallbackFloatValueFloatValueCalled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( staticFloatValue1, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( staticFloatValue2, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( result, 0.0f, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliSignalDisconnectDuringCallback(void)
+{
+ // Test disconnection during each callback
+
+ TestSignals::VoidRetNoParamSignal signal;
+ DALI_TEST_CHECK( signal.Empty() );
+
+ TestSlotDisconnector handler1;
+ handler1.VoidConnectVoid( signal );
+ DALI_TEST_EQUALS( handler1.mHandled, false, TEST_LOCATION );
+ DALI_TEST_CHECK( ! signal.Empty() );
+
+ signal.Emit();
+ DALI_TEST_EQUALS( handler1.mHandled, true, TEST_LOCATION );
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Repeat with 2 callbacks
+
+ handler1.mHandled = false;
+
+ TestSlotDisconnector handler2;
+ handler1.VoidConnectVoid( signal );
+ handler2.VoidConnectVoid( signal );
+ DALI_TEST_EQUALS( handler1.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler2.mHandled, false, TEST_LOCATION );
+ DALI_TEST_CHECK( ! signal.Empty() );
+
+ signal.Emit();
+ DALI_TEST_EQUALS( handler1.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler2.mHandled, true, TEST_LOCATION );
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Repeat with no callbacks
+
+ handler1.mHandled = false;
+ handler2.mHandled = false;
+
+ signal.Emit();
+ DALI_TEST_EQUALS( handler1.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler2.mHandled, false, TEST_LOCATION );
+
+ // Repeat with 3 callbacks
+
+ TestSlotDisconnector handler3;
+ handler1.VoidConnectVoid( signal );
+ handler2.VoidConnectVoid( signal );
+ handler3.VoidConnectVoid( signal );
+ DALI_TEST_EQUALS( handler1.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler2.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler3.mHandled, false, TEST_LOCATION );
+ DALI_TEST_CHECK( ! signal.Empty() );
+
+ signal.Emit();
+ DALI_TEST_EQUALS( handler1.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler2.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler3.mHandled, true, TEST_LOCATION );
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Repeat with no callbacks
+
+ handler1.mHandled = false;
+ handler2.mHandled = false;
+ handler3.mHandled = false;
+
+ signal.Emit();
+ DALI_TEST_EQUALS( handler1.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler2.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler3.mHandled, false, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliSignalDisconnectDuringCallback2(void)
+{
+ // Test disconnection of some (but not all) callbacks during sigmal emission
+
+ TestSignals::VoidRetNoParamSignal signal;
+ DALI_TEST_CHECK( signal.Empty() );
+
+ TestSlotMultiDisconnector handler;
+ handler.ConnectAll( signal );
+ DALI_TEST_EQUALS( handler.mSlotHandled[0], false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[1], false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[2], false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[3], false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[4], false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[5], false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[6], false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[7], false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[8], false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[9], false, TEST_LOCATION );
+ DALI_TEST_CHECK( ! signal.Empty() );
+
+ signal.Emit();
+
+ // Slots 5, 7, & 9 should be disconnected before being called
+ DALI_TEST_EQUALS( handler.mSlotHandled[0], true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[1], true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[2], true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[3], true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[4], true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[5], false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[6], true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[7], false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[8], true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handler.mSlotHandled[9], false, TEST_LOCATION );
+ DALI_TEST_CHECK( ! signal.Empty() );
+
+ // Odd slots are disconnected
+ DALI_TEST_EQUALS( handler.GetConnectionCount(), 5u, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliSignalEmitDuringCallback(void)
+{
+ TestApplication app; // Create core for debug logging
+
+ TestSignals::VoidRetNoParamSignal signal;
+ DALI_TEST_CHECK( signal.Empty() );
+
+ TestEmitDuringCallback handler1;
+ handler1.VoidConnectVoid( signal );
+
+ // Test that this does not result in an infinite loop!
+ signal.Emit();
+ END_TEST;
+}
+
+int UtcDaliSignalTestApp01(void)
+{
+ // Test 1 signal connected to 1 Slot.
+ // Signal dies first.
+
+ TestButton* button = new TestButton(1);
+ TestApp app;
+ button->DownSignal().Connect(&app,&TestApp::OnButtonPress);
+
+ // check we have both the button, and the app have 1 connection
+ DALI_TEST_EQUALS( app.GetConnectionCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( button->DownSignal().GetConnectionCount(), 1u, TEST_LOCATION );
+
+ delete button; // should automatically destroy the connection
+
+ // check we have a 0 connections
+ DALI_TEST_EQUALS( app.GetConnectionCount(), 0u, TEST_LOCATION );
+
+ END_TEST;
+}
+
+int UtcDaliSignalTestApp02(void)
+{
+ // Test 1 signal connected to 1 Slot.
+ // Slot owning object dies first.
+
+ TestButton button(1);
+ TestApp *app = new TestApp;
+ button.DownSignal().Connect( app, &TestApp::OnButtonPress);
+
+ // check we have a 1 connection
+ DALI_TEST_EQUALS( app->GetConnectionCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( button.DownSignal().GetConnectionCount(), 1u, TEST_LOCATION );
+
+ delete app; // should automatically destroy the connection
+
+ // check we have a 0 connections
+ DALI_TEST_EQUALS( button.DownSignal().GetConnectionCount(), 0u, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliSignalTestApp03(void)
+{
+ // Test 1 Signal connect to 2 slots
+ // 1 of the slot owners dies. Then the second slot owner dies
+
+ TestButton button(1);
+ TestApp *app1 = new TestApp;
+ TestApp *app2 = new TestApp;
+
+ button.DownSignal().Connect( app1, &TestApp::OnButtonPress);
+ button.DownSignal().Connect( app2, &TestApp::OnButtonPress);
+
+ // check we have a 2 connections to the signal
+ DALI_TEST_EQUALS( button.DownSignal().GetConnectionCount(), 2u, TEST_LOCATION );
+
+ // kill the first slot
+ delete app1; // should automatically destroy the connection
+
+ // check we have 1 connection left
+ DALI_TEST_EQUALS( button.DownSignal().GetConnectionCount(), 1u, TEST_LOCATION );
+
+ button.Press(); // emit the signal (to ensure it doesn't seg fault)
+
+ // kill the second slot
+ delete app2; // should automatically destroy the connection
+
+ // check we have 1 connection left
+ DALI_TEST_EQUALS( button.DownSignal().GetConnectionCount(), 0u, TEST_LOCATION );
+
+ END_TEST;
+}
+
+int UtcDaliSignalTestApp04(void)
+{
+ // Test 1 Signal connected to 2 slots (with different owners)
+ // The Signal dies, check the 2 slots disconnect automatically
+
+ TestButton* button = new TestButton(1);
+ TestApp app1;
+ TestApp app2;
+
+ button->DownSignal().Connect(&app1,&TestApp::OnButtonPress);
+ button->DownSignal().Connect(&app2,&TestApp::OnButtonPress);
+
+ // check the connection counts
+ DALI_TEST_EQUALS( app1.GetConnectionCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( app2.GetConnectionCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( button->DownSignal().GetConnectionCount(), 2u, TEST_LOCATION );
+
+ delete button; // should automatically destroy the connection
+
+ // check both slot owners have zero connections
+ DALI_TEST_EQUALS( app1.GetConnectionCount(), 0u, TEST_LOCATION );
+ DALI_TEST_EQUALS( app2.GetConnectionCount(), 0u, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliSignalTestApp05(void)
+{
+ // Test 2 Signals (with different owners) connected to 1 slots
+ // 1 Signal dies, check that the remaining connection is valid
+
+ TestButton* button1 = new TestButton(1); // use for signal 1
+ TestButton* button2 = new TestButton(2); // use for signal 2
+
+ TestApp app;
+
+ button1->DownSignal().Connect(&app,&TestApp::OnButtonPress);
+ button2->DownSignal().Connect(&app,&TestApp::OnButtonPress);
+
+ // check the connection counts
+ DALI_TEST_EQUALS( app.GetConnectionCount(), 2u, TEST_LOCATION );
+ DALI_TEST_EQUALS( button1->DownSignal().GetConnectionCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( button2->DownSignal().GetConnectionCount(), 1u, TEST_LOCATION );
+
+ // make sure both signals emit ok
+ button2->Press();
+ DALI_TEST_EQUALS( app.GetButtonPressedId() , 2 , TEST_LOCATION );
+
+ button1->Press();
+ DALI_TEST_EQUALS( app.GetButtonPressedId() , 1 , TEST_LOCATION );
+
+ delete button1; // should automatically destroy 1 connection
+
+ // check both slot owners have zero connections
+ DALI_TEST_EQUALS( app.GetConnectionCount(), 1u, TEST_LOCATION );
+
+ // check remaining connection still works
+ button2->Press();
+ DALI_TEST_EQUALS( app.GetButtonPressedId() , 2 , TEST_LOCATION );
+
+ // kill the last signal
+ delete button2;
+ DALI_TEST_EQUALS( app.GetConnectionCount(), 0u, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliSignalTestApp06(void)
+{
+ SignalV2< bool () > boolSignal;
+ TestApp app;
+ bool result(false);
+
+ // connect a slot which will return false
+ boolSignal.Connect( &app, &TestApp::BoolReturnTestFalse);
+ result = boolSignal.Emit();
+ DALI_TEST_EQUALS( result, false, TEST_LOCATION );
+
+ // disconnect last slot, and connect a slot which returns true
+ boolSignal.Disconnect( &app, &TestApp::BoolReturnTestFalse);
+ boolSignal.Connect( &app, &TestApp::BoolReturnTestTrue);
+ result = boolSignal.Emit();
+ DALI_TEST_EQUALS( result, true, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliSlotDelegateConnection(void)
+{
+ TestSignals signals;
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalVoidNone().Connect( handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotVoid );
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ signals.EmitVoidSignalVoid();
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+
+ // Test double emission
+ handlers.mHandled = false;
+ signals.EmitVoidSignalVoid();
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalVoid1Ref().Connect( handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntRef );
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ int x = 7;
+ signals.EmitVoidSignalIntRef(x);
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 7, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalVoid1Value().Connect( handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntValue );
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ signals.EmitVoidSignalIntValue(5);
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 5, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalVoid2Value().Connect( handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntValueIntValue );
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ signals.EmitVoidSignalIntValueIntValue(6, 7);
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 6, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam2, 7, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalBool1Value().Connect( handlers.mSlotDelegate, &TestSlotDelegateHandler::BoolSlotFloatValue );
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+
+ handlers.mBoolReturn = true;
+ DALI_TEST_EQUALS( signals.EmitBoolSignalFloatValue(5.0f), true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 5.0f, TEST_LOCATION );
+
+ // repeat with opposite return value
+ handlers.mBoolReturn = false;
+ handlers.mHandled = false;
+ DALI_TEST_EQUALS( signals.EmitBoolSignalFloatValue(6.0f), false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 6.0f, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalBool2Value().Connect( handlers.mSlotDelegate, &TestSlotDelegateHandler::BoolSlotFloatValueIntValue );
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mBoolReturn = true;
+ DALI_TEST_EQUALS( signals.EmitBoolSignalFloatValueIntValue(5.0f, 10), true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 5.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam2, 10, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalInt2Value().Connect( handlers.mSlotDelegate, &TestSlotDelegateHandler::IntSlotFloatValueIntValue );
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mIntReturn = 27;
+ int x = signals.EmitIntSignalFloatValueIntValue(33.5f, 5);
+ DALI_TEST_EQUALS( x, 27, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 33.5f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam2, 5, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalFloat0().Connect( handlers.mSlotDelegate, &TestSlotDelegateHandler::FloatSlotVoid );
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mFloatReturn = 27.0f;
+ float f = signals.EmitFloat0Signal();
+ DALI_TEST_EQUALS( f, 27.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam2, 0.0f, 0.001f, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalFloat2Value().Connect( handlers.mSlotDelegate, &TestSlotDelegateHandler::FloatSlotFloatValueFloatValue );
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mFloatReturn = 27.0f;
+ float f = signals.EmitFloat2VSignal(5, 33.0f);
+ DALI_TEST_EQUALS( f, 27.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 5.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam2, 33.0f, 0.001f, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.VoidSignalFloatValue3().Connect( handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotFloatValue3 );
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ signals.EmitVoidSignalFloatValue3(5, 33.0f, 100.0f);
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 5.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam2, 33.0f, 0.001f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam3, 100.0f, 0.001f, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.FloatSignalFloatValue3().Connect( handlers.mSlotDelegate, &TestSlotDelegateHandler::FloatSlotFloatValue3 );
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mFloatReturn = 27.0f;
+ float returnValue = signals.EmitFloatSignalFloatValue3(5, 33.0f, 100.0f);
+ DALI_TEST_EQUALS( returnValue, 27.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, true, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 5.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam2, 33.0f, 0.001f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam3, 100.0f, 0.001f, TEST_LOCATION );
+ }
+ signals.CheckNoConnections();
+ END_TEST;
+}
+
+int UtcDaliSignalSlotDelegateDestruction(void)
+{
+ // Test that signal disconnect works when slot-delegate is destroyed (goes out of scope)
+
+ {
+ TestSignals::VoidRetNoParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotDelegateHandler handler;
+ signal.Connect( handler.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotVoid );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ signal.Emit();
+ }
+
+ {
+ TestSignals::VoidRet1ValueParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotDelegateHandler handler;
+ signal.Connect( handler.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntValue );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ signal.Emit( 10 );
+ }
+
+ {
+ TestSignals::VoidRet1RefParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotDelegateHandler handler;
+ signal.Connect( handler.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntRef );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ int temp( 5 );
+ signal.Emit( temp );
+ }
+
+ {
+ TestSignals::VoidRet2ValueParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotDelegateHandler handler;
+ signal.Connect( handler.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntValueIntValue );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ signal.Emit( 1, 2 );
+ }
+
+ {
+ TestSignals::BoolRet1ValueParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotDelegateHandler handler;
+ signal.Connect( handler.mSlotDelegate, &TestSlotDelegateHandler::BoolSlotFloatValue );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ bool blah = signal.Emit( 1.0f );
+ DALI_TEST_CHECK( ! blah );
+ }
+
+ {
+ TestSignals::BoolRet2ValueParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotDelegateHandler handler;
+ signal.Connect( handler.mSlotDelegate, &TestSlotDelegateHandler::BoolSlotFloatValueIntValue );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ bool blah = signal.Emit( 1.0f, 2 );
+ DALI_TEST_CHECK( ! blah );
+ }
+
+ {
+ TestSignals::IntRet2ValueParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotDelegateHandler handler;
+ signal.Connect( handler.mSlotDelegate, &TestSlotDelegateHandler::IntSlotFloatValueIntValue );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ int blah = signal.Emit( 10.0f, 100 );
+ DALI_TEST_CHECK( 0 == blah );
+ }
+
+ {
+ TestSignals::FloatRet0ParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotDelegateHandler handler;
+ signal.Connect( handler.mSlotDelegate, &TestSlotDelegateHandler::FloatSlotVoid );
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ float blah = signal.Emit();
+ DALI_TEST_CHECK( 0.0f == blah );
+ }
+
+ {
+ TestSignals::FloatRet2ValueParamSignal signal;
+ {
+ DALI_TEST_CHECK( signal.Empty() );
+ TestSlotDelegateHandler handler;
+ signal.Connect(handler.mSlotDelegate, &TestSlotDelegateHandler::FloatSlotFloatValueFloatValue);
+ DALI_TEST_CHECK( ! signal.Empty() );
+ }
+ // End of slot lifetime
+ DALI_TEST_CHECK( signal.Empty() );
+
+ // Signal emission should be a NOOP
+ float blah = signal.Emit( 3.0f, 4.0f );
+ DALI_TEST_CHECK( 0.0f == blah );
+ }
+ END_TEST;
+}
+
+int UtcDaliSlotHandlerDisconnect(void)
+{
+ // Test that callbacks don't occur if a signal is disconnected before emission
+
+ TestSignals signals;
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalVoidNone().Connect(handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotVoid);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ signals.SignalVoidNone().Disconnect(handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotVoid);
+ signals.EmitVoidSignalVoid();
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ }
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalVoid1Ref().Connect(handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntRef);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ int r = 7;
+ handlers.mIntReturn = 5;
+ signals.SignalVoid1Ref().Disconnect(handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntRef);
+ signals.EmitVoidSignalIntRef(r);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( r, 7, TEST_LOCATION );
+ }
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalVoid1Value().Connect(handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ signals.SignalVoid1Value().Disconnect(handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntValue);
+ signals.EmitVoidSignalIntValue(5);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
+ }
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalVoid2Value().Connect(handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntValueIntValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ signals.SignalVoid2Value().Disconnect(handlers.mSlotDelegate, &TestSlotDelegateHandler::VoidSlotIntValueIntValue);
+ signals.EmitVoidSignalIntValueIntValue(5, 10);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam2, 0, TEST_LOCATION );
+ }
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalBool1Value().Connect(handlers.mSlotDelegate, &TestSlotDelegateHandler::BoolSlotFloatValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mBoolReturn = true;
+ signals.SignalBool1Value().Disconnect(handlers.mSlotDelegate, &TestSlotDelegateHandler::BoolSlotFloatValue);
+ DALI_TEST_EQUALS( signals.EmitBoolSignalFloatValue(5.0f), false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 0.0f, TEST_LOCATION );
+ }
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalBool2Value().Connect(handlers.mSlotDelegate, &TestSlotDelegateHandler::BoolSlotFloatValueIntValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mBoolReturn = true;
+ signals.SignalBool2Value().Disconnect(handlers.mSlotDelegate, &TestSlotDelegateHandler::BoolSlotFloatValueIntValue);
+ DALI_TEST_EQUALS( signals.EmitBoolSignalFloatValueIntValue(5.0f, 10), false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 0.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam2, 0, TEST_LOCATION );
+ }
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalInt2Value().Connect(handlers.mSlotDelegate, &TestSlotDelegateHandler::IntSlotFloatValueIntValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mIntReturn = 27;
+ signals.SignalInt2Value().Disconnect(handlers.mSlotDelegate, &TestSlotDelegateHandler::IntSlotFloatValueIntValue);
+ signals.EmitIntSignalFloatValueIntValue(5, 33.0f);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mIntParam1, 0, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam2, 0.0f, 0.001f, TEST_LOCATION );
+ }
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalFloat0().Connect(handlers.mSlotDelegate, &TestSlotDelegateHandler::FloatSlotVoid);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mFloatReturn = 27.0f;
+ signals.SignalFloat0().Disconnect(handlers.mSlotDelegate, &TestSlotDelegateHandler::FloatSlotVoid);
+ signals.EmitFloat0Signal();
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 0.0f, 0.001f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam2, 0.0f, 0.001f, TEST_LOCATION );
+ }
+
+ {
+ TestSlotDelegateHandler handlers;
+ signals.SignalFloat2Value().Connect(handlers.mSlotDelegate, &TestSlotDelegateHandler::FloatSlotFloatValueFloatValue);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ handlers.mFloatReturn = 27.0f;
+ signals.SignalFloat2Value().Disconnect(handlers.mSlotDelegate, &TestSlotDelegateHandler::FloatSlotFloatValueFloatValue);
+ signals.EmitFloat2VSignal(5, 33.0f);
+ DALI_TEST_EQUALS( handlers.mHandled, false, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam1, 0.0f, 0.001f, TEST_LOCATION );
+ DALI_TEST_EQUALS( handlers.mFloatParam2, 0.0f, 0.001f, TEST_LOCATION );
+ }
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+
+#include <dali/dali.h>
+#include <dali/integration-api/events/key-event-integ.h>
+#include <dali/integration-api/events/touch-event-integ.h>
+
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+using namespace std;
+
+void stage_test_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void stage_test_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+/**
+ * Functor for EventProcessingFinished signal
+ */
+struct EventProcessingFinishedFunctor
+{
+ /**
+ * @param[in] eventProcessingFinished reference to a boolean variable used to check if signal has been called.
+ */
+ EventProcessingFinishedFunctor( bool& eventProcessingFinished )
+ : mEventProcessingFinished( eventProcessingFinished )
+ {}
+
+ void operator()()
+ {
+ mEventProcessingFinished = true;
+ }
+
+ bool& mEventProcessingFinished;
+};
+
+// Stores data that is populated in the key-event callback and will be read by the TET cases
+struct KeyEventSignalData
+{
+ KeyEventSignalData()
+ : functorCalled(false)
+ {}
+
+ void Reset()
+ {
+ functorCalled = false;
+
+ receivedKeyEvent.keyModifier = 0;
+ receivedKeyEvent.keyPressedName.clear();
+ receivedKeyEvent.keyPressed.clear();
+ }
+
+ bool functorCalled;
+ KeyEvent receivedKeyEvent;
+};
+
+// Functor that sets the data when called
+struct KeyEventReceivedFunctor
+{
+ KeyEventReceivedFunctor( KeyEventSignalData& data ) : signalData( data ) { }
+
+ bool operator()( const KeyEvent& keyEvent )
+ {
+ signalData.functorCalled = true;
+ signalData.receivedKeyEvent = keyEvent;
+
+ return true;
+ }
+
+ KeyEventSignalData& signalData;
+};
+
+// Stores data that is populated in the touched signal callback and will be read by the TET cases
+struct TouchedSignalData
+{
+ TouchedSignalData()
+ : functorCalled(false)
+ {}
+
+ void Reset()
+ {
+ functorCalled = false;
+
+ receivedTouchEvent.points.clear();
+ receivedTouchEvent.time = 0;
+ }
+
+ bool functorCalled;
+ TouchEvent receivedTouchEvent;
+};
+
+// Functor that sets the data when touched signal is received
+struct TouchedFunctor
+{
+ TouchedFunctor( TouchedSignalData& data ) : signalData( data ) { }
+
+ void operator()( const TouchEvent& touch )
+ {
+ signalData.functorCalled = true;
+ signalData.receivedTouchEvent = touch;
+ }
+
+ TouchedSignalData& signalData;
+};
+
+bool DummyTouchCallback( Actor actor, const TouchEvent& touch )
+{
+ return true;
+}
+
+} // unnamed namespace
+
+
+int UtcDaliStageDefaultConstructor(void)
+{
+ TestApplication application;
+ Stage stage;
+
+ DALI_TEST_CHECK(!stage);
+ END_TEST;
+}
+
+int UtcDaliStageDestructor(void)
+{
+ TestApplication application;
+ Stage* stage = new Stage();
+ delete stage;
+ stage = NULL;
+
+ DALI_TEST_CHECK( true );
+ END_TEST;
+}
+
+int UtcDaliStageGetCurrent(void)
+{
+ TestApplication application;
+ Stage stage = Stage::GetCurrent();
+
+ DALI_TEST_CHECK(stage);
+ END_TEST;
+}
+
+int UtcDaliStageIsInstalled(void)
+{
+ DALI_TEST_CHECK(!Stage::IsInstalled());
+
+ TestApplication application;
+
+ Stage::GetCurrent();
+
+ DALI_TEST_CHECK(Stage::IsInstalled());
+ END_TEST;
+}
+
+int UtcDaliStageAdd(void)
+{
+ TestApplication application;
+
+ Stage stage = Stage::GetCurrent();
+
+ Actor actor = Actor::New();
+ DALI_TEST_CHECK(!actor.OnStage());
+
+ stage.Add(actor);
+ DALI_TEST_CHECK(actor.OnStage());
+ END_TEST;
+}
+
+int UtcDaliStageRemove(void)
+{
+ TestApplication application;
+
+ Stage stage = Stage::GetCurrent();
+
+ Actor actor = Actor::New();
+ DALI_TEST_CHECK(!actor.OnStage());
+
+ stage.Add(actor);
+ DALI_TEST_CHECK(actor.OnStage());
+
+ stage.Remove(actor);
+ DALI_TEST_CHECK(!actor.OnStage());
+ END_TEST;
+}
+
+int UtcDaliStageGetSize(void)
+{
+ TestApplication application;
+
+ Stage stage = Stage::GetCurrent();
+
+ Vector2 size = stage.GetSize();
+
+ DALI_TEST_EQUALS(size.width, static_cast<float>(TestApplication::DEFAULT_SURFACE_WIDTH), TEST_LOCATION);
+ DALI_TEST_EQUALS(size.height, static_cast<float>(TestApplication::DEFAULT_SURFACE_HEIGHT), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliStageGetDpi01(void)
+{
+ TestApplication application; // Initializes core DPI to default values
+
+ Stage stage = Stage::GetCurrent();
+
+ // Test the default DPI.
+ Vector2 dpi = stage.GetDpi();
+ DALI_TEST_EQUALS(dpi.x, static_cast<float>(TestApplication::DEFAULT_HORIZONTAL_DPI), TEST_LOCATION);
+ DALI_TEST_EQUALS(dpi.y, static_cast<float>(TestApplication::DEFAULT_VERTICAL_DPI), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliStageGetDpi02(void)
+{
+ TestApplication application; // Initializes core DPI to default values
+
+ // Test that setting core DPI explicitly also sets up the Stage's DPI.
+ application.GetCore().SetDpi(200, 180);
+
+ Stage stage = Stage::GetCurrent();
+ Vector2 dpi = stage.GetDpi();
+ DALI_TEST_EQUALS(dpi.x, 200.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(dpi.y, 180.0f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliStageGetDpi03(void)
+{
+ TestApplication application(480, 800, 72.0f, 120.0f); // Initializes core DPI with specific values
+
+ Stage stage = Stage::GetCurrent();
+
+ // Test that setting core DPI explicitly also sets up the Stage's DPI.
+ Vector2 dpi = stage.GetDpi();
+ DALI_TEST_EQUALS(dpi.x, 72.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(dpi.y, 120.0f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliStageGetLayerCount(void)
+{
+ TestApplication application;
+
+ Stage stage = Stage::GetCurrent();
+
+ // Initially we have a default layer
+ DALI_TEST_EQUALS(stage.GetLayerCount(), 1u, TEST_LOCATION);
+
+ Layer layer = Layer::New();
+ stage.Add(layer);
+
+ DALI_TEST_EQUALS(stage.GetLayerCount(), 2u, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliStageGetLayer(void)
+{
+ TestApplication application;
+
+ Stage stage = Stage::GetCurrent();
+
+ Layer rootLayer = stage.GetLayer(0);
+ DALI_TEST_CHECK(rootLayer);
+
+ Layer layer = Layer::New();
+ stage.Add(layer);
+
+ Layer sameLayer = stage.GetLayer(1);
+ DALI_TEST_CHECK(layer == sameLayer);
+ END_TEST;
+}
+
+
+int UtcDaliStageGetRootLayer(void)
+{
+ TestApplication application;
+
+ Stage stage = Stage::GetCurrent();
+
+ Layer rootLayer = stage.GetLayer(0);
+ DALI_TEST_CHECK( rootLayer );
+
+ Layer layer = Layer::New();
+ stage.Add( layer );
+ layer.LowerToBottom();
+
+ DALI_TEST_CHECK( stage.GetRootLayer() == rootLayer );
+ END_TEST;
+}
+
+int UtcDaliStageSetBackgroundColor(void)
+{
+ TestApplication application;
+
+ Stage stage = Stage::GetCurrent();
+
+ Vector4 testColor(0.1f, 0.2f, 0.3f, 1.0f);
+ stage.SetBackgroundColor(testColor);
+
+ DALI_TEST_EQUALS(testColor, stage.GetBackgroundColor(), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliStageGetBackgroundColor(void)
+{
+ TestApplication application;
+
+ Stage stage = Stage::GetCurrent();
+
+ DALI_TEST_EQUALS(Stage::DEFAULT_BACKGROUND_COLOR, stage.GetBackgroundColor(), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliStageKeepRendering(void)
+{
+ TestApplication application;
+
+ Stage stage = Stage::GetCurrent();
+
+ // Run core until it wants to sleep
+ bool keepUpdating( true );
+ while ( keepUpdating )
+ {
+ application.SendNotification();
+ keepUpdating = application.Render(1000.0f /*1 second*/);
+ }
+
+ // Force rendering for the next 5 seconds
+ stage.KeepRendering( 5.0f );
+
+ application.SendNotification();
+
+ // Test that core wants to sleep after 10 seconds
+ keepUpdating = application.Render(1000.0f /*1 second*/);
+ DALI_TEST_CHECK( keepUpdating );
+ keepUpdating = application.Render(1000.0f /*2 seconds*/);
+ DALI_TEST_CHECK( keepUpdating );
+ keepUpdating = application.Render(1000.0f /*3 seconds*/);
+ DALI_TEST_CHECK( keepUpdating );
+ keepUpdating = application.Render(1000.0f /*4 seconds*/);
+ DALI_TEST_CHECK( keepUpdating );
+ keepUpdating = application.Render(1000.0f /*5 seconds*/);
+ DALI_TEST_CHECK( !keepUpdating );
+ END_TEST;
+}
+
+int UtcDaliStageEventProcessingFinished(void)
+{
+ TestApplication application;
+ Stage stage = Stage::GetCurrent();
+
+ bool eventProcessingFinished = false;
+ EventProcessingFinishedFunctor functor( eventProcessingFinished );
+ stage.EventProcessingFinishedSignal().Connect( &application, functor );
+
+ Actor actor( Actor::New() );
+ stage.Add( actor );
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK( eventProcessingFinished );
+
+ END_TEST;
+}
+
+int UtcDaliStageSignalKeyEvent(void)
+{
+ TestApplication application;
+ Stage stage = Stage::GetCurrent();
+
+ KeyEventSignalData data;
+ KeyEventReceivedFunctor functor( data );
+ stage.KeyEventSignal().Connect( &application, functor );
+
+ Integration::KeyEvent event( "i","i", 0, 0, 0, Integration::KeyEvent::Down );
+ application.ProcessEvent( event );
+
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( event.keyModifier == data.receivedKeyEvent.keyModifier );
+ DALI_TEST_CHECK( event.keyName == data.receivedKeyEvent.keyPressedName );
+ DALI_TEST_CHECK( event.keyString == data.receivedKeyEvent.keyPressed );
+ DALI_TEST_CHECK( event.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
+
+ data.Reset();
+
+ Integration::KeyEvent event2( "i","i", 0, 0, 0, Integration::KeyEvent::Up );
+ application.ProcessEvent( event2 );
+
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( event2.keyModifier == data.receivedKeyEvent.keyModifier );
+ DALI_TEST_CHECK( event2.keyName == data.receivedKeyEvent.keyPressedName );
+ DALI_TEST_CHECK( event2.keyString == data.receivedKeyEvent.keyPressed );
+ DALI_TEST_CHECK( event2.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
+
+ data.Reset();
+
+ Integration::KeyEvent event3( "a","a", 0, 0, 0, Integration::KeyEvent::Down );
+ application.ProcessEvent( event3 );
+
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( event3.keyModifier == data.receivedKeyEvent.keyModifier );
+ DALI_TEST_CHECK( event3.keyName == data.receivedKeyEvent.keyPressedName );
+ DALI_TEST_CHECK( event3.keyString == data.receivedKeyEvent.keyPressed );
+ DALI_TEST_CHECK( event3.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
+
+ data.Reset();
+
+ Integration::KeyEvent event4( "a","a", 0, 0, 0, Integration::KeyEvent::Up );
+ application.ProcessEvent( event4 );
+
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( event4.keyModifier == data.receivedKeyEvent.keyModifier );
+ DALI_TEST_CHECK( event4.keyName == data.receivedKeyEvent.keyPressedName );
+ DALI_TEST_CHECK( event4.keyString == data.receivedKeyEvent.keyPressed );
+ DALI_TEST_CHECK( event4.state == static_cast<Integration::KeyEvent::State>(data.receivedKeyEvent.state) );
+ END_TEST;
+}
+
+int UtcDaliStageTouchedSignal(void)
+{
+ TestApplication application;
+ Stage stage = Stage::GetCurrent();
+
+ TouchedSignalData data;
+ TouchedFunctor functor( data );
+ stage.TouchedSignal().Connect( &application, functor );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // NO ACTORS, SINGLE TOUCH, DOWN, MOTION THEN UP
+ {
+ Integration::TouchEvent touchEvent;
+ touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
+ application.ProcessEvent( touchEvent );
+
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
+ DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
+ data.Reset();
+
+ touchEvent.points[0].state = TouchPoint::Motion;
+ touchEvent.points[0].screen.x = 12.0f; // Some motion
+ application.ProcessEvent( touchEvent );
+
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ touchEvent.points[0].state = TouchPoint::Up;
+ application.ProcessEvent( touchEvent );
+
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
+ DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
+ data.Reset();
+ }
+
+ // Add an actor to the scene
+
+ Actor actor = Actor::New();
+ actor.SetSize( 100.0f, 100.0f );
+ actor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+ actor.SetParentOrigin( ParentOrigin::TOP_LEFT );
+ actor.TouchedSignal().Connect( &DummyTouchCallback );
+ stage.Add( actor );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // ACTOR ON SCENE, SINGLE TOUCH, DOWN IN ACTOR, MOTION THEN UP OUTSIDE ACTOR
+ {
+ Integration::TouchEvent touchEvent;
+ touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
+ application.ProcessEvent( touchEvent );
+
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
+ DALI_TEST_CHECK( data.receivedTouchEvent.points[0].hitActor == actor );
+ data.Reset();
+
+ touchEvent.points[0].state = TouchPoint::Motion;
+ touchEvent.points[0].screen.x = 150.0f; // Some motion
+ application.ProcessEvent( touchEvent );
+
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ touchEvent.points[0].state = TouchPoint::Up;
+ application.ProcessEvent( touchEvent );
+
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
+ DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
+ data.Reset();
+ }
+
+ // INTERRUPTED BEFORE DOWN AND INTERRUPTED AFTER DOWN
+ {
+ Integration::TouchEvent touchEvent;
+ touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Interrupted, 10.0f, 10.0f ) );
+ application.ProcessEvent( touchEvent );
+
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
+ DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
+ DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Interrupted );
+ data.Reset();
+
+ touchEvent.points[0].state = TouchPoint::Down;
+ application.ProcessEvent( touchEvent );
+
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
+ DALI_TEST_CHECK( data.receivedTouchEvent.points[0].hitActor == actor );
+ DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Down );
+ data.Reset();
+
+ touchEvent.points[0].state = TouchPoint::Interrupted;
+ application.ProcessEvent( touchEvent );
+
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( data.receivedTouchEvent.GetPointCount() != 0 );
+ DALI_TEST_CHECK( !data.receivedTouchEvent.points[0].hitActor );
+ DALI_TEST_CHECK( data.receivedTouchEvent.points[0].state == TouchPoint::Interrupted );
+ data.Reset();
+ }
+
+ // MULTIPLE TOUCH, SHOULD ONLY RECEIVE TOUCH ON FIRST DOWN AND LAST UP
+ {
+ Integration::TouchEvent touchEvent;
+
+ // 1st point
+ touchEvent.points.push_back( TouchPoint( 0, TouchPoint::Down, 10.0f, 10.0f ) );
+ application.ProcessEvent( touchEvent );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // 2nd point
+ touchEvent.points[0].state = TouchPoint::Stationary;
+ touchEvent.points.push_back( TouchPoint( 1, TouchPoint::Down, 50.0f, 50.0f ) );
+ application.ProcessEvent( touchEvent );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Primary point is up
+ touchEvent.points[0].state = TouchPoint::Up;
+ touchEvent.points[1].state = TouchPoint::Stationary;
+ application.ProcessEvent( touchEvent );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Remove 1st point now, 2nd point is now in motion
+ touchEvent.points.erase( touchEvent.points.begin() );
+ touchEvent.points[0].state = TouchPoint::Motion;
+ touchEvent.points[0].screen.x = 150.0f;
+ application.ProcessEvent( touchEvent );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Final point Up
+ touchEvent.points[0].state = TouchPoint::Up;
+ application.ProcessEvent( touchEvent );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+ }
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_tap_gesture_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_tap_gesture_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+// Positive test case for a method
+int UtcDaliTapGestureConstructor(void)
+{
+ TestApplication application; // Reset all test adapter return codes
+
+ TapGesture gesture;
+ DALI_TEST_EQUALS(1u, gesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, gesture.numberOfTaps, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Tap, gesture.type, TEST_LOCATION);
+
+ // Test Copy constructor
+ gesture.numberOfTouches = 5u;
+ gesture.numberOfTaps = 2u;
+
+ TapGesture gesture2(gesture);
+ DALI_TEST_EQUALS(5u, gesture2.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(2u, gesture2.numberOfTaps, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Tap, gesture2.type, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureAssignment(void)
+{
+ // Test Assignment operator
+ TapGesture gesture;
+ DALI_TEST_EQUALS(1u, gesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, gesture.numberOfTaps, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Tap, gesture.type, TEST_LOCATION);
+
+ gesture.numberOfTouches = 5u;
+ gesture.numberOfTaps = 2u;
+
+ TapGesture gesture2;
+ gesture2 = gesture;
+ DALI_TEST_EQUALS(5u, gesture2.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS(2u, gesture2.numberOfTaps, TEST_LOCATION);
+ DALI_TEST_EQUALS(Gesture::Tap, gesture2.type, TEST_LOCATION);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/integration-api/events/touch-event-integ.h>
+#include <dali/integration-api/events/tap-gesture-event.h>
+#include <dali/integration-api/system-overlay.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_tap_gesture_detector_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_tap_gesture_detector_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+namespace
+{
+
+// Stores data that is populated in the callback and will be read by the TET cases
+struct SignalData
+{
+ SignalData()
+ : functorCalled(false),
+ voidFunctorCalled(false)
+ {}
+
+ void Reset()
+ {
+ functorCalled = false;
+ voidFunctorCalled = false;
+
+ receivedGesture.numberOfTaps = 0u;
+ receivedGesture.numberOfTouches = 0u;
+ receivedGesture.screenPoint = Vector2(0.0f, 0.0f);
+ receivedGesture.localPoint = Vector2(0.0f, 0.0f);
+
+ tappedActor = NULL;
+ }
+
+ bool functorCalled;
+ bool voidFunctorCalled;
+ TapGesture receivedGesture;
+ Actor tappedActor;
+};
+
+// Functor that sets the data when called
+struct GestureReceivedFunctor
+{
+ GestureReceivedFunctor(SignalData& data) : signalData(data) { }
+
+ void operator()(Actor actor, TapGesture tap)
+ {
+ signalData.functorCalled = true;
+ signalData.receivedGesture = tap;
+ signalData.tappedActor = actor;
+ }
+
+ void operator()()
+ {
+ signalData.voidFunctorCalled = true;
+ }
+
+ SignalData& signalData;
+};
+
+// Functor that removes the gestured actor from stage
+struct UnstageActorFunctor : public GestureReceivedFunctor
+{
+ UnstageActorFunctor( SignalData& data ) : GestureReceivedFunctor( data ) { }
+
+ void operator()(Actor actor, TapGesture tap)
+ {
+ GestureReceivedFunctor::operator()( actor, tap );
+ Stage::GetCurrent().Remove( actor );
+ }
+};
+
+// Functor for receiving a touch event
+struct TouchEventFunctor
+{
+ bool operator()(Actor actor, const TouchEvent& touch)
+ {
+ //For line coverage
+ unsigned int points = touch.GetPointCount();
+ if( points > 0)
+ {
+ const TouchPoint& touchPoint = touch.GetPoint(0);
+ tet_printf("Touch Point state = %d\n", touchPoint.state);
+ }
+ return false;
+ }
+};
+
+// Generate a TapGestureEvent to send to Core
+Integration::TapGestureEvent GenerateTap(
+ Gesture::State state,
+ unsigned int numberOfTaps,
+ unsigned int numberOfTouches,
+ Vector2 point)
+{
+ Integration::TapGestureEvent tap( state );
+
+ tap.numberOfTaps = numberOfTaps;
+ tap.numberOfTouches = numberOfTouches;
+ tap.point = point;
+
+ return tap;
+}
+
+} // anon namespace
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+// Positive test case for a method
+int UtcDaliTapGestureDetectorConstructor(void)
+{
+ TestApplication application;
+
+ TapGestureDetector detector;
+ DALI_TEST_CHECK(!detector);
+ END_TEST;
+}
+
+
+int UtcDaliTapGestureDetectorNew(void)
+{
+ TestApplication application;
+
+ TapGestureDetector detector = TapGestureDetector::New();
+ DALI_TEST_CHECK(detector);
+ DALI_TEST_EQUALS(1u, detector.GetTapsRequired(), TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, detector.GetTouchesRequired(), TEST_LOCATION);
+
+ TapGestureDetector detector2 = TapGestureDetector::New(5u, 5u);
+ DALI_TEST_CHECK(detector2);
+ DALI_TEST_EQUALS(5u, detector2.GetTapsRequired(), TEST_LOCATION);
+ DALI_TEST_EQUALS(5u, detector2.GetTouchesRequired(), TEST_LOCATION);
+
+ //Scoped test to test destructor
+ {
+ TapGestureDetector detector3 = TapGestureDetector::New();
+ DALI_TEST_CHECK(detector3);
+ }
+
+ // Attach an actor and emit a touch event on the actor to ensure complete line coverage
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ detector.Attach(actor);
+
+ TouchEventFunctor touchFunctor;
+ actor.TouchedSignal().Connect( &application, touchFunctor );
+
+ Integration::TouchEvent touchEvent(1);
+ TouchPoint point(1, TouchPoint::Down, 20.0f, 20.0f);
+ touchEvent.AddPoint(point);
+ application.ProcessEvent(touchEvent);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // For line coverage, Initialise default constructor
+ TouchEvent touchEvent2;
+ END_TEST;
+}
+
+int UtcDaliTapGestureDetectorDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::TapGestureDetector::DownCast()");
+
+ TapGestureDetector detector = TapGestureDetector::New();
+
+ BaseHandle object(detector);
+
+ TapGestureDetector detector2 = TapGestureDetector::DownCast(object);
+ DALI_TEST_CHECK(detector2);
+
+ TapGestureDetector detector3 = DownCast< TapGestureDetector >(object);
+ DALI_TEST_CHECK(detector3);
+
+ BaseHandle unInitializedObject;
+ TapGestureDetector detector4 = TapGestureDetector::DownCast(unInitializedObject);
+ DALI_TEST_CHECK(!detector4);
+
+ TapGestureDetector detector5 = DownCast< TapGestureDetector >(unInitializedObject);
+ DALI_TEST_CHECK(!detector5);
+
+ GestureDetector detector6 = TapGestureDetector::New();
+ TapGestureDetector detector7 = TapGestureDetector::DownCast(detector6);
+ DALI_TEST_CHECK(detector7);
+ END_TEST;
+}
+
+int UtcDaliTapGestureSetTapsRequired(void)
+{
+ TestApplication application;
+
+ TapGestureDetector detector = TapGestureDetector::New();
+
+ unsigned int taps = 3;
+
+ DALI_TEST_CHECK(taps != detector.GetTapsRequired());
+
+ detector.SetTapsRequired(taps);
+
+ DALI_TEST_EQUALS(taps, detector.GetTapsRequired(), TEST_LOCATION);
+
+ // Attach an actor and change the required touches
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ TestGestureManager& gestureManager = application.GetGestureManager();
+ gestureManager.Initialize();
+
+ detector.SetTapsRequired(4);
+
+ // Gesture detection should have been updated only
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+
+ // Reset values
+ gestureManager.Initialize();
+
+ // Create a second gesture detector that requires even less maximum touches
+ TapGestureDetector secondDetector = TapGestureDetector::New();
+ secondDetector.Attach(actor);
+
+ // Gesture detection should have been updated
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureGetTapsRequired(void)
+{
+ TestApplication application;
+
+ TapGestureDetector detector = TapGestureDetector::New();
+ DALI_TEST_EQUALS(1u, detector.GetTapsRequired(), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureSetTouchesRequired(void)
+{
+ TestApplication application;
+
+ TapGestureDetector detector = TapGestureDetector::New();
+
+ unsigned int max = 3;
+
+ DALI_TEST_CHECK(max != detector.GetTouchesRequired());
+
+ detector.SetTouchesRequired(max);
+
+ DALI_TEST_EQUALS(max, detector.GetTouchesRequired(), TEST_LOCATION);
+
+ // Attach an actor and change the maximum touches
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ TestGestureManager& gestureManager = application.GetGestureManager();
+ gestureManager.Initialize();
+
+ detector.SetTouchesRequired(4);
+
+ // Gesture detection should have been updated only
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+
+ // Reset values
+ gestureManager.Initialize();
+
+ // Create a second gesture detector that requires even less maximum touches
+ TapGestureDetector secondDetector = TapGestureDetector::New();
+ secondDetector.Attach(actor);
+
+ // Gesture detection should have been updated
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureGetTouchesRequired(void)
+{
+ TestApplication application;
+
+ TapGestureDetector detector = TapGestureDetector::New();
+ DALI_TEST_EQUALS(1u, detector.GetTouchesRequired(), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureSignalReceptionNegative(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Do a tap outside actor's area
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(112.0f, 112.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(112.0f, 112.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureSignalReceptionPositive(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Do a tap inside actor's area
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 50.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 50.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTaps, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS( Vector2(50.0f, 50.0f), data.receivedGesture.localPoint, 0.1, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureSignalReceptionDetach(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Start tap within the actor's area
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(20.0f, 20.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTaps, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS( Vector2(20.0f, 20.0f), data.receivedGesture.localPoint, 0.1, TEST_LOCATION);
+
+ // repeat the tap within the actor's area - we should still receive the signal
+ data.Reset();
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 50.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 50.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTaps, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS( Vector2(50.0f, 50.0f), data.receivedGesture.localPoint, 0.1, TEST_LOCATION);
+
+ // Detach actor
+ detector.DetachAll();
+
+ // Ensure we are no longer signalled
+ data.Reset();
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(20.0f, 20.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 50.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 50.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureSignalReceptionActorDestroyedWhileTapping(void)
+{
+ TestApplication application;
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Actor lifetime is scoped
+ {
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ detector.Attach(actor);
+
+ // Start tap within the actor's area
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(20.0f, 20.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Remove the actor from stage and reset the data
+ Stage::GetCurrent().Remove(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+ }
+
+ // Actor should now have been destroyed
+
+ data.Reset();
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(20.0f, 20.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(20.0f, 20.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureSignalReceptionRotatedActor(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetRotation(Dali::Degree(90.0f), Vector3::ZAXIS);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Do tap, only check finished value
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(5.0f, 5.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(5.0f, 5.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTaps, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS( Vector2(5.0f, 5.0f), data.receivedGesture.screenPoint, 0.1, TEST_LOCATION);
+
+ // Rotate actor again and render
+ actor.SetRotation(Dali::Degree(180.0f), Vector3::ZAXIS);
+ application.SendNotification();
+ application.Render();
+
+ // Do tap, should still receive event
+ data.Reset();
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(5.0f, 5.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(5.0f, 5.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTaps, TEST_LOCATION);
+ DALI_TEST_EQUALS(1u, data.receivedGesture.numberOfTouches, TEST_LOCATION);
+ DALI_TEST_EQUALS( Vector2(5.0f, 5.0f), data.receivedGesture.screenPoint, 0.1, TEST_LOCATION);
+
+ // Rotate actor again and render
+ actor.SetRotation(Dali::Degree(90.0f), Vector3::YAXIS);
+ application.SendNotification();
+ application.Render();
+
+ // Do tap, inside the actor's area (area if it is not rotated), Should not receive the event
+ data.Reset();
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(70.0f, 70.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(70.0f, 70.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureSignalReceptionChildHit(void)
+{
+ TestApplication application;
+
+ Actor parent = Actor::New();
+ parent.SetSize(100.0f, 100.0f);
+ parent.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(parent);
+
+ // Set child to completely cover parent.
+ // Change rotation of child to be different from parent so that we can check if our local coordinate
+ // conversion of the parent actor is correct.
+ Actor child = Actor::New();
+ child.SetSize(100.0f, 100.0f);
+ child.SetAnchorPoint(AnchorPoint::CENTER);
+ child.SetParentOrigin(ParentOrigin::CENTER);
+ child.SetRotation(Dali::Degree(90.0f), Vector3::ZAXIS);
+ parent.Add(child);
+
+ TouchEventFunctor touchFunctor;
+ child.TouchedSignal().Connect(&application, touchFunctor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.Attach(parent);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Do tap - hits child area but parent should still receive it
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 50.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 50.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, parent == data.tappedActor, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(50.0f, 50.0f), data.receivedGesture.screenPoint, 0.01f, TEST_LOCATION);
+
+ // Attach child and generate same touch points
+ // (Also proves that you can detach and then re-attach another actor)
+ detector.Attach(child);
+ detector.Detach(parent);
+
+ // Do an entire tap, only check finished value
+ data.Reset();
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(51.0f, 51.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(51.0f, 51.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, child == data.tappedActor, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector2(51.0f, 51.0f), data.receivedGesture.screenPoint, 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureSignalReceptionAttachDetachMany(void)
+{
+ TestApplication application;
+
+ Actor first = Actor::New();
+ first.SetSize(100.0f, 100.0f);
+ first.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(first);
+
+ Actor second = Actor::New();
+ second.SetSize(100.0f, 100.0f);
+ second.SetX(100.0f);
+ second.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(second);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.Attach(first);
+ detector.Attach(second);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Tap within second actor's area
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(120.0f, 10.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(120.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, second == data.tappedActor, TEST_LOCATION);
+
+ // Tap within first actor's area
+ data.Reset();
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(20.0f, 10.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, first == data.tappedActor, TEST_LOCATION);
+
+ // Detach the second actor
+ detector.Detach(second);
+
+ // second actor shouldn't receive event
+ data.Reset();
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(120.0f, 10.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(120.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // first actor should continue receiving event
+ data.Reset();
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(20.0f, 10.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(20.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureSignalReceptionActorBecomesUntouchable(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ // Tap in actor's area
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+
+ // Actor become invisible - actor should not receive the next pan
+ actor.SetVisible(false);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Tap in the same area, shouldn't receive event
+ data.Reset();
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureSignalReceptionMultipleGestureDetectors(void)
+{
+ TestApplication application;
+ Dali::TestGestureManager& gestureManager = application.GetGestureManager();
+
+ Actor first = Actor::New();
+ first.SetSize(100.0f, 100.0f);
+ first.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(first);
+
+ Actor second = Actor::New();
+ second.SetSize(100.0f, 100.0f);
+ second.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ second.SetX(100.0f);
+ first.Add(second);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ TapGestureDetector firstDetector = TapGestureDetector::New();
+ firstDetector.Attach(first);
+ firstDetector.DetectedSignal().Connect(&application, functor);
+
+ // secondDetector is scoped
+ {
+ // Reset gestureManager statistics
+ gestureManager.Initialize();
+
+ TapGestureDetector secondDetector = TapGestureDetector::New();
+ secondDetector.SetTapsRequired(2);
+ secondDetector.SetTouchesRequired(2);
+ secondDetector.Attach(second);
+ secondDetector.DetectedSignal().Connect(&application, functor);
+
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+
+ // Tap within second actor's area
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 2u, 2u, Vector2(150.0f, 10.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 2u, 2u, Vector2(150.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, second == data.tappedActor, TEST_LOCATION);
+
+ // Tap continues as single touch gesture - we should not receive any gesture
+ data.Reset();
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(150.0f, 10.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(150.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Single touch tap starts - first actor should be panned
+ data.Reset();
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, first == data.tappedActor, TEST_LOCATION);
+
+ // Pan changes to double-touch - we shouldn't receive event
+ data.Reset();
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 2u, 2u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 2u, 2u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Reset gesture manager statistics
+ gestureManager.Initialize();
+ }
+
+ // secondDetector has now been deleted. Gesture detection should have been updated only
+ DALI_TEST_EQUALS(true, gestureManager.WasCalled(TestGestureManager::UpdateType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::RegisterType), TEST_LOCATION);
+ DALI_TEST_EQUALS(false, gestureManager.WasCalled(TestGestureManager::UnregisterType), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureSignalReceptionMultipleDetectorsOnActor(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to one detector
+ SignalData firstData;
+ GestureReceivedFunctor firstFunctor(firstData);
+ TapGestureDetector firstDetector = TapGestureDetector::New();
+ firstDetector.Attach(actor);
+ firstDetector.DetectedSignal().Connect(&application, firstFunctor);
+
+ // Attach actor to another detector
+ SignalData secondData;
+ GestureReceivedFunctor secondFunctor(secondData);
+ TapGestureDetector secondDetector = TapGestureDetector::New();
+ secondDetector.Attach(actor);
+ secondDetector.DetectedSignal().Connect(&application, secondFunctor);
+
+ // Tap in actor's area - both detector's functors should be called
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, firstData.functorCalled, TEST_LOCATION);
+ DALI_TEST_EQUALS(true, secondData.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureSignalReceptionDifferentPossible(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Gesture possible in actor's area.
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Move actor somewhere else
+ actor.SetPosition( 100.0f, 100.0f );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Emit Started event, we should not receive the long press.
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // LongPress possible in empty area.
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Move actor in to the long press position.
+ actor.SetPosition( 0.0f, 0.0f );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Emit Started event, we should not receive the long press.
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Normal long press in actor's area for completeness.
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureEmitIncorrectStateClear(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Try a Clear state
+ try
+ {
+ application.ProcessEvent(GenerateTap(Gesture::Clear, 1u, 1u, Vector2(50.0f, 10.0f)));
+ tet_result(TET_FAIL);
+ }
+ catch ( Dali::DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "false", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliTapGestureEmitIncorrectStateContinuing(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Try a Continuing state
+ try
+ {
+ application.ProcessEvent(GenerateTap(Gesture::Continuing, 1u, 1u, Vector2(50.0f, 10.0f)));
+ tet_result(TET_FAIL);
+ }
+ catch ( Dali::DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "false", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliTapGestureEmitIncorrectStateFinished(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Try a Finished state
+ try
+ {
+ application.ProcessEvent(GenerateTap(Gesture::Finished, 1u, 1u, Vector2(50.0f, 10.0f)));
+ tet_result(TET_FAIL);
+ }
+ catch ( Dali::DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "false", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliTapGestureActorUnstaged(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ UnstageActorFunctor functor( data );
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Tap in Actor's area, actor removed in signal handler, should be handled gracefully.
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ tet_result( TET_PASS ); // If we get here, then the actor removal on signal handler was handled gracefully.
+ END_TEST;
+}
+
+int UtcDaliTapGestureRepeatedState(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Emit two possibles
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Send a couple of Started states, only first one should be received.
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(true, data.functorCalled, TEST_LOCATION);
+ data.Reset();
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+
+ // Send a couple of cancelled states, no reception
+ application.ProcessEvent(GenerateTap(Gesture::Cancelled, 1u, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Cancelled, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGesturePossibleCancelled(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Emit a possible and then a cancelled, no reception
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f)));
+ application.ProcessEvent(GenerateTap(Gesture::Cancelled, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureDetectorRemovedWhilePossible(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Emit a possible
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f)));
+
+ // Detach actor and send a Started state, no signal.
+ detector.DetachAll();
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureActorRemovedWhilePossible(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Attach actor to detector
+ SignalData data;
+ GestureReceivedFunctor functor( data );
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect( &application, functor );
+
+ // Emit a possible
+ application.ProcessEvent(GenerateTap(Gesture::Possible, 1u, 1u, Vector2(50.0f, 10.0f)));
+
+ // Remove, render and delete actor
+ Stage::GetCurrent().Remove(actor);
+ application.SendNotification();
+ application.Render();
+ actor = NULL;
+
+ // Send a Started state, no signal.
+ application.ProcessEvent(GenerateTap(Gesture::Started, 1u, 1u, Vector2(50.0f, 10.0f)));
+ DALI_TEST_EQUALS(false, data.functorCalled, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTapGestureSystemOverlay(void)
+{
+ TestApplication application;
+ Dali::Integration::Core& core = application.GetCore();
+ Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() );
+ systemOverlay.GetOverlayRenderTasks().CreateTask();
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ systemOverlay.Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ SignalData data;
+ GestureReceivedFunctor functor(data);
+
+ TapGestureDetector detector = TapGestureDetector::New();
+ detector.Attach(actor);
+ detector.DetectedSignal().Connect(&application, functor);
+
+ Vector2 screenCoords( 50.0f, 50.0f );
+
+ // Do a tap inside actor's area
+ application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, screenCoords ) );
+ application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, screenCoords ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_text_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_text_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+int UtcDaliTextConstructor(void)
+{
+ TestApplication application;
+
+ Text text;
+
+ DALI_TEST_CHECK( text.IsEmpty() );
+
+ Text someText( std::string( "Some text" ) );
+
+ DALI_TEST_CHECK( !someText.IsEmpty() );
+
+ Character c = someText[0];
+
+ Text cText( c );
+
+ DALI_TEST_CHECK( !cText.IsEmpty() );
+ END_TEST;
+}
+
+int UtcDaliTextCopyConstructor(void)
+{
+ TestApplication application;
+
+ Text someText1( std::string( "Some text1" ) );
+ Text someText2( std::string( "Some text2" ) );
+
+ Text someText3( someText1 );
+ Text someText4 = someText2;
+
+ DALI_TEST_CHECK( (someText1.GetText()==someText3.GetText()) && (someText2.GetText()==someText4.GetText()) );
+ END_TEST;
+}
+
+int UtcDaliTextAssignmentOperator(void)
+{
+ TestApplication application;
+
+ // check for assignment when current is NULL
+
+ Text someText1( std::string( "Some text1" ) );
+ Text someText2;
+ someText2 = someText1;
+
+ DALI_TEST_CHECK( (someText1.GetText()==someText2.GetText()) );
+
+ // check for assignment when current object already has text
+ Text someText3( std::string( "Some text3" ) );
+ someText2 = someText3;
+ DALI_TEST_CHECK( (someText3.GetText()==someText2.GetText()) );
+
+ Text someText4;
+
+ printf(" is text empty ? ...... %d \n", someText4.IsEmpty());
+ // check for assignment of empty text
+ someText2 = someText4;
+ DALI_TEST_CHECK( someText2.IsEmpty() );
+
+ // check for self assignment
+ someText3 = someText3;
+ DALI_TEST_CHECK( ! someText3.IsEmpty() );
+
+
+ END_TEST;
+}
+
+int UtcDaliTextSetGetText(void)
+{
+ TestApplication application;
+
+ const std::string someText( "Some text");
+
+ Text text;
+ text.SetText( someText );
+
+ DALI_TEST_CHECK( someText == text.GetText() );
+
+ Character c = text[0];
+ text.SetText( c );
+
+ DALI_TEST_CHECK( std::string("S") == text.GetText() );
+
+ Text text2;
+ text2.SetText( text );
+
+ DALI_TEST_CHECK( text2.GetText() == text.GetText() );
+ END_TEST;
+}
+
+int UtcDaliTextAccessOperator01(void)
+{
+ TestApplication application;
+
+ std::string someText;
+
+ Text text;
+ text.SetText( someText );
+
+ bool assert1 = false;
+ bool assert2 = false;
+ try
+ {
+ Character c = text[0];
+ }
+ catch( DaliException& e )
+ {
+ tet_printf( "Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str() );
+ DALI_TEST_EQUALS( e.mCondition, "NULL != mImpl && \"Text::operator[]: Text is uninitialized\"", TEST_LOCATION );
+
+ assert1 = true;
+ }
+
+ someText = std::string( "some text" );
+ text.SetText( someText );
+
+ try
+ {
+ Character c = text[100];
+ }
+ catch( DaliException& e )
+ {
+ tet_printf( "Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str() );
+ DALI_TEST_EQUALS( e.mCondition, "position < mString.size() && \"Text::operator[]: Character position is out of bounds\"", TEST_LOCATION );
+
+ assert2 = true;
+ }
+
+ if( assert1 && assert2 )
+ {
+ tet_result( TET_PASS );
+ }
+ else
+ {
+ tet_result( TET_FAIL );
+ }
+ END_TEST;
+}
+
+int UtcDaliTextAccessOperator02(void)
+{
+ TestApplication application;
+
+ const std::string someText( "Some text");
+
+ Text text;
+ text.SetText( someText );
+
+ DALI_TEST_CHECK( someText == text.GetText() );
+
+ Character c = text[0];
+ text.SetText( c );
+
+ DALI_TEST_CHECK( std::string("S") == text.GetText() );
+ END_TEST;
+}
+
+int UtcDaliTextIsEmpty(void)
+{
+ TestApplication application;
+
+ Text text;
+
+ DALI_TEST_CHECK( text.IsEmpty() );
+
+ text.SetText( std::string( "Some text") );
+
+ DALI_TEST_CHECK( !text.IsEmpty() );
+ END_TEST;
+}
+
+int UtcDaliTextGetLength(void)
+{
+ TestApplication application;
+
+ const std::string someText( "Some text");
+
+ Text text( someText );
+
+ DALI_TEST_CHECK( someText.size() == text.GetLength() );
+ END_TEST;
+}
+
+int UtcDaliTextAppend(void)
+{
+ TestApplication application;
+
+ Text text( std::string( "Some text") );
+
+ text.Append( std::string( "A" ) );
+
+ DALI_TEST_CHECK( std::string( "Some textA" ) == text.GetText() );
+
+ Character c = text[0];
+ text.Append( c );
+
+ DALI_TEST_CHECK( std::string( "Some textAS" ) == text.GetText() );
+
+ Text text2( std::string("B") );
+ text.Append( text2 );
+
+ DALI_TEST_CHECK( std::string( "Some textASB" ) == text.GetText() );
+
+ // append to a null text
+
+ Text emptyText;
+ emptyText.Append( text2 );
+ DALI_TEST_CHECK( text2.GetText() == emptyText.GetText() );
+
+ END_TEST;
+}
+
+int UtcDaliTextRemove01(void)
+{
+ TestApplication application;
+
+ Text text( std::string( "Some text") );
+
+ bool assert1 = false;
+ bool assert2 = false;
+ try
+ {
+ text.Remove( 100, 3 );
+ }
+ catch( DaliException& e )
+ {
+ tet_printf( "Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str() );
+ DALI_TEST_EQUALS( e.mCondition, "position < mString.size() && \"Text::Remove: Character position is out of bounds\"", TEST_LOCATION );
+ assert1 = true;
+ }
+
+ try
+ {
+ text.Remove( 1, 300 );
+ }
+ catch( DaliException& e )
+ {
+ tet_printf( "Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str() );
+ DALI_TEST_EQUALS( e.mCondition, "position + numberOfCharacters <= mString.size() && \"Text::Remove: Character position + numberOfCharacters is out of bounds\"", TEST_LOCATION );
+ assert2 = true;
+ }
+
+ if( assert1 && assert2 )
+ {
+ tet_result( TET_PASS );
+ }
+ else
+ {
+ tet_result( TET_FAIL );
+ }
+ END_TEST;
+}
+
+int UtcDaliTextRemove02(void)
+{
+ TestApplication application;
+
+ Text text01( std::string( "Some text") );
+ Text text02( std::string( "Somext") );
+ Text text03( std::string( "") );
+
+ text01.Remove( 3, 3 );
+
+ DALI_TEST_EQUALS( text01.GetLength(), text02.GetLength(), TEST_LOCATION );
+ DALI_TEST_EQUALS( text01.GetText(), text02.GetText(), TEST_LOCATION );
+
+ text01.Remove( 0, 6 );
+
+ DALI_TEST_EQUALS( text01.GetLength(), text03.GetLength(), TEST_LOCATION );
+ DALI_TEST_EQUALS( text01.GetText(), text03.GetText(), TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <stdlib.h>
+
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void text_actor_test_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void text_actor_test_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+static const char* TestTextHello = "Hello";
+static const char* TestTextHelloWorld = "Hello World";
+static const char* LongTestText = "This is a very long piece of text, and is sure not to fit into any box presented to it";
+
+const std::string FAMILY_NAME = "Arial";
+const std::string STYLE = "Bold";
+const unsigned int POINT_SIZE = 11.f;
+static const Vector4 FONT_TEXT_COLOR = Color::RED;
+static const Degree FONT_ITALICS_ANGLE(10.f);
+static const Radian FONT_ITALICS_RADIAN_ANGLE(0.4f);
+static const bool FONT_ITALICS = true;
+static const bool FONT_UNDERLINE = true;
+static const bool FONT_SHADOW = true;
+static const bool FONT_GLOW = true;
+static const bool FONT_OUTLINE = true;
+static const float FONT_UNDERLINE_THICKNESS = 5.0f;
+static const float FONT_UNDERLINE_POSITION = 60.0f;
+static const Vector4 FONT_SHADOW_COLOR = Color::BLUE;
+static const Vector2 FONT_SHADOW_OFFSET(2.f, 2.f );
+static const float FONT_SHADOW_SIZE = 55.f;
+static const Vector4 FONT_TEXT_GLOW_COLOR = Color::BLACK;
+static const float FONT_GLOW_INTENSITY = 10.0f;
+static const float FONT_SMOOTH_EDGE = 5.0f;
+static const Vector4 FONT_OUTLINE_COLOR = Color::MAGENTA;
+static const Vector2 FONT_OUTLINE_THICKNESS(15.f, 14.f );
+
+} // anon namespace
+
+int UtcDaliTextActorConstructorVoid(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor::TextActor()");
+
+ TextActor actor;
+
+ DALI_TEST_CHECK(!actor);
+ END_TEST;
+}
+
+int UtcDaliTextActorNew01(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor::New()");
+
+ TextActor actor = TextActor::New(TestTextHello);
+
+ DALI_TEST_CHECK(actor);
+
+ actor = TextActor::New(Text(std::string(TestTextHello)));
+
+ DALI_TEST_CHECK(actor);
+ END_TEST;
+}
+
+
+int UtcDaliTextActorNew02(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor::New()");
+
+ TextActor actor = TextActor::New(TestTextHello, false);
+
+ DALI_TEST_CHECK(actor);
+
+ actor = TextActor::New(Text(std::string(TestTextHello)), false);
+
+ DALI_TEST_CHECK(actor);
+ END_TEST;
+}
+
+int UtcDaliTextActorNew03(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor::New()");
+
+ TextActor actor = TextActor::New(TestTextHello, false, false);
+
+ DALI_TEST_CHECK(actor);
+
+ actor = TextActor::New(Text(std::string(TestTextHello)), false, false);
+
+ DALI_TEST_CHECK(actor);
+ END_TEST;
+}
+
+
+int UtcDaliTextActorNew04(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor::New()");
+
+ FontParameters parameters( "FreeSerif", "Book", PointSize(8) );
+ Font freeSerif = Font::New( parameters );
+
+ TextActor actor = TextActor::New(TestTextHello, freeSerif);
+
+ DALI_TEST_CHECK(actor);
+
+ actor = TextActor::New(Text(std::string(TestTextHello)), freeSerif);
+
+ DALI_TEST_CHECK(actor);
+ END_TEST;
+}
+
+int UtcDaliTextActorNew05(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor::New()");
+
+ FontParameters parameters( "FreeSerif", "Book", PointSize(8) );
+ Font freeSerif = Font::New( parameters );
+
+ TextActor actor = TextActor::New(TestTextHello, freeSerif, false);
+
+ DALI_TEST_CHECK(actor);
+
+ actor = TextActor::New(Text(std::string(TestTextHello)), freeSerif, false);
+
+ DALI_TEST_CHECK(actor);
+ END_TEST;
+}
+
+int UtcDaliTextActorNew06(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor::New()");
+
+ FontParameters parameters( "FreeSerif", "Book", PointSize(8) );
+ Font freeSerif = Font::New( parameters );
+
+ TextActor actor = TextActor::New(TestTextHello, freeSerif, false, false);
+
+ DALI_TEST_CHECK(actor);
+
+ actor = TextActor::New(Text(std::string(TestTextHello)), freeSerif, false, false);
+
+ DALI_TEST_CHECK(actor);
+ END_TEST;
+}
+
+int UtcDaliTextActorNew07(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor::New()");
+
+ TextStyle style;
+
+ TextActor actor = TextActor::New(Text(TestTextHello), style, false, false);
+
+ DALI_TEST_CHECK(actor);
+ END_TEST;
+}
+
+
+int UtcDaliTextActorDownCast(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::TextActor::DownCast()");
+
+ TextActor actor1 = TextActor::New("Hello, World!");
+ Actor anActor = Actor::New();
+ anActor.Add(actor1);
+
+ Actor child = anActor.GetChildAt(0);
+ TextActor textActor = TextActor::DownCast(child);
+
+ DALI_TEST_CHECK(textActor);
+ DALI_TEST_CHECK(!textActor.GetText().compare("Hello, World!"));
+ END_TEST;
+}
+
+int UtcDaliTextActorDownCast2(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::TextActor::DownCast()");
+
+ Actor actor1 = Actor::New();
+ Actor anActor = Actor::New();
+ anActor.Add(actor1);
+
+ Actor child = anActor.GetChildAt(0);
+ TextActor textActor = TextActor::DownCast(child);
+ DALI_TEST_CHECK(!textActor);
+
+ Actor unInitialzedActor;
+ textActor = DownCast< TextActor >( unInitialzedActor );
+ DALI_TEST_CHECK(!textActor);
+ END_TEST;
+}
+
+int UtcDaliTextActorSetText(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor::SetText()");
+
+ TextActor actor01 = TextActor::New(TestTextHello);
+
+ actor01.SetText(TestTextHelloWorld);
+
+ std::string text = actor01.GetText();
+
+ DALI_TEST_EQUALS(text, TestTextHelloWorld, TEST_LOCATION);
+
+ actor01.SetText(Text(std::string(TestTextHelloWorld)));
+
+ text = actor01.GetText();
+
+ DALI_TEST_EQUALS(text, TestTextHelloWorld, TEST_LOCATION);
+
+ actor01.SetText("");
+
+ text = actor01.GetText();
+
+ DALI_TEST_EQUALS(text, "", TEST_LOCATION);
+
+ TextActor actor02 = TextActor::New("");
+
+ actor02.SetText( std::string() );
+
+ text = actor02.GetText();
+
+ DALI_TEST_EQUALS(text, "", TEST_LOCATION);
+
+ actor02.SetText(TestTextHelloWorld);
+ actor02.SetText( std::string() );
+
+ text = actor02.GetText();
+
+ DALI_TEST_EQUALS(text, "", TEST_LOCATION);
+
+ TextActor actor03 = TextActor::New("");
+ const Text voidText;
+ actor03.SetText(voidText);
+
+ text = actor03.GetText();
+
+ DALI_TEST_EQUALS(text, "", TEST_LOCATION);
+
+ actor03.SetText(TestTextHelloWorld);
+ actor03.SetText(voidText);
+
+ text = actor03.GetText();
+
+ DALI_TEST_EQUALS(text, "", TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTextActorSetFont(void)
+{
+ TestApplication application;
+
+ TextActor actor = TextActor::New(TestTextHello);
+
+ PointSize pointSize( POINT_SIZE );
+ FontParameters params( FAMILY_NAME, STYLE, pointSize);
+
+ Font font = Font::New( params );
+
+ actor.SetFont( font );
+
+ DALI_TEST_CHECK( actor.GetFont().GetName() == FAMILY_NAME );
+ END_TEST;
+}
+
+int UtcDaliTextActorSetFontDetection(void)
+{
+ TestApplication application;
+
+ TextActor actor = TextActor::New(TestTextHello);
+
+ actor.SetFontDetectionAutomatic( true );
+
+ DALI_TEST_CHECK( true == actor.IsFontDetectionAutomatic() );
+
+ END_TEST;
+}
+
+int UtcDaliTextActorSetTextIndividualStyles(void)
+{
+ TestApplication application;
+
+ TextActor actor = TextActor::New(TestTextHello);
+
+ actor.SetTextColor( FONT_TEXT_COLOR);
+
+ DALI_TEST_CHECK( actor.GetTextColor() == FONT_TEXT_COLOR );
+
+ actor.SetSmoothEdge( FONT_SMOOTH_EDGE );
+
+ actor.SetOutline( FONT_OUTLINE, FONT_OUTLINE_COLOR, FONT_OUTLINE_THICKNESS );
+
+ actor.SetShadow( FONT_SHADOW, FONT_SHADOW_COLOR, FONT_SHADOW_OFFSET, FONT_SHADOW_SIZE );
+
+ actor.SetItalics( FONT_ITALICS, FONT_ITALICS_ANGLE );
+
+ actor.SetGlow( FONT_GLOW, FONT_TEXT_GLOW_COLOR, FONT_GLOW_INTENSITY );
+
+ TextStyle style = actor.GetTextStyle();
+
+ DALI_TEST_CHECK( FONT_TEXT_COLOR == style.GetTextColor() );
+
+ DALI_TEST_CHECK( FONT_SMOOTH_EDGE == style.GetSmoothEdge() );
+
+ DALI_TEST_CHECK( FONT_OUTLINE == style.GetOutline() );
+ DALI_TEST_CHECK( FONT_OUTLINE_COLOR == style.GetOutlineColor() );
+ DALI_TEST_CHECK( FONT_OUTLINE_THICKNESS == style.GetOutlineThickness() );
+
+
+ DALI_TEST_CHECK( FONT_SHADOW == style.GetShadow() );
+ DALI_TEST_CHECK( FONT_SHADOW_COLOR == style.GetShadowColor() );
+ DALI_TEST_CHECK( FONT_SHADOW_OFFSET == style.GetShadowOffset() );
+ DALI_TEST_CHECK( FONT_SHADOW_SIZE == style.GetShadowSize() );
+
+ DALI_TEST_CHECK( FONT_ITALICS == style.GetItalics() );
+ DALI_TEST_CHECK( FONT_ITALICS_ANGLE == style.GetItalicsAngle() );
+
+ DALI_TEST_CHECK( FONT_GLOW == style.GetGlow() );
+ DALI_TEST_CHECK( FONT_OUTLINE == style.GetOutline() );
+ DALI_TEST_CHECK( FONT_TEXT_GLOW_COLOR == style.GetGlowColor() );
+ DALI_TEST_CHECK( FONT_GLOW_INTENSITY == style.GetGlowIntensity() );
+
+
+ actor.SetItalics( FONT_ITALICS, FONT_ITALICS_RADIAN_ANGLE );
+ style = actor.GetTextStyle();
+ DALI_TEST_CHECK( FONT_ITALICS_RADIAN_ANGLE == style.GetItalicsAngle() );
+
+
+ END_TEST;
+}
+
+int UtcDaliTextActorChangingText(void)
+{
+ TestApplication application;
+
+ TextActor actor = TextActor::New(TestTextHello);
+ actor.SetSize(Vector3(200, 20, 0.0f));
+ actor.SetPosition(20.0f, 400.0f, 40.0f);
+ Stage::GetCurrent().Add(actor);
+
+ tet_infoline("Testing Dali::TextActor::SetText() & Dali::TextActor::GetText()");
+ actor.SetText(LongTestText);
+ std::string text = actor.GetText();
+ DALI_TEST_EQUALS(text, LongTestText, TEST_LOCATION);
+
+ // do a render
+ application.SendNotification();
+ application.Render();
+
+ // check that the size did not change
+ DALI_TEST_EQUALS( Vector3(200, 20, 0.0f), actor.GetCurrentSize(), TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliTextActorGetLoadingState(void)
+{
+ TestApplication application;
+
+ TextActor actor = TextActor::New(TestTextHello);
+
+ DALI_TEST_CHECK( ResourceLoading == actor.GetLoadingState());
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_CHECK( ResourceLoadingSucceeded == actor.GetLoadingState());
+
+ END_TEST;
+}
+
+int UtcDaliTextActorSetItalics(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor::New()");
+
+ TextActor actor = TextActor::New(TestTextHello);
+
+ DALI_TEST_CHECK(actor);
+
+ actor.SetItalics( true );
+
+ DALI_TEST_CHECK( actor.GetItalics() );
+
+ DALI_TEST_EQUALS( static_cast<float>( Degree( actor.GetItalicsAngle() ) ), static_cast<float>(TextStyle::DEFAULT_ITALICS_ANGLE), 0.0001f, TEST_LOCATION );
+
+ actor.SetItalics( false );
+
+ DALI_TEST_CHECK( ! actor.GetItalics() );
+
+ // TODO: Implement a why on the glAbstraction to check if the geometry was created correctly
+ END_TEST;
+}
+
+int UtcDaliTextActorSetUnderline(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor::SetUnderline()");
+
+ TextActor actor = TextActor::New(TestTextHello);
+
+ DALI_TEST_CHECK(actor);
+
+ actor.SetUnderline( true );
+
+ DALI_TEST_CHECK( actor.GetUnderline() );
+
+ actor.SetUnderline( false );
+
+ DALI_TEST_CHECK( ! actor.GetUnderline() );
+
+ // TODO: Implement a why on the glAbstraction to check if the geometry was created correctly
+ END_TEST;
+}
+
+int UtcDaliTextActorSetWeight(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor::SetWeight()");
+
+ TextActor actor = TextActor::New(TestTextHello);
+
+ DALI_TEST_CHECK(actor);
+
+ actor.SetWeight( TextStyle::EXTRABOLD );
+
+ DALI_TEST_CHECK( TextStyle::EXTRABOLD == actor.GetWeight() );
+
+ actor.SetWeight( TextStyle::BOLD );
+
+ DALI_TEST_CHECK( TextStyle::BOLD == actor.GetWeight() );
+ END_TEST;
+}
+
+int UtcDaliTextActorSetStyle(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor::SetTextStyle()");
+
+ TextActor actor = TextActor::New(TestTextHello);
+
+ TextStyle defaultStyle = actor.GetTextStyle();
+ DALI_TEST_CHECK( defaultStyle.GetFontName().empty() );
+ DALI_TEST_CHECK( TextStyle::REGULAR == defaultStyle.GetWeight() );
+ DALI_TEST_CHECK( Color::WHITE == defaultStyle.GetTextColor() );
+ DALI_TEST_CHECK( !defaultStyle.GetItalics() );
+ DALI_TEST_CHECK( !defaultStyle.GetUnderline() );
+
+ TextStyle style;
+ style.SetFontPointSize(PointSize( 16.f ));
+ style.SetWeight(TextStyle::EXTRABLACK);
+ style.SetTextColor(Color::BLUE);
+ style.SetItalics(true);
+ style.SetUnderline(true);
+ style.SetShadow(false);
+ style.SetGlow(false);
+ style.SetOutline(false);
+
+ actor.SetTextStyle( style );
+ // This is necessary since SetColor (via TextStyle) is asynchronous
+ application.SendNotification();
+ application.Render();
+ style = actor.GetTextStyle();
+
+ DALI_TEST_CHECK( style.GetFontName().empty() );
+ DALI_TEST_CHECK( style.GetFontStyle().empty() );
+ DALI_TEST_EQUALS( static_cast<float>( PointSize( 16.f ) ),
+ static_cast<float>( style.GetFontPointSize() ),
+ GetRangedEpsilon( PointSize( 16.f ), style.GetFontPointSize() ),
+ TEST_LOCATION );
+ DALI_TEST_CHECK( TextStyle::EXTRABLACK == style.GetWeight() );
+ DALI_TEST_EQUALS( Vector4( 0.f, 0.f, 1.f, 1.f ), style.GetTextColor(), TEST_LOCATION );
+ DALI_TEST_CHECK( style.GetItalics() );
+ DALI_TEST_CHECK( style.GetUnderline() );
+ END_TEST;
+}
+
+int UtcDaliTextActorDefaultProperties(void)
+{
+ TestApplication application;
+ tet_infoline("Testing Dali::TextActor DefaultProperties");
+
+ TextActor actor = TextActor::New("@");
+
+ std::vector<Property::Index> indices ;
+ indices.push_back(TextActor::TEXT );
+ indices.push_back(TextActor::FONT );
+ indices.push_back(TextActor::FONT_STYLE );
+ indices.push_back(TextActor::OUTLINE_ENABLE );
+ indices.push_back(TextActor::OUTLINE_COLOR );
+ indices.push_back(TextActor::OUTLINE_THICKNESS_WIDTH );
+ indices.push_back(TextActor::SMOOTH_EDGE );
+ indices.push_back(TextActor::GLOW_ENABLE );
+ indices.push_back(TextActor::GLOW_COLOR );
+ indices.push_back(TextActor::GLOW_INTENSITY );
+ indices.push_back(TextActor::SHADOW_ENABLE );
+ indices.push_back(TextActor::SHADOW_COLOR );
+ indices.push_back(TextActor::SHADOW_OFFSET );
+ indices.push_back(TextActor::ITALICS_ANGLE );
+ indices.push_back(TextActor::UNDERLINE );
+ indices.push_back(TextActor::WEIGHT );
+ indices.push_back(TextActor::FONT_DETECTION_AUTOMATIC );
+ indices.push_back(TextActor::GRADIENT_COLOR );
+ indices.push_back(TextActor::GRADIENT_START_POINT );
+ indices.push_back(TextActor::GRADIENT_END_POINT );
+ indices.push_back(TextActor::SHADOW_SIZE );
+ indices.push_back(TextActor::TEXT_COLOR );
+
+ DALI_TEST_CHECK(actor.GetPropertyCount() == ( Actor::New().GetPropertyCount() + indices.size() ) );
+
+ for(std::vector<Property::Index>::iterator iter = indices.begin(); iter != indices.end(); ++iter)
+ {
+ DALI_TEST_CHECK( *iter == actor.GetPropertyIndex(actor.GetPropertyName(*iter)) );
+ DALI_TEST_CHECK( actor.IsPropertyWritable(*iter) );
+ DALI_TEST_CHECK( !actor.IsPropertyAnimatable(*iter) );
+ DALI_TEST_CHECK( actor.GetPropertyType(*iter) == actor.GetPropertyType(*iter) ); // just checking call succeeds
+ }
+
+ // set/get one of them
+ actor.SetUnderline(false);
+ DALI_TEST_CHECK(actor.GetUnderline() != true);
+
+ actor.SetProperty(TextActor::UNDERLINE, Property::Value(true));
+ Property::Value v = actor.GetProperty(TextActor::UNDERLINE);
+ DALI_TEST_CHECK(v.GetType() == Property::BOOLEAN);
+
+ DALI_TEST_CHECK(v.Get<bool>() == true);
+ END_TEST;
+}
+
+int UtcDaliTextActorSetGradientColor(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor::SetGradientColor()");
+
+ TextActor actor = TextActor::New(TestTextHello);
+
+ DALI_TEST_CHECK(actor);
+
+ actor.SetGradientColor( Color::RED );
+ DALI_TEST_EQUALS( actor.GetGradientColor(), Color::RED, TEST_LOCATION );
+
+ actor.SetGradientColor( Color::BLUE );
+ DALI_TEST_EQUALS( actor.GetGradientColor(), Color::BLUE, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliTextActorSetGradientStartPoint(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor::SetGradientStartPoint()");
+
+ TextActor actor = TextActor::New(TestTextHello);
+
+ DALI_TEST_CHECK(actor);
+
+ actor.SetGradientStartPoint( Vector2(0.5f, 0.5f) );
+ DALI_TEST_EQUALS( actor.GetGradientStartPoint(), Vector2(0.5f, 0.5f), TEST_LOCATION );
+
+ actor.SetGradientStartPoint( Vector2(1.0f, 0.0f) );
+ DALI_TEST_EQUALS( actor.GetGradientStartPoint(), Vector2(1.0f, 0.0f), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliTextActorSetGradientEndPoint(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor::SetGradientEndPoint()");
+
+ TextActor actor = TextActor::New(TestTextHello);
+
+ DALI_TEST_CHECK(actor);
+
+ actor.SetGradientEndPoint( Vector2(0.25f, 0.25f) );
+ DALI_TEST_EQUALS( actor.GetGradientEndPoint(), Vector2(0.25f, 0.25f), TEST_LOCATION );
+
+ actor.SetGradientEndPoint( Vector2(0.0f, 1.0f) );
+ DALI_TEST_EQUALS( actor.GetGradientEndPoint(), Vector2(0.0f, 1.0f), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliTextActorSynchronousGlyphLoading(void)
+{
+ TestApplication application;
+
+ tet_infoline( "Testing synchronous loading of glyphs");
+
+ // All numerals 0 through 9 are 'fake' cached in the test abstraction glyphcache
+
+ // create text actor containg "Hello"
+ TextActor actor = TextActor::New(TestTextHello);
+
+ // no glyphs will be cached
+
+ // so..GetGlyphData should have been called to gather metrics
+ DALI_TEST_CHECK( application.GetPlatform().GetTrace().FindMethodAndParams( "GetGlyphData", "getBitmap:false" ) );
+ // ..but not to load glyph bitmap data
+ DALI_TEST_CHECK( ! application.GetPlatform().GetTrace().FindMethodAndParams( "GetGlyphData", "getBitmap:true" ) );
+ // ..also, cached high quality glyphs will not have been requested yet
+ DALI_TEST_CHECK( ! application.GetPlatform().WasCalled(TestPlatformAbstraction::GetCachedGlyphDataFunc) );
+
+ // reset PlatformAbstraction function call traces
+ application.GetPlatform().ResetTrace();
+
+ // Invoke Core::ProcessEvent and tick the update/render threads
+ application.SendNotification();
+ application.Render();
+
+ // An attempt to load high quality glyphs will have been requested and loaded nothing
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetCachedGlyphDataFunc) );
+ // low quality glyphs bitmap data will have now been generated
+ DALI_TEST_CHECK( application.GetPlatform().GetTrace().FindMethodAndParams( "GetGlyphData", "getBitmap:true" ) );
+
+ // request numerals
+ actor.SetText( "0123456789" );
+
+ // reset PlatformAbstraction function call traces
+ application.GetPlatform().ResetTrace();
+
+ application.SendNotification();
+ application.Render();
+
+ // An attempt to load high quality glyphs will have been requested and loaded all the numerals
+ DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::GetCachedGlyphDataFunc) );
+ // ..therefore no low quality glyphs bitmap data will have been requested
+ DALI_TEST_CHECK( !application.GetPlatform().GetTrace().FindMethodAndParams( "GetGlyphData", "getBitmap:true" ) );
+ END_TEST;
+}
+
+int UtcDaliTextActorAutomaticSizeSet(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor getting size based on text automatically");
+
+ // create empty text actor
+ TextActor actor = TextActor::New();
+ Stage::GetCurrent().Add(actor);
+
+ // initial size is zero
+ DALI_TEST_EQUALS( Vector3::ZERO, actor.GetCurrentSize(), TEST_LOCATION );
+
+ // set some text
+ actor.SetText( "a" );
+ // render a frame
+ application.SendNotification();
+ application.Render();
+
+ // dont care about the actual size as that is too hard to figure out, just want to validate that the size was changed to bigger
+ Vector3 currentSize = actor.GetCurrentSize();
+ DALI_TEST_GREATER( currentSize.width, 0.0f, TEST_LOCATION );
+ DALI_TEST_GREATER( currentSize.height, 0.0f, TEST_LOCATION );
+
+ // set some more text
+ actor.SetText( "abba" );
+ // render a frame
+ application.SendNotification();
+ application.Render();
+
+ Vector3 biggerSize = actor.GetCurrentSize();
+ DALI_TEST_GREATER( biggerSize.width, currentSize.width, TEST_LOCATION );
+
+ // set some shorter text
+ actor.SetText( "i" );
+ // render a frame
+ application.SendNotification();
+ application.Render();
+
+ // actor has shrunk
+ DALI_TEST_GREATER( biggerSize.width, actor.GetCurrentSize().width, TEST_LOCATION );
+
+ // set a size from application side, from this point onwards text actor no longer uses the "natural" size of the text
+ actor.SetSize( Vector2( 10.0f, 11.0f ) );
+ // render a frame
+ application.SendNotification();
+ application.Render();
+ // actor has the user set size
+ DALI_TEST_EQUALS( Vector2( 10.0f, 11.0f ), actor.GetCurrentSize().GetVectorXY(), TEST_LOCATION );
+
+ // set some different text
+ std::string longText( "jabba dabba duu" );
+ actor.SetText( longText );
+ // render a frame
+ application.SendNotification();
+ application.Render();
+ // actor still has the user set size
+ DALI_TEST_EQUALS( Vector2( 10.0f, 11.0f ), actor.GetCurrentSize().GetVectorXY(), TEST_LOCATION );
+
+ // set text to its natural size
+ actor.SetToNaturalSize();
+ // render a frame
+ application.SendNotification();
+ application.Render();
+ // actor has the natural size
+ Font defaultFont = Font::New();
+ Vector3 naturalSize = defaultFont.MeasureText( longText );
+ DALI_TEST_EQUALS( naturalSize.GetVectorXY(), actor.GetCurrentSize().GetVectorXY(), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliTextActorAutomaticSizeSetAnimation(void)
+{
+ TestApplication application;
+
+ tet_infoline("Testing Dali::TextActor getting size based on text automatically with animation");
+
+ // create empty text actor
+ TextActor actor = TextActor::New();
+ Stage::GetCurrent().Add(actor);
+
+ // initial size is zero
+ DALI_TEST_EQUALS( Vector3::ZERO, actor.GetCurrentSize(), TEST_LOCATION );
+
+ // set some text
+ actor.SetText( "a" );
+ // render a frame
+ application.SendNotification();
+ application.Render();
+
+ // dont care about the actual size as that is too hard to figure out, just want to validate that the size was changed to bigger
+ Vector3 currentSize = actor.GetCurrentSize();
+ DALI_TEST_GREATER( currentSize.width, 0.0f, TEST_LOCATION );
+ DALI_TEST_GREATER( currentSize.height, 0.0f, TEST_LOCATION );
+
+ // animate size, from this point onwards text actor no longer uses the "natural" size of the text
+ Animation sizeAnim = Animation::New( 0.1f ); // 0.1 seconds
+ Vector3 animationTargetSize( 20.0f, 30.0f, 0.0f );
+ sizeAnim.AnimateTo( Property( actor, Actor::SIZE ), animationTargetSize );
+ sizeAnim.Play();
+
+ // set some more text
+ actor.SetText( "abba" );
+ // render a frame
+ application.SendNotification();
+ application.Render( 1000 ); // 1 second to complete the animation
+
+ DALI_TEST_EQUALS( animationTargetSize, actor.GetCurrentSize(), TEST_LOCATION );
+
+ // set some more text
+ std::string moreText( "something else" );
+ actor.SetText( moreText );
+ // render a frame
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( animationTargetSize, actor.GetCurrentSize(), TEST_LOCATION );
+
+ // set text to its natural size
+ actor.SetToNaturalSize();
+ // render a frame
+ application.SendNotification();
+ application.Render();
+ // actor has the natural size
+ Font defaultFont = Font::New();
+ Vector3 naturalSize = defaultFont.MeasureText( moreText );
+ DALI_TEST_EQUALS( naturalSize.GetVectorXY(), actor.GetCurrentSize().GetVectorXY(), TEST_LOCATION );
+ END_TEST;
+}
+
+
+int UtcDaliTextActorPropertyIndices(void)
+{
+ TestApplication application;
+ Actor basicActor = Actor::New();
+ TextActor textActor = TextActor::New("Text");
+
+ Property::IndexContainer indices;
+ textActor.GetPropertyIndices( indices );
+ DALI_TEST_CHECK( indices.size() > basicActor.GetPropertyCount() );
+ DALI_TEST_EQUALS( indices.size(), textActor.GetPropertyCount(), TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_text_style_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_text_style_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+namespace
+{
+
+static const std::string FONT_FAMILY="Arial";
+static const std::string FONT_STYLE="Bold";
+static const PointSize FONT_POINT=PointSize(12.f);
+static const TextStyle::Weight FONT_TEXT_STYLE_WEIGHT = TextStyle::EXTRALIGHT;
+
+static const Vector4 FONT_TEXT_COLOR = Color::RED;
+static const Degree FONT_ITALICS_ANGLE(10.f);
+static const bool FONT_ITALICS = true;
+static const bool FONT_UNDERLINE = true;
+static const bool FONT_SHADOW = true;
+static const bool FONT_GLOW = true;
+static const bool FONT_OUTLINE = true;
+static const float FONT_UNDERLINE_THICKNESS = 5.0f;
+static const float FONT_UNDERLINE_POSITION = 60.0f;
+static const Vector4 FONT_SHADOW_COLOR = Color::BLUE;
+static const Vector2 FONT_SHADOW_OFFSET(2.f, 2.f );
+static const float FONT_SHADOW_SIZE = 55.f;
+static const Vector4 FONT_TEXT_GLOW_COLOR = Color::BLACK;
+static const float FONT_GLOW_INTENSITY = 10.0f;
+static const float FONT_SMOOTH_EDGE = 5.0f;
+static const Vector4 FONT_OUTLINE_COLOR = Color::MAGENTA;
+static const Vector2 FONT_OUTLINE_THICKNESS(15.f, 14.f );
+
+} // anon namespace
+
+int UtcDaliTextStyleDefaultConstructor(void)
+{
+ tet_infoline(" UtcDaliTextStyleDefaultConstructor ");
+
+ TestApplication application;
+
+ TextStyle defaultStyle;
+
+ DALI_TEST_CHECK( defaultStyle.GetFontName().empty() );
+ DALI_TEST_CHECK( PointSize( 0.f ) == defaultStyle.GetFontPointSize() );
+ DALI_TEST_CHECK( TextStyle::REGULAR == defaultStyle.GetWeight() );
+ DALI_TEST_CHECK( Color::WHITE == defaultStyle.GetTextColor() );
+ DALI_TEST_CHECK( !defaultStyle.GetItalics() );
+
+ DALI_TEST_CHECK( !defaultStyle.GetUnderline() );
+ DALI_TEST_CHECK( fabs( TextStyle::DEFAULT_UNDERLINE_THICKNESS - defaultStyle.GetUnderlineThickness() ) < GetRangedEpsilon( TextStyle::DEFAULT_UNDERLINE_THICKNESS, defaultStyle.GetUnderlineThickness() ) );
+ DALI_TEST_CHECK( fabs( TextStyle::DEFAULT_UNDERLINE_POSITION - defaultStyle.GetUnderlinePosition() ) < GetRangedEpsilon( TextStyle::DEFAULT_UNDERLINE_POSITION, defaultStyle.GetUnderlinePosition() ) );
+
+ DALI_TEST_CHECK( TextStyle::DEFAULT_ITALICS_ANGLE == defaultStyle.GetItalicsAngle() );
+ DALI_TEST_CHECK( TextStyle::DEFAULT_SHADOW_COLOR == defaultStyle.GetShadowColor() );
+ DALI_TEST_CHECK( TextStyle::DEFAULT_GLOW_COLOR == defaultStyle.GetGlowColor() );
+ DALI_TEST_CHECK( TextStyle::DEFAULT_OUTLINE_COLOR == defaultStyle.GetOutlineColor() );
+
+ DALI_TEST_CHECK( TextStyle::DEFAULT_SHADOW_OFFSET == defaultStyle.GetShadowOffset() );
+ DALI_TEST_CHECK( TextStyle::DEFAULT_OUTLINE_THICKNESS == defaultStyle.GetOutlineThickness() );
+ DALI_TEST_CHECK( fabs( TextStyle::DEFAULT_GLOW_INTENSITY - defaultStyle.GetGlowIntensity() ) < GetRangedEpsilon( TextStyle::DEFAULT_GLOW_INTENSITY, defaultStyle.GetGlowIntensity() ) );
+ DALI_TEST_CHECK( fabs( TextStyle::DEFAULT_SMOOTH_EDGE_DISTANCE_FIELD - defaultStyle.GetSmoothEdge() ) < GetRangedEpsilon( TextStyle::DEFAULT_SMOOTH_EDGE_DISTANCE_FIELD, defaultStyle.GetSmoothEdge() ) );
+ END_TEST;
+}
+
+int UtcDaliTextStyleCopyConstructor(void)
+{
+ tet_infoline(" UtcDaliTextStyleCopyConstructor ");
+
+ TestApplication application;
+
+ const std::string fontName( "Arial" );
+ const std::string fontStyle( "Book" );
+
+ TextStyle style;
+ style.SetFontName( fontName );
+ style.SetFontStyle( fontStyle );
+ style.SetFontPointSize( PointSize( 16.f ) );
+ style.SetWeight( TextStyle::EXTRABLACK );
+ style.SetTextColor( Color::BLUE );
+ style.SetItalics( true );
+ style.SetUnderline( true );
+ style.SetItalicsAngle( Degree( 15.f ) );
+ style.SetUnderlineThickness( 3.5f );
+ style.SetUnderlinePosition( 12.f );
+ style.SetShadow( true, Color::RED, Vector2( 0.5f, 0.5f ), TextStyle::DEFAULT_SHADOW_SIZE );
+ style.SetGlow( true, Color::GREEN, 0.75f );
+ style.SetSmoothEdge( 0.8f );
+ style.SetOutline( true, Color::BLUE, Vector2( 0.9f, 0.9f ) );
+
+ TextStyle style1( style );
+ TextStyle style2 = style;
+
+ DALI_TEST_CHECK( fontName == style1.GetFontName() );
+ DALI_TEST_CHECK( fontStyle == style.GetFontStyle() );
+ DALI_TEST_CHECK( PointSize( 16.f ) == style1.GetFontPointSize() );
+ DALI_TEST_CHECK( TextStyle::EXTRABLACK == style1.GetWeight() );
+ DALI_TEST_CHECK( Vector4( 0.f, 0.f, 1.f, 1.f ) == style1.GetTextColor() );
+ DALI_TEST_CHECK( style1.GetItalics() );
+ DALI_TEST_CHECK( style1.GetUnderline() );
+
+ DALI_TEST_CHECK( Degree( 15.f ) == style1.GetItalicsAngle() );
+ DALI_TEST_CHECK( Color::RED == style1.GetShadowColor() );
+ DALI_TEST_CHECK( Color::GREEN == style1.GetGlowColor() );
+ DALI_TEST_CHECK( Color::BLUE == style1.GetOutlineColor() );
+
+ DALI_TEST_CHECK( Vector2( 0.5f, 0.5f ) == style1.GetShadowOffset() );
+ DALI_TEST_CHECK( Vector2( 0.9f, 0.9f ) == style1.GetOutlineThickness() );
+ DALI_TEST_CHECK( fabs( 0.75f - style1.GetGlowIntensity() ) < GetRangedEpsilon( 0.75f, style1.GetGlowIntensity() ) );
+ DALI_TEST_CHECK( fabs( 0.8f - style1.GetSmoothEdge() ) < GetRangedEpsilon( 0.8f, style1.GetSmoothEdge() ) );
+
+ DALI_TEST_CHECK( fontName == style2.GetFontName() );
+ DALI_TEST_CHECK( PointSize( 16.f ) == style2.GetFontPointSize() );
+ DALI_TEST_CHECK( TextStyle::EXTRABLACK == style2.GetWeight() );
+ DALI_TEST_CHECK( Vector4( 0.f, 0.f, 1.f, 1.f ) == style2.GetTextColor() );
+ DALI_TEST_CHECK( style2.GetItalics() );
+
+ DALI_TEST_CHECK( style2.GetUnderline() );
+ DALI_TEST_CHECK( fabs( 3.5f - style2.GetUnderlineThickness() ) < GetRangedEpsilon( 3.5f, style2.GetUnderlineThickness() ) );
+ DALI_TEST_CHECK( fabs( 12.f - style2.GetUnderlinePosition() ) < GetRangedEpsilon( 12.f, style2.GetUnderlinePosition() ) );
+
+ DALI_TEST_CHECK( Color::RED == style2.GetShadowColor() );
+ DALI_TEST_CHECK( Color::GREEN == style2.GetGlowColor() );
+ DALI_TEST_CHECK( Color::BLUE == style2.GetOutlineColor() );
+
+ DALI_TEST_CHECK( Vector2( 0.5f, 0.5f ) == style2.GetShadowOffset() );
+ DALI_TEST_CHECK( Vector2( 0.9f, 0.9f ) == style2.GetOutlineThickness() );
+ DALI_TEST_CHECK( fabs( 0.75f - style2.GetGlowIntensity() ) < GetRangedEpsilon( 0.75f, style2.GetGlowIntensity() ) );
+ DALI_TEST_CHECK( fabs( 0.8f - style2.GetSmoothEdge() ) < GetRangedEpsilon( 0.8f, style2.GetSmoothEdge() ) );
+ END_TEST;
+}
+
+int UtcDaliTextStyleComparisonOperator(void)
+{
+ tet_infoline(" UtcDaliTextStyleComparisonOperator ");
+
+ TestApplication application;
+
+ TextStyle style1;
+ TextStyle style2;
+
+ const std::string fontName( "Arial" );
+
+ style1.SetFontName( fontName );
+ DALI_TEST_CHECK( style1 != style2 );
+
+ style2.SetFontName( fontName );
+ DALI_TEST_CHECK( style1 == style2 );
+ END_TEST;
+}
+
+int UtcDaliTextStyleCopy(void)
+{
+ tet_infoline(" UtcDaliTextStyleCopy ");
+
+ TestApplication application;
+
+ TextStyle style;
+
+ // Set a style different than default.
+ TextStyle style2;
+ style2.SetFontName( "Arial" );
+ style2.SetFontStyle( "Bold" );
+ style2.SetFontPointSize( PointSize( 24.f ) );
+ style2.SetWeight( TextStyle::BOLD );
+ style2.SetTextColor( Color::RED );
+ style2.SetItalics( true );
+ style2.SetUnderline( true );
+ style2.SetItalicsAngle( Degree( 15.f ) );
+ style2.SetUnderlineThickness( 3.5f );
+ style2.SetUnderlinePosition( 12.f );
+ style2.SetShadow( true, Color::GREEN, Vector2( 0.5f, 0.5f ), 0.5f );
+ style2.SetGlow( true, Color::BLUE, 0.5f );
+ style2.SetSmoothEdge( 0.5f );
+ style2.SetOutline( true, Color::WHITE, Vector2( 0.05f, 0.5f ) );
+
+ // Test mask.
+
+ // All values are copied.
+ style.Copy( style2 );
+
+ DALI_TEST_CHECK( style == style2 );
+
+ // Test FONT
+ style = TextStyle();
+
+ style.Copy( style2, TextStyle::FONT );
+
+ DALI_TEST_CHECK( style.GetFontName() != "" );
+
+ // Test STYLE
+ style = TextStyle();
+
+ style.Copy( style2, TextStyle::STYLE );
+
+ DALI_TEST_CHECK( style.GetFontStyle() != "" );
+
+ // Test SIZE
+ style = TextStyle();
+
+ style.Copy( style2, TextStyle::SIZE );
+
+ DALI_TEST_CHECK( style.GetFontPointSize() > 0.f );
+
+ // Test WEIGHT
+ style = TextStyle();
+
+ style.Copy( style2, TextStyle::WEIGHT );
+
+ DALI_TEST_CHECK( style.GetWeight() != TextStyle::REGULAR );
+ DALI_TEST_CHECK( fabsf( style.GetSmoothEdge() - TextStyle::DEFAULT_SMOOTH_EDGE_DISTANCE_FIELD ) > Math::MACHINE_EPSILON_1000 );
+
+ // Test COLOR
+ style = TextStyle();
+
+ style.Copy( style2, TextStyle::COLOR );
+
+ DALI_TEST_CHECK( style.GetTextColor() != TextStyle::DEFAULT_TEXT_COLOR );
+
+ // Test ITALICS
+ style = TextStyle();
+
+ style.Copy( style2, TextStyle::ITALICS );
+
+ DALI_TEST_CHECK( style.GetItalics() );
+ DALI_TEST_CHECK( Degree( 15.f ) == style.GetItalicsAngle() );
+
+ // Test UNDERLINE
+ style = TextStyle();
+
+ style.Copy( style2, TextStyle::UNDERLINE );
+
+ DALI_TEST_CHECK( style.GetUnderline() );
+ DALI_TEST_CHECK( fabs( 3.5f - style.GetUnderlineThickness() ) < GetRangedEpsilon( 3.5f, style.GetUnderlineThickness() ) );
+ DALI_TEST_CHECK( fabs( 12.f - style.GetUnderlinePosition() ) < GetRangedEpsilon( 12.f, style.GetUnderlinePosition() ) );
+
+ // Test SHADOW
+ style = TextStyle();
+
+ style.Copy( style2, TextStyle::SHADOW );
+
+ DALI_TEST_CHECK( style.GetShadow() );
+ DALI_TEST_CHECK( style.GetShadowColor() != TextStyle::DEFAULT_SHADOW_COLOR );
+ DALI_TEST_CHECK( style.GetShadowOffset() != TextStyle::DEFAULT_SHADOW_OFFSET );
+ DALI_TEST_CHECK( fabsf( style.GetShadowSize() - TextStyle::DEFAULT_SHADOW_SIZE ) > Math::MACHINE_EPSILON_1000 );
+
+ // Test GLOW
+ style = TextStyle();
+
+ style.Copy( style2, TextStyle::GLOW );
+
+ DALI_TEST_CHECK( style.GetGlow() );
+ DALI_TEST_CHECK( style.GetGlowColor() != TextStyle::DEFAULT_GLOW_COLOR );
+ DALI_TEST_CHECK( fabsf( style.GetGlowIntensity() - TextStyle::DEFAULT_GLOW_INTENSITY ) > Math::MACHINE_EPSILON_1000 );
+
+ // Test OUTLINE
+ style = TextStyle();
+
+ style.Copy( style2, TextStyle::OUTLINE );
+
+ DALI_TEST_CHECK( style.GetOutline() );
+ DALI_TEST_CHECK( style.GetOutlineColor() != TextStyle::DEFAULT_OUTLINE_COLOR );
+ DALI_TEST_CHECK( style.GetOutlineThickness() != TextStyle::DEFAULT_OUTLINE_THICKNESS );
+ END_TEST;
+}
+
+int UtcDaliTextStyleSetGetFontName(void)
+{
+ tet_infoline(" UtcDaliTextStyleSetGetFontName ");
+
+ TestApplication application;
+
+ TextStyle style;
+
+ const std::string fontName( "Arial" );
+ style.SetFontName( fontName );
+
+ DALI_TEST_CHECK( fontName == style.GetFontName() );
+ END_TEST;
+}
+
+int UtcDaliTextStyleSetGetFontStyle(void)
+{
+ tet_infoline(" UtcDaliTextStyleSetGetFontStyle ");
+
+ TestApplication application;
+
+ TextStyle style;
+
+ const std::string fontStyle( "Book" );
+ style.SetFontStyle( fontStyle );
+
+ DALI_TEST_CHECK( fontStyle == style.GetFontStyle() );
+ END_TEST;
+}
+
+int UtcDaliTextStyleSetGetFontPointSize(void)
+{
+ tet_infoline(" UtcDaliTextStyleSetGetFontPointSize ");
+
+ TestApplication application;
+
+ TextStyle style;
+
+ style.SetFontPointSize( PointSize( 16.f ) );
+
+ DALI_TEST_CHECK( PointSize( 16.f ) == style.GetFontPointSize() );
+ END_TEST;
+}
+
+int UtcDaliTextStyleSetGetWeight(void)
+{
+ tet_infoline(" UtcDaliTextStyleSetGetWeight ");
+
+ TestApplication application;
+
+ TextStyle style;
+
+ style.SetWeight( TextStyle::EXTRABLACK );
+
+ DALI_TEST_CHECK( TextStyle::EXTRABLACK == style.GetWeight() );
+ END_TEST;
+}
+
+int UtcDaliTextStyleSetGetTextColor(void)
+{
+ tet_infoline(" UtcDaliTextStyleSetGetTextColor ");
+
+ TestApplication application;
+
+ TextStyle style;
+
+ style.SetTextColor( Color::GREEN );
+
+ DALI_TEST_CHECK( Vector4( 0.f, 1.f, 0.f, 1.f ) == style.GetTextColor() );
+ END_TEST;
+}
+
+int UtcDaliTextStyleSetGetItalics(void)
+{
+ tet_infoline(" UtcDaliTextStyleSetGetItalics ");
+
+ TestApplication application;
+
+ TextStyle style;
+
+ style.SetItalics( true );
+
+ DALI_TEST_CHECK( style.GetItalics() );
+
+ style.SetItalics( false );
+
+ DALI_TEST_CHECK( !style.GetItalics() );
+ END_TEST;
+}
+
+int UtcDaliTextStyleSetGetItalicsAngle(void)
+{
+ tet_infoline(" UtcDaliTextStyleSetGetItalicsAngle ");
+
+ TestApplication application;
+
+ TextStyle style;
+
+ DALI_TEST_CHECK( TextStyle::DEFAULT_ITALICS_ANGLE == style.GetItalicsAngle() );
+
+ style.SetItalicsAngle( Degree( 15.f ) );
+
+ DALI_TEST_CHECK( Degree( 15.f ) == style.GetItalicsAngle() );
+ END_TEST;
+}
+
+int UtcDaliTextStyleSetGetUnderline(void)
+{
+ tet_infoline(" UtcDaliTextStyleSetGetUnderline ");
+
+ TestApplication application;
+
+ TextStyle style;
+
+ style.SetUnderline( true );
+
+ DALI_TEST_CHECK( style.GetUnderline() );
+
+ style.SetUnderline( false );
+
+ DALI_TEST_CHECK( !style.GetUnderline() );
+
+ style.SetUnderlineThickness( 3.5f );
+ style.SetUnderlinePosition( 12.f );
+
+ DALI_TEST_CHECK( fabs( 3.5f - style.GetUnderlineThickness() ) < GetRangedEpsilon( 3.5f, style.GetUnderlineThickness() ) );
+ DALI_TEST_CHECK( fabs( 12.f - style.GetUnderlinePosition() ) < GetRangedEpsilon( 12.f, style.GetUnderlinePosition() ) );
+ END_TEST;
+}
+
+int UtcDaliTextStyleSetGetShadow(void)
+{
+ tet_infoline(" UtcDaliTextStyleSetGetShadow ");
+
+ TestApplication application;
+
+ TextStyle style;
+
+ DALI_TEST_CHECK( !style.GetShadow() );
+
+ style.SetShadow( true );
+
+ DALI_TEST_CHECK( style.GetShadow() );
+
+ style.SetShadow( true, Color::RED, Vector2( 0.5f, 0.5f ) );
+
+ DALI_TEST_EQUALS( style.GetShadowColor(), Color::RED, TEST_LOCATION );
+ DALI_TEST_CHECK( Vector2( 0.5f, 0.5f ) == style.GetShadowOffset() );
+
+ style.SetShadow( false );
+
+ DALI_TEST_CHECK( !style.GetShadow() );
+ END_TEST;
+}
+
+int UtcDaliTextStyleSetGetGlow(void)
+{
+ tet_infoline(" UtcDaliTextStyleSetGetGlow ");
+
+ TestApplication application;
+
+ TextStyle style;
+
+ DALI_TEST_CHECK( !style.GetGlow() );
+
+ style.SetGlow( true );
+
+ DALI_TEST_CHECK( style.GetGlow() );
+
+ style.SetGlow( true, Color::RED, 0.75f );
+
+ DALI_TEST_EQUALS( style.GetGlowColor(), Color::RED, TEST_LOCATION );
+ DALI_TEST_CHECK( fabs( 0.75f - style.GetGlowIntensity() ) < GetRangedEpsilon( 0.75f, style.GetGlowIntensity() ) );
+
+ style.SetGlow( false );
+
+ DALI_TEST_CHECK( !style.GetGlow() );
+ END_TEST;
+}
+
+int UtcDaliTextStyleSetGetOutline(void)
+{
+ tet_infoline(" UtcDaliTextStyleSetGetGlow ");
+
+ TestApplication application;
+
+ TextStyle style;
+
+ DALI_TEST_CHECK( !style.GetOutline() );
+
+ style.SetOutline( true );
+
+ DALI_TEST_CHECK( style.GetOutline() );
+
+ style.SetOutline( true, Color::RED, Vector2( 0.9f, 0.9f ) );
+
+ DALI_TEST_EQUALS( style.GetOutlineColor(), Color::RED, TEST_LOCATION );
+ DALI_TEST_CHECK( Vector2( 0.9f, 0.9f ) == style.GetOutlineThickness() );
+
+ style.SetOutline( false );
+
+ DALI_TEST_CHECK( !style.GetOutline() );
+ END_TEST;
+}
+
+int UtcDaliTextStyleSetGetSmoothEdge(void)
+{
+ tet_infoline(" UtcDaliTextStyleSetGetGlow ");
+
+ TestApplication application;
+
+ TextStyle style;
+
+ style.SetSmoothEdge( 0.5f );
+
+ DALI_TEST_CHECK( fabs( 0.5f - style.GetSmoothEdge() ) < GetRangedEpsilon( 0.5f, style.GetSmoothEdge() ) );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/integration-api/events/touch-event-combiner.h>
+#include <dali/integration-api/events/touch-event-integ.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+using namespace Dali::Integration;
+
+void utc_dali_touch_event_combiner_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_touch_event_combiner_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+int UtcDaliTouchEventCombinerConstructors(void)
+{
+ TouchEventCombiner combiner1;
+ DALI_TEST_EQUALS( combiner1.GetMinimumMotionTimeThreshold(), static_cast<long unsigned>(1), TEST_LOCATION );
+ DALI_TEST_EQUALS( combiner1.GetMinimumMotionDistanceThreshold(), Vector2( 1.0f, 1.0f ), TEST_LOCATION );
+
+ TouchEventCombiner combiner2( 10, 20.0f, 31.0f );
+ DALI_TEST_EQUALS( combiner2.GetMinimumMotionTimeThreshold(), static_cast<long unsigned>(10), TEST_LOCATION );
+ DALI_TEST_EQUALS( combiner2.GetMinimumMotionDistanceThreshold(), Vector2( 20.0f, 31.0f ), TEST_LOCATION );
+
+ TouchEventCombiner combiner3( 10, Vector2( 20.0f, 31.0f ) );
+ DALI_TEST_EQUALS( combiner3.GetMinimumMotionTimeThreshold(), static_cast<long unsigned>(10), TEST_LOCATION );
+ DALI_TEST_EQUALS( combiner3.GetMinimumMotionDistanceThreshold(), Vector2( 20.0f, 31.0f ), TEST_LOCATION );
+
+ // Boundary Checks
+
+ TouchEventCombiner combiner4( 10, 0.0f, 0.0f );
+ DALI_TEST_EQUALS( combiner4.GetMinimumMotionDistanceThreshold(), Vector2( 0.0f, 0.0f ), TEST_LOCATION );
+
+ TouchEventCombiner combiner5( 10, Vector2( 0.0f, 0.0f ) );
+ DALI_TEST_EQUALS( combiner5.GetMinimumMotionDistanceThreshold(), Vector2( 0.0f, 0.0f ), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliTouchEventCombinerConstructorsNegative(void)
+{
+ try
+ {
+ TouchEventCombiner combiner( 10, -20.0f, 31.0f );
+ tet_printf( "%s: Should have asserted\n", TEST_LOCATION );
+ tet_result( TET_FAIL );
+ }
+ catch ( Dali::DaliException& e )
+ {
+ tet_result( TET_PASS );
+ }
+
+ try
+ {
+ TouchEventCombiner combiner( 10, 20.0f, -31.0f );
+ tet_printf( "%s: Should have asserted\n", TEST_LOCATION );
+ tet_result( TET_FAIL );
+ }
+ catch ( Dali::DaliException& e )
+ {
+ tet_result( TET_PASS );
+ }
+
+ try
+ {
+ TouchEventCombiner combiner( 10, Vector2( -20.0f, 31.0f ) );
+ tet_printf( "%s: Should have asserted\n", TEST_LOCATION );
+ tet_result( TET_FAIL );
+ }
+ catch ( Dali::DaliException& e )
+ {
+ tet_result( TET_PASS );
+ }
+
+ try
+ {
+ TouchEventCombiner combiner( 10, Vector2( 20.0f, -31.0f ) );
+ tet_printf( "%s: Should have asserted\n", TEST_LOCATION );
+ tet_result( TET_FAIL );
+ }
+ catch ( Dali::DaliException& e )
+ {
+ tet_result( TET_PASS );
+ }
+ END_TEST;
+}
+
+int UtcDaliTouchEventCombinerSettersAndGetters(void)
+{
+ TouchEventCombiner combiner;
+ unsigned long time( 10u );
+ Vector2 distance( 40.0f, 30.0f );
+
+ DALI_TEST_CHECK( combiner.GetMinimumMotionTimeThreshold() != time );
+ DALI_TEST_CHECK( combiner.GetMinimumMotionDistanceThreshold() != distance );
+
+ combiner.SetMinimumMotionTimeThreshold( time );
+ DALI_TEST_EQUALS( combiner.GetMinimumMotionTimeThreshold(), time, TEST_LOCATION );
+
+ combiner.SetMinimumMotionDistanceThreshold( distance.x );
+ DALI_TEST_EQUALS( combiner.GetMinimumMotionDistanceThreshold(), Vector2( distance.x, distance.x ), TEST_LOCATION );
+
+ distance.x = 20.0f;
+ distance.y = 50.0f;
+ combiner.SetMinimumMotionDistanceThreshold( distance.x, distance.y );
+ DALI_TEST_EQUALS( combiner.GetMinimumMotionDistanceThreshold(), distance, TEST_LOCATION );
+
+ distance.x = 100.0f;
+ distance.y = 20.0f;
+ combiner.SetMinimumMotionDistanceThreshold( distance );
+ DALI_TEST_EQUALS( combiner.GetMinimumMotionDistanceThreshold(), distance, TEST_LOCATION );
+
+ // Boundary Checks
+
+ combiner.SetMinimumMotionDistanceThreshold( 0.0f );
+ DALI_TEST_EQUALS( combiner.GetMinimumMotionDistanceThreshold(), Vector2::ZERO, TEST_LOCATION );
+
+ combiner.SetMinimumMotionDistanceThreshold( 0.0f, 0.0f );
+ DALI_TEST_EQUALS( combiner.GetMinimumMotionDistanceThreshold(), Vector2::ZERO, TEST_LOCATION );
+
+ combiner.SetMinimumMotionDistanceThreshold( Vector2::ZERO );
+ DALI_TEST_EQUALS( combiner.GetMinimumMotionDistanceThreshold(), Vector2::ZERO, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliTouchEventCombinerSettersNegative(void)
+{
+ TouchEventCombiner combiner;
+
+ try
+ {
+ combiner.SetMinimumMotionDistanceThreshold( -100.0f );
+ tet_printf( "%s: Should have asserted\n", TEST_LOCATION );
+ tet_result( TET_FAIL );
+ }
+ catch ( Dali::DaliException& e )
+ {
+ tet_result( TET_PASS );
+ }
+
+ try
+ {
+ combiner.SetMinimumMotionDistanceThreshold( -100.0f, 20.0f );
+ tet_printf( "%s: Should have asserted\n", TEST_LOCATION );
+ tet_result( TET_FAIL );
+ }
+ catch ( Dali::DaliException& e )
+ {
+ tet_result( TET_PASS );
+ }
+
+ try
+ {
+ combiner.SetMinimumMotionDistanceThreshold( 100.0f, -20.0f );
+ tet_printf( "%s: Should have asserted\n", TEST_LOCATION );
+ tet_result( TET_FAIL );
+ }
+ catch ( Dali::DaliException& e )
+ {
+ tet_result( TET_PASS );
+ }
+
+ try
+ {
+ combiner.SetMinimumMotionDistanceThreshold( Vector2( -100.0f, 20.0f ) );
+ tet_printf( "%s: Should have asserted\n", TEST_LOCATION );
+ tet_result( TET_FAIL );
+ }
+ catch ( Dali::DaliException& e )
+ {
+ tet_result( TET_PASS );
+ }
+
+ try
+ {
+ combiner.SetMinimumMotionDistanceThreshold( Vector2( 100.0f, -20.0f ) );
+ tet_printf( "%s: Should have asserted\n", TEST_LOCATION );
+ tet_result( TET_FAIL );
+ }
+ catch ( Dali::DaliException& e )
+ {
+ tet_result( TET_PASS );
+ }
+ END_TEST;
+}
+
+int UtcDaliTouchEventCombinerSingleTouchNormal(void)
+{
+ TouchEventCombiner combiner;
+ unsigned long time( 0u );
+
+ // Down event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Down, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+
+ time++;
+
+ // Motion in X direction
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Motion, 101.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+
+ time++;
+
+ // Motion in Y direction
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Motion, 101.0f, 101.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+
+ // Motion event, but same time
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Motion, 102.0f, 102.0f );
+
+ DALI_TEST_EQUALS( false, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ }
+
+ time++;
+
+ // Motion event, both X and Y movement
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Motion, 102.0f, 102.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+
+ time++;
+
+ // Motion event, no movement
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Motion, 102.0f, 102.0f );
+
+ DALI_TEST_EQUALS( false, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ }
+
+ // Up event, no time diff, no movement
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Up, 102.0f, 102.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliTouchEventCombinerSingleTouchMotionWithoutDown(void)
+{
+ TouchEventCombiner combiner;
+ unsigned long time( 0u );
+
+ // Motion event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Motion, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( false, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ }
+
+ time++;
+
+ // Motion event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Motion, 102.0f, 102.0f );
+
+ DALI_TEST_EQUALS( false, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliTouchEventCombinerSingleTouchTwoDowns(void)
+{
+ TouchEventCombiner combiner;
+ unsigned long time( 0u );
+
+ // Down event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Down, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+
+ time++;
+
+ // Another down with the same ID
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Down, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( false, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliTouchEventCombinerSingleTouchUpWithoutDown(void)
+{
+ TouchEventCombiner combiner;
+ unsigned long time( 0u );
+
+ // Up event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Up, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( false, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ }
+
+ time++;
+
+ // Up event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Up, 102.0f, 102.0f );
+
+ DALI_TEST_EQUALS( false, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliTouchEventCombinerSingleTouchTwoUps(void)
+{
+ TouchEventCombiner combiner;
+ unsigned long time( 0u );
+
+ // Down event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Down, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+
+ time++;
+
+ // Up event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Up, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+
+ time++;
+
+ // Another up event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Up, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( false, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliTouchEventCombinerSingleTouchUpWithDifferentId(void)
+{
+ TouchEventCombiner combiner;
+ unsigned long time( 0u );
+
+ // Down event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Down, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+
+ time++;
+
+ // Up event with different ID
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 2, TouchPoint::Up, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( false, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ }
+
+ time++;
+
+ // Up event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Up, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliTouchEventCombinerSingleTouchMotionWithDifferentId(void)
+{
+ TouchEventCombiner combiner;
+ unsigned long time( 0u );
+
+ // Down event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Down, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+
+ time++;
+
+ // Motion event with different ID
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 2, TouchPoint::Motion, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( false, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ }
+
+ time++;
+
+ // Motion event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Motion, 102.0f, 102.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliTouchEventCombinerMultiTouchNormal(void)
+{
+ TouchEventCombiner combiner;
+ unsigned long time( 0u );
+
+ // 1st point down
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Down, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+
+ time++;
+
+ // 2nd point down
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 2, TouchPoint::Down, 200.0f, 200.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 2u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[1].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, TouchPoint::Stationary, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[1].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[1].screen, point.screen, TEST_LOCATION );
+ }
+
+ time++;
+
+ // 1st point motion
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Motion, 101.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 2u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[1].state, TouchPoint::Stationary, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+
+ // 2nd point motion, no time diff
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 2, TouchPoint::Motion, 200.0f, 200.0f );
+
+ DALI_TEST_EQUALS( false, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ }
+
+ time++;
+
+ // 2nd point motion
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 2, TouchPoint::Motion, 201.0f, 201.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 2u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[1].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, TouchPoint::Stationary, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[1].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[1].screen, point.screen, TEST_LOCATION );
+ }
+
+ time++;
+
+ // 1st point up
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Up, 101.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 2u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[1].state, TouchPoint::Stationary, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+
+ time++;
+
+ // 2nd point motion
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 2, TouchPoint::Motion, 202.0f, 202.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+
+ time++;
+
+ // 2nd point up
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 2, TouchPoint::Up, 202.0f, 202.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliTouchEventCombinerSeveralPoints(void)
+{
+ TouchEventCombiner combiner;
+ unsigned long time( 0u );
+ unsigned int const maximum( 200u );
+
+ // Several downs
+ for ( unsigned int pointCount = 1u; pointCount < maximum; ++pointCount )
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( pointCount, TouchPoint::Down, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time++, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), pointCount, TEST_LOCATION );
+ }
+
+ // Several Ups
+ for ( unsigned int pointCount = maximum - 1; pointCount > 0; --pointCount )
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( pointCount, TouchPoint::Up, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time++, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), pointCount, TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliTouchEventCombinerReset(void)
+{
+ TouchEventCombiner combiner;
+ unsigned long time( 0u );
+
+ // Down event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Down, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+
+ time++;
+
+ // Reset combiner, no more events should be sent to core.
+ combiner.Reset();
+
+ // Up event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Up, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( false, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliTouchEventCombinerSingleTouchInterrupted(void)
+{
+ TouchEventCombiner combiner;
+ unsigned long time( 0u );
+
+ // Down event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Down, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].deviceId, point.deviceId, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].screen, point.screen, TEST_LOCATION );
+ }
+
+ time++;
+
+ // Interrupted event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Interrupted, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ }
+
+ // Send up, should not be able to send as combiner has been reset.
+ // Up event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Up, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( false, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliTouchEventCombinerMultiTouchInterrupted(void)
+{
+ TouchEventCombiner combiner;
+ unsigned long time( 0u );
+ unsigned int const maximum( 200u );
+
+ // Several downs
+ for ( unsigned int pointCount = 1u; pointCount < maximum; ++pointCount )
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( pointCount, TouchPoint::Down, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time++, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), pointCount, TEST_LOCATION );
+ }
+
+ // Interrupted event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Interrupted, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( true, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.GetPointCount(), 1u, TEST_LOCATION );
+ DALI_TEST_EQUALS( touchEvent.points[0].state, point.state, TEST_LOCATION );
+ }
+
+ // Send up, should not be able to send as combiner has been reset.
+ // Up event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Up, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( false, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliTouchEventCombinerInvalidState(void)
+{
+ TouchEventCombiner combiner;
+ unsigned long time( 0u );
+
+ // Stationary event
+ {
+ Integration::TouchEvent touchEvent;
+ TouchPoint point( 1, TouchPoint::Stationary, 100.0f, 100.0f );
+
+ DALI_TEST_EQUALS( false, combiner.GetNextTouchEvent( point, time, touchEvent ), TEST_LOCATION );
+ }
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali/integration-api/events/touch-event-integ.h>
+#include <dali/integration-api/system-overlay.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_touch_processing_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_touch_processing_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+namespace
+{
+
+// Stores data that is populated in the callback and will be read by the TET cases
+struct SignalData
+{
+ SignalData()
+ : functorCalled( false ),
+ touchEvent(),
+ touchedActor()
+ {
+ }
+
+ void Reset()
+ {
+ functorCalled = false;
+
+ touchEvent.time = 0u;
+ touchEvent.points.clear();
+
+ touchedActor = NULL;
+ }
+
+ bool functorCalled;
+ TouchEvent touchEvent;
+ Actor touchedActor;
+};
+
+// Functor that sets the data when called
+struct TouchEventFunctor
+{
+ /**
+ * Constructor.
+ * @param[in] data Reference to the data to store callback information.
+ * @param[in] returnValue What the functor should return.
+ */
+ TouchEventFunctor( SignalData& data, bool returnValue = true )
+ : signalData( data ),
+ returnValue( returnValue )
+ {
+ }
+
+ bool operator()( Actor actor, const TouchEvent& touchEvent )
+ {
+ signalData.functorCalled = true;
+ signalData.touchedActor = actor;
+ signalData.touchEvent = touchEvent;
+
+ return returnValue;
+ }
+
+ SignalData& signalData;
+ bool returnValue;
+};
+
+// Functor that removes the actor when called.
+struct RemoveActorFunctor : public TouchEventFunctor
+{
+ /**
+ * Constructor.
+ * @param[in] data Reference to the data to store callback information.
+ * @param[in] returnValue What the functor should return.
+ */
+ RemoveActorFunctor( SignalData& data, bool returnValue = true )
+ : TouchEventFunctor( data, returnValue )
+ {
+ }
+
+ bool operator()( Actor actor, const TouchEvent& touchEvent )
+ {
+ Actor parent( actor.GetParent() );
+ if ( parent )
+ {
+ parent.Remove( actor );
+ }
+
+ return TouchEventFunctor::operator()( actor, touchEvent );
+ }
+};
+
+Integration::TouchEvent GenerateSingleTouch( TouchPoint::State state, Vector2 screenPosition )
+{
+ Integration::TouchEvent touchEvent;
+ touchEvent.points.push_back( TouchPoint ( 0, state, screenPosition.x, screenPosition.y ) );
+ return touchEvent;
+}
+
+} // anon namespace
+
+///////////////////////////////////////////////////////////////////////////////
+
+int UtcDaliTouchNormalProcessing(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to actor's touched signal
+ SignalData data;
+ TouchEventFunctor functor( data );
+ actor.TouchedSignal().Connect( &application, functor );
+
+ Vector2 screenCoordinates( 10.0f, 10.0f );
+ Vector2 localCoordinates;
+ actor.ScreenToLocal( localCoordinates.x, localCoordinates.y, screenCoordinates.x, screenCoordinates.y );
+
+ // Emit a down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( 1u, data.touchEvent.GetPointCount(), TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_EQUALS( screenCoordinates, data.touchEvent.points[0].screen, TEST_LOCATION );
+ DALI_TEST_EQUALS( localCoordinates, data.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
+ data.Reset();
+
+ // Emit a motion signal
+ screenCoordinates.x = screenCoordinates.y = 11.0f;
+ actor.ScreenToLocal( localCoordinates.x, localCoordinates.y, screenCoordinates.x, screenCoordinates.y );
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, screenCoordinates ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( 1u, data.touchEvent.GetPointCount(), TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Motion, data.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_EQUALS( screenCoordinates, data.touchEvent.points[0].screen, TEST_LOCATION );
+ DALI_TEST_EQUALS( localCoordinates, data.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
+ data.Reset();
+
+ // Emit an up signal
+ screenCoordinates.x = screenCoordinates.y = 12.0f;
+ actor.ScreenToLocal( localCoordinates.x, localCoordinates.y, screenCoordinates.x, screenCoordinates.y );
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Up, screenCoordinates ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( 1u, data.touchEvent.GetPointCount(), TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Up, data.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_EQUALS( screenCoordinates, data.touchEvent.points[0].screen, TEST_LOCATION );
+ DALI_TEST_EQUALS( localCoordinates, data.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
+ data.Reset();
+
+ // Emit a down signal where the actor is not present
+ screenCoordinates.x = screenCoordinates.y = 200.0f;
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliTouchOutsideCameraNearFarPlanes(void)
+{
+ TestApplication application;
+
+ Stage stage = Stage::GetCurrent();
+ Vector2 stageSize = stage.GetSize();
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::CENTER);
+ actor.SetParentOrigin(ParentOrigin::CENTER);
+ stage.Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Get the camera's near and far planes
+ RenderTaskList taskList = stage.GetRenderTaskList();
+ Dali::RenderTask task = taskList.GetTask(0);
+ CameraActor camera = task.GetCameraActor();
+ float nearPlane = camera.GetNearClippingPlane();
+ float farPlane = camera.GetFarClippingPlane();
+
+ // Calculate the current distance of the actor from the camera
+ float tanHalfFov = tanf(camera.GetFieldOfView() * 0.5f);
+ float distance = (stageSize.y * 0.5f) / tanHalfFov;
+
+ // Connect to actor's touched signal
+ SignalData data;
+ TouchEventFunctor functor( data );
+ actor.TouchedSignal().Connect( &application, functor );
+
+ Vector2 screenCoordinates( stageSize.x * 0.5f, stageSize.y * 0.5f );
+
+ // Emit a down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Emit a down signal where actor is just at the camera's near plane
+ actor.SetZ(distance - nearPlane);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Emit a down signal where actor is closer than the camera's near plane
+ actor.SetZ((distance - nearPlane) + 1.0f);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Emit a down signal where actor is just at the camera's far plane
+ actor.SetZ(distance - farPlane);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Emit a down signal where actor is further than the camera's far plane
+ actor.SetZ((distance - farPlane) - 1.0f);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+ END_TEST;
+}
+
+int UtcDaliTouchEmitEmpty(void)
+{
+ TestApplication application;
+
+ try
+ {
+ // Emit an empty TouchEvent
+ Integration::TouchEvent event;
+ application.ProcessEvent( event );
+ tet_result( TET_FAIL );
+ }
+ catch ( Dali::DaliException& e )
+ {
+ DALI_TEST_ASSERT( e, "!event.points.empty()", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliTouchInterrupted(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to actor's touched signal
+ SignalData data;
+ TouchEventFunctor functor( data );
+ actor.TouchedSignal().Connect( &application, functor );
+
+ // Emit a down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
+ data.Reset();
+
+ // Emit an interrupted signal, we should be signalled regardless of whether there is a hit or not.
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Interrupted, Vector2( 200.0f, 200.0f /* Outside actor */ ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Interrupted, data.touchEvent.points[0].state, TEST_LOCATION );
+ data.Reset();
+
+ // Emit another interrupted signal, our signal handler should not be called.
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Interrupted, Vector2( 200.0f, 200.0f ) ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliTouchParentConsumer(void)
+{
+ TestApplication application;
+ Actor rootActor( Stage::GetCurrent().GetRootLayer() );
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to actor's touched signal
+ SignalData data;
+ TouchEventFunctor functor( data, false );
+ actor.TouchedSignal().Connect( &application, functor );
+
+ // Connect to root actor's touched signal
+ SignalData rootData;
+ TouchEventFunctor rootFunctor( rootData ); // Consumes signal
+ rootActor.TouchedSignal().Connect( &application, rootFunctor );
+
+ Vector2 screenCoordinates( 10.0f, 10.0f );
+ Vector2 actorCoordinates, rootCoordinates;
+ actor.ScreenToLocal( actorCoordinates.x, actorCoordinates.y, screenCoordinates.x, screenCoordinates.y );
+ rootActor.ScreenToLocal( rootCoordinates.x, rootCoordinates.y, screenCoordinates.x, screenCoordinates.y );
+
+ // Emit a down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( 1u, data.touchEvent.GetPointCount(), TEST_LOCATION );
+ DALI_TEST_EQUALS( 1u, rootData.touchEvent.GetPointCount(), TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Down, rootData.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_EQUALS( screenCoordinates, data.touchEvent.points[0].screen, TEST_LOCATION );
+ DALI_TEST_EQUALS( screenCoordinates, rootData.touchEvent.points[0].screen, TEST_LOCATION );
+ DALI_TEST_EQUALS( actorCoordinates, data.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
+ DALI_TEST_EQUALS( rootCoordinates, rootData.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
+ DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
+ DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
+ data.Reset();
+ rootData.Reset();
+
+ // Emit a motion signal
+ screenCoordinates.x = screenCoordinates.y = 11.0f;
+ actor.ScreenToLocal( actorCoordinates.x, actorCoordinates.y, screenCoordinates.x, screenCoordinates.y );
+ rootActor.ScreenToLocal( rootCoordinates.x, rootCoordinates.y, screenCoordinates.x, screenCoordinates.y );
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, screenCoordinates ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( 1u, data.touchEvent.GetPointCount(), TEST_LOCATION );
+ DALI_TEST_EQUALS( 1u, rootData.touchEvent.GetPointCount(), TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Motion, data.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Motion, rootData.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_EQUALS( screenCoordinates, data.touchEvent.points[0].screen, TEST_LOCATION );
+ DALI_TEST_EQUALS( screenCoordinates, rootData.touchEvent.points[0].screen, TEST_LOCATION );
+ DALI_TEST_EQUALS( actorCoordinates, data.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
+ DALI_TEST_EQUALS( rootCoordinates, rootData.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
+ DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
+ DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
+ data.Reset();
+ rootData.Reset();
+
+ // Emit an up signal
+ screenCoordinates.x = screenCoordinates.y = 12.0f;
+ actor.ScreenToLocal( actorCoordinates.x, actorCoordinates.y, screenCoordinates.x, screenCoordinates.y );
+ rootActor.ScreenToLocal( rootCoordinates.x, rootCoordinates.y, screenCoordinates.x, screenCoordinates.y );
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Up, screenCoordinates ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( 1u, data.touchEvent.GetPointCount(), TEST_LOCATION );
+ DALI_TEST_EQUALS( 1u, rootData.touchEvent.GetPointCount(), TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Up, data.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Up, rootData.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_EQUALS( screenCoordinates, data.touchEvent.points[0].screen, TEST_LOCATION );
+ DALI_TEST_EQUALS( screenCoordinates, rootData.touchEvent.points[0].screen, TEST_LOCATION );
+ DALI_TEST_EQUALS( actorCoordinates, data.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
+ DALI_TEST_EQUALS( rootCoordinates, rootData.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
+ DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
+ DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
+ data.Reset();
+ rootData.Reset();
+
+ // Emit a down signal where the actor is not present, will hit the root actor though
+ screenCoordinates.x = screenCoordinates.y = 200.0f;
+ rootActor.ScreenToLocal( rootCoordinates.x, rootCoordinates.y, screenCoordinates.x, screenCoordinates.y );
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, screenCoordinates ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( 1u, rootData.touchEvent.GetPointCount(), TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Down, rootData.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_EQUALS( screenCoordinates, rootData.touchEvent.points[0].screen, TEST_LOCATION );
+ DALI_TEST_EQUALS( rootCoordinates, rootData.touchEvent.points[0].local, 0.1f, TEST_LOCATION );
+ DALI_TEST_CHECK( rootActor == rootData.touchEvent.points[0].hitActor );
+ END_TEST;
+}
+
+int UtcDaliTouchInterruptedParentConsumer(void)
+{
+ TestApplication application;
+ Actor rootActor( Stage::GetCurrent().GetRootLayer() );
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to actor's touched signal
+ SignalData data;
+ TouchEventFunctor functor( data, false );
+ actor.TouchedSignal().Connect( &application, functor );
+
+ // Connect to root actor's touched signal
+ SignalData rootData;
+ TouchEventFunctor rootFunctor( rootData ); // Consumes signal
+ rootActor.TouchedSignal().Connect( &application, rootFunctor );
+
+ // Emit a down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Down, rootData.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
+ DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
+ data.Reset();
+ rootData.Reset();
+
+ // Emit an interrupted signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Interrupted, Vector2( 200.0f, 200.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Interrupted, data.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Interrupted, rootData.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
+ DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
+ data.Reset();
+ rootData.Reset();
+
+ // Emit another down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Down, rootData.touchEvent.points[0].state, TEST_LOCATION );
+ data.Reset();
+ rootData.Reset();
+
+ // Remove actor from Stage
+ Stage::GetCurrent().Remove( actor );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Emit an interrupted signal, only root actor's signal should be called.
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Interrupted, Vector2( 200.0f, 200.0f /* Outside actor */ ) ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Interrupted, rootData.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_CHECK( rootActor == rootData.touchEvent.points[0].hitActor );
+ data.Reset();
+ rootData.Reset();
+
+ // Emit another interrupted state, none of the signal's should be called.
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Interrupted, Vector2( 200.0f, 200.0f ) ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( false, rootData.functorCalled, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliTouchLeave(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to actor's touched signal
+ SignalData data;
+ TouchEventFunctor functor( data );
+ actor.TouchedSignal().Connect( &application, functor );
+
+ // Set actor to require leave events
+ actor.SetLeaveRequired( true );
+
+ // Emit a down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
+ data.Reset();
+
+ // Emit a motion signal outside of actor, should be signalled with a Leave
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 200.0f, 200.0f )) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Leave, data.touchEvent.points[0].state, TEST_LOCATION );
+ data.Reset();
+
+ // Another motion outside of actor, no signalling
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 201.0f, 201.0f )) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Another motion event inside actor, signalled with motion
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 10.0f, 10.0f )) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Motion, data.touchEvent.points[0].state, TEST_LOCATION );
+ data.Reset();
+
+ // We do not want to listen to leave events anymore
+ actor.SetLeaveRequired( false );
+
+ // Another motion event outside of actor, no signalling
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 200.0f, 200.0f )) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+ END_TEST;
+}
+
+int UtcDaliTouchLeaveParentConsumer(void)
+{
+ TestApplication application;
+ Actor rootActor( Stage::GetCurrent().GetRootLayer() );
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to actor's touched signal
+ SignalData data;
+ TouchEventFunctor functor( data, false );
+ actor.TouchedSignal().Connect( &application, functor );
+
+ // Connect to root actor's touched signal
+ SignalData rootData;
+ TouchEventFunctor rootFunctor( rootData ); // Consumes signal
+ rootActor.TouchedSignal().Connect( &application, rootFunctor );
+
+ // Set actor to require leave events
+ actor.SetLeaveRequired( true );
+ rootActor.SetLeaveRequired( true );
+
+ // Emit a down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Down, rootData.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
+ DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
+ data.Reset();
+ rootData.Reset();
+
+ // Emit a motion signal outside of actor, should be signalled with a Leave
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 200.0f, 200.0f )) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Leave, data.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Leave, rootData.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
+ DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
+ data.Reset();
+ rootData.Reset();
+
+ // Another motion outside of actor, only rootActor signalled
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 201.0f, 201.0f )) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Motion, rootData.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_CHECK( rootActor == rootData.touchEvent.points[0].hitActor );
+ data.Reset();
+ rootData.Reset();
+
+ // Another motion event inside actor, signalled with motion
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 10.0f, 10.0f )) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Motion, data.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Motion, rootData.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
+ DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
+ data.Reset();
+ rootData.Reset();
+
+ // We do not want to listen to leave events of actor anymore
+ actor.SetLeaveRequired( false );
+
+ // Another motion event outside of root actor, only root signalled
+ Vector2 stageSize( Stage::GetCurrent().GetSize() );
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( stageSize.width + 10.0f, stageSize.height + 10.0f )) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Leave, rootData.touchEvent.points[0].state, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliTouchActorBecomesInsensitive(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to actor's touched signal
+ SignalData data;
+ TouchEventFunctor functor( data );
+ actor.TouchedSignal().Connect( &application, functor );
+
+ // Emit a down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
+ data.Reset();
+
+ // Change actor to insensitive
+ actor.SetSensitive( false );
+
+ // Emit a motion signal, signalled with an interrupted
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 200.0f, 200.0f )) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Interrupted, data.touchEvent.points[0].state, TEST_LOCATION );
+ data.Reset();
+ END_TEST;
+}
+
+int UtcDaliTouchActorBecomesInsensitiveParentConsumer(void)
+{
+ TestApplication application;
+ Actor rootActor( Stage::GetCurrent().GetRootLayer() );
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to actor's touched signal
+ SignalData data;
+ TouchEventFunctor functor( data, false );
+ actor.TouchedSignal().Connect( &application, functor );
+
+ // Connect to root actor's touched signal
+ SignalData rootData;
+ TouchEventFunctor rootFunctor( rootData ); // Consumes signal
+ rootActor.TouchedSignal().Connect( &application, rootFunctor );
+
+ // Emit a down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Down, data.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Down, rootData.touchEvent.points[0].state, TEST_LOCATION );
+ DALI_TEST_CHECK( actor == data.touchEvent.points[0].hitActor );
+ DALI_TEST_CHECK( actor == rootData.touchEvent.points[0].hitActor );
+ data.Reset();
+ rootData.Reset();
+
+ // Remove actor from Stage
+ Stage::GetCurrent().Remove( actor );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Make root actor insensitive
+ rootActor.SetSensitive( false );
+
+ // Emit a motion signal, signalled with an interrupted (should get interrupted even if within root actor)
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2 ( 200.0f, 200.0f )) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( true, rootData.functorCalled, TEST_LOCATION );
+ DALI_TEST_EQUALS( TouchPoint::Interrupted, rootData.touchEvent.points[0].state, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliTouchMultipleLayers(void)
+{
+ TestApplication application;
+ Actor rootActor( Stage::GetCurrent().GetRootLayer() );
+
+ // Connect to actor's touched signal
+ SignalData data;
+ TouchEventFunctor functor( data );
+
+ Layer layer1 ( Layer::New() );
+ layer1.SetSize(100.0f, 100.0f);
+ layer1.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add( layer1 );
+
+ Actor actor1 ( Actor::New() );
+ actor1.SetSize( 100.0f, 100.0f );
+ actor1.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ actor1.SetZ( 1.0f ); // Should hit actor1 in this layer
+ layer1.Add( actor1 );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to layer1 and actor1
+ layer1.TouchedSignal().Connect( &application, functor );
+ actor1.TouchedSignal().Connect( &application, functor );
+
+ // Hit in hittable area, actor1 should be hit
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( data.touchedActor == actor1 );
+ data.Reset();
+
+ // Make layer1 insensitive, nothing should be hit
+ layer1.SetSensitive( false );
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Make layer1 sensitive again, again actor1 will be hit
+ layer1.SetSensitive( true );
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( data.touchedActor == actor1 );
+ data.Reset();
+
+ // Make rootActor insensitive, nothing should be hit
+ rootActor.SetSensitive( false );
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Make rootActor sensitive
+ rootActor.SetSensitive( true );
+
+ // Add another layer
+ Layer layer2 ( Layer::New() );
+ layer2.SetSize(100.0f, 100.0f );
+ layer2.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ layer2.SetZ( 10.0f ); // Should hit layer2 in this layer rather than actor2
+ Stage::GetCurrent().Add( layer2 );
+
+ Actor actor2 ( Actor::New() );
+ actor2.SetSize(100.0f, 100.0f);
+ actor2.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ layer2.Add( actor2 );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to layer2 and actor2
+ layer2.TouchedSignal().Connect( &application, functor );
+ actor2.TouchedSignal().Connect( &application, functor );
+
+ // Emit an event, should hit layer2
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ //DALI_TEST_CHECK( data.touchedActor == layer2 ); // TODO: Uncomment this after removing renderable hack!
+ data.Reset();
+
+ // Make layer2 insensitive, should hit actor1
+ layer2.SetSensitive( false );
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( data.touchedActor == actor1 );
+ data.Reset();
+
+ // Make layer2 sensitive again, should hit layer2
+ layer2.SetSensitive( true );
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ //DALI_TEST_CHECK( data.touchedActor == layer2 ); // TODO: Uncomment this after removing renderable hack!
+ data.Reset();
+
+ // Make layer2 invisible, render and notify
+ layer2.SetVisible( false );
+ application.SendNotification();
+ application.Render();
+
+ // Should hit actor1
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( data.touchedActor == actor1 );
+ data.Reset();
+
+ // Make rootActor invisible, render and notify
+ rootActor.SetVisible( false );
+ application.SendNotification();
+ application.Render();
+
+ // Should not hit anything
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+ END_TEST;
+}
+
+int UtcDaliTouchMultipleRenderTasks(void)
+{
+ TestApplication application;
+ Stage stage ( Stage::GetCurrent() );
+ Vector2 stageSize ( stage.GetSize() );
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ stage.Add(actor);
+
+ // Create render task
+ Viewport viewport( stageSize.width * 0.5f, stageSize.height * 0.5f, stageSize.width * 0.5f, stageSize.height * 0.5f );
+ RenderTask renderTask ( Stage::GetCurrent().GetRenderTaskList().CreateTask() );
+ renderTask.SetViewport( viewport );
+ renderTask.SetInputEnabled( true );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to actor's touched signal
+ SignalData data;
+ TouchEventFunctor functor( data );
+ actor.TouchedSignal().Connect( &application, functor );
+
+ // Emit a down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Ensure renderTask actor can be hit too.
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( viewport.x + 5.0f, viewport.y + 5.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Disable input on renderTask, should not be hittable
+ renderTask.SetInputEnabled( false );
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( viewport.x + 5.0f, viewport.y + 5.0f ) ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+ END_TEST;
+}
+
+int UtcDaliTouchMultipleRenderTasksWithChildLayer(void)
+{
+ TestApplication application;
+ Stage stage ( Stage::GetCurrent() );
+ Vector2 stageSize ( stage.GetSize() );
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ stage.Add(actor);
+
+ Layer layer = Layer::New();
+ layer.SetSize(100.0f, 100.0f);
+ layer.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ actor.Add(layer);
+
+ // Create render task
+ Viewport viewport( stageSize.width * 0.5f, stageSize.height * 0.5f, stageSize.width * 0.5f, stageSize.height * 0.5f );
+ RenderTask renderTask ( Stage::GetCurrent().GetRenderTaskList().CreateTask() );
+ renderTask.SetViewport( viewport );
+ renderTask.SetInputEnabled( true );
+ renderTask.SetSourceActor( actor );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to layer's touched signal
+ SignalData data;
+ TouchEventFunctor functor( data );
+ actor.TouchedSignal().Connect( &application, functor );
+ layer.TouchedSignal().Connect( &application, functor );
+
+ // Emit a down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Ensure renderTask actor can be hit too.
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( viewport.x + 5.0f, viewport.y + 5.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Disable input on renderTask, should not be hittable
+ renderTask.SetInputEnabled( false );
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( viewport.x + 5.0f, viewport.y + 5.0f ) ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+ END_TEST;
+}
+
+int UtcDaliTouchOffscreenRenderTasks(void)
+{
+ TestApplication application;
+ Stage stage ( Stage::GetCurrent() );
+ Vector2 stageSize ( stage.GetSize() );
+
+ // FrameBufferImage for offscreen RenderTask
+ FrameBufferImage frameBufferImage( FrameBufferImage::New( stageSize.width, stageSize.height, Pixel::RGBA8888 ) );
+
+ // Create an image actor to display the FrameBufferImage
+ ImageActor imageActor ( ImageActor::New( frameBufferImage ) );
+ imageActor.SetParentOrigin(ParentOrigin::CENTER);
+ imageActor.SetSize( stageSize.x, stageSize.y );
+ imageActor.ScaleBy( Vector3(1.0f, -1.0f, 1.0f) ); // FIXME
+ stage.Add( imageActor );
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ stage.Add( actor );
+ application.GetGlAbstraction().SetCheckFramebufferStatusResult( GL_FRAMEBUFFER_COMPLETE ); // Ensure framebuffer connects
+
+ stage.GetRenderTaskList().GetTask( 0u ).SetScreenToFrameBufferFunction( RenderTask::FULLSCREEN_FRAMEBUFFER_FUNCTION );
+
+ // Create a RenderTask
+ RenderTask renderTask = stage.GetRenderTaskList().CreateTask();
+ renderTask.SetSourceActor( actor );
+ renderTask.SetTargetFrameBuffer( frameBufferImage );
+ renderTask.SetInputEnabled( true );
+
+ // Create another RenderTask
+ RenderTask renderTask2( stage.GetRenderTaskList().CreateTask() );
+ renderTask2.SetInputEnabled( true );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to actor's touched signal
+ SignalData data;
+ TouchEventFunctor functor( data );
+ actor.TouchedSignal().Connect( &application, functor );
+
+ // Emit a down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+ END_TEST;
+}
+
+int UtcDaliTouchMultipleRenderableActors(void)
+{
+ TestApplication application;
+ Stage stage ( Stage::GetCurrent() );
+ Vector2 stageSize ( stage.GetSize() );
+
+ Actor parent = ImageActor::New();
+ parent.SetSize(100.0f, 100.0f);
+ parent.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ stage.Add(parent);
+
+ Actor actor = ImageActor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ parent.Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to layer's touched signal
+ SignalData data;
+ TouchEventFunctor functor( data );
+ parent.TouchedSignal().Connect( &application, functor );
+ actor.TouchedSignal().Connect( &application, functor );
+
+ // Emit a down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( actor == data.touchedActor );
+ END_TEST;
+}
+
+int UtcDaliTouchActorRemovedInSignal(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to actor's touched signal
+ SignalData data;
+ RemoveActorFunctor functor( data );
+ actor.TouchedSignal().Connect( &application, functor );
+
+ // Register for leave events
+ actor.SetLeaveRequired( true );
+
+ // Emit a down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Re-add, render and notify
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render();
+
+ // Emit another signal outside of actor's area, should not get anything as the scene has changed.
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2( 210.0f, 210.0f ) ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Emit a down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Emit another signal outside of actor's area, should not get anything as the scene has changed.
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2( 210.0f, 210.0f ) ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Re-add actor back to stage, render and notify
+ Stage::GetCurrent().Add(actor);
+ application.SendNotification();
+ application.Render();
+
+ // Emit another down event
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Completely delete the actor
+ actor = NULL;
+
+ // Emit event, should not crash and should not receive an event.
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2( 210.0f, 210.0f ) ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliTouchActorSignalNotConsumed(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to actor's touched signal
+ SignalData data;
+ TouchEventFunctor functor( data, false );
+ actor.TouchedSignal().Connect( &application, functor );
+
+ // Emit a down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliTouchActorUnStaged(void)
+{
+ TestApplication application;
+
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Connect to actor's touched signal
+ SignalData data;
+ TouchEventFunctor functor( data );
+ actor.TouchedSignal().Connect( &application, functor );
+
+ // Emit a down signal
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+
+ // Remove actor from stage
+ Stage::GetCurrent().Remove( actor );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Emit a move at the same point, we should not be signalled.
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Motion, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( false, data.functorCalled, TEST_LOCATION );
+ data.Reset();
+ END_TEST;
+}
+
+int UtcDaliTouchSystemOverlayActor(void)
+{
+ TestApplication application;
+ Dali::Integration::Core& core( application.GetCore() );
+ Dali::Integration::SystemOverlay& systemOverlay( core.GetSystemOverlay() );
+ systemOverlay.GetOverlayRenderTasks().CreateTask();
+
+ // Create an actor and add it to the system overlay.
+ Actor systemActor = Actor::New();
+ systemActor.SetSize(100.0f, 100.0f);
+ systemActor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ systemOverlay.Add( systemActor );
+
+ // Create an actor and add it to the stage as per normal, same position and size as systemActor
+ Actor actor = Actor::New();
+ actor.SetSize(100.0f, 100.0f);
+ actor.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+ Stage::GetCurrent().Add(actor);
+
+ // Connect to the touch signals.
+ SignalData data;
+ TouchEventFunctor functor( data );
+ systemActor.TouchedSignal().Connect( &application, functor );
+ actor.TouchedSignal().Connect( &application, functor );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Emit a down signal, the system overlay is drawn last so is at the top, should hit the systemActor.
+ application.ProcessEvent( GenerateSingleTouch( TouchPoint::Down, Vector2( 10.0f, 10.0f ) ) );
+ DALI_TEST_EQUALS( true, data.functorCalled, TEST_LOCATION );
+ DALI_TEST_CHECK( systemActor == data.touchedActor );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <sstream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_vector2_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_vector2_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+int UtcDaliVector2Cons(void)
+{
+ Vector3 v3(1.0f, 2.0f, 3.0f);
+ Vector2 va;
+ Vector2 vb(v3);
+ Vector2 vc(11.0f, 123.0f);
+
+ DALI_TEST_EQUALS(va.x, 0.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(va.y, 0.0f, 0.001f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(vb.width, 1.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vb.height, 2.0f, 0.001f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(vc.width, 11.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vc.y, 123.0f, 0.001f, TEST_LOCATION);
+
+ Vector4 vec4(5.0f,6.0f,7.0f,8.0f);
+ Vector2 vec2;
+ vec2 = vec4;
+ DALI_TEST_EQUALS(vec2.x, 5.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(vec2.y, 6.0f, 0.001, TEST_LOCATION);
+
+ Vector3 vec3(5.0f,6.0f,7.0f);
+ vec2 = vec3;
+ DALI_TEST_EQUALS(vec2.x, 5.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(vec2.y, 6.0f, 0.001, TEST_LOCATION);
+
+ Vector2 vec2b(vec4);
+ DALI_TEST_EQUALS(vec2.x, 5.0f, 0.001, TEST_LOCATION);
+ DALI_TEST_EQUALS(vec2.y, 6.0f, 0.001, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliVector2FitInside(void)
+{
+ DALI_TEST_EQUALS( Vector2( 1.0f, 2.0f ), FitInside( Vector2( 1.0f, 2.0f ), Vector2( 10.0f, 20.0f ) ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2( 1.0f, 0.5f ), FitInside( Vector2( 1.0f, 2.0f ), Vector2( 20.0f, 10.0f ) ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2( 10.0f, 20.0f ), FitInside( Vector2( 10.0f, 20.0f ), Vector2( 1.0f, 2.0f ) ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2( 10.0f, 10.0f ), FitInside( Vector2( 100.0f, 10.0f ), Vector2( 10.0f, 10.0f ) ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2( 20.0f, 10.0f ), FitInside( Vector2( 20.0f, 20.0f ), Vector2( 10.0f, 5.0f ) ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2( 10.0f, 20.0f ), FitInside( Vector2( 20.0f, 20.0f ), Vector2( 5.0f, 10.0f ) ), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliVector2FitScaleToFill(void)
+{
+ DALI_TEST_EQUALS( Vector2( 1.0f, 2.0f ), FitScaleToFill( Vector2( 1.0f, 2.0f ), Vector2( 10.0f, 20.0f ) ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2( 1.0f, 2.0f ), FitScaleToFill( Vector2( 10.0f, 20.0f ), Vector2( 1.0f, 2.0f ) ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2( 10.0f, 1.0f ), FitScaleToFill( Vector2( 100.0f, 10.0f ), Vector2( 10.0f, 10.0f ) ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2( 5.0f, 5.0f ), FitScaleToFill( Vector2( 20.0f, 20.0f ), Vector2( 10.0f, 5.0f ) ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2( 5.0f, 5.0f ), FitScaleToFill( Vector2( 20.0f, 20.0f ), Vector2( 5.0f, 10.0f ) ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2( 20.0f, 40.0f ), FitScaleToFill( Vector2( 20.0f, 0.0f ), Vector2( 5.0f, 10.0f ) ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2( 10.0f, 20.0f ), FitScaleToFill( Vector2( 0.0f, 20.0f ), Vector2( 5.0f, 10.0f ) ), TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliVector2ShrinkInside(void)
+{
+ DALI_TEST_EQUALS( Vector2( 1.0f, 2.0f ), ShrinkInside( Vector2( 1.0f, 2.0f ), Vector2( 10.0f, 20.0f ) ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2( 1.0f, 2.0f ), ShrinkInside( Vector2( 10.0f, 20.0f ), Vector2( 1.0f, 2.0f ) ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2( 10.0f, 10.0f ), ShrinkInside( Vector2( 100.0f, 10.0f ), Vector2( 10.0f, 10.0f ) ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2( 10.0f, 5.0f ), ShrinkInside( Vector2( 20.0f, 20.0f ), Vector2( 10.0f, 5.0f ) ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2( 5.0f, 10.0f ), ShrinkInside( Vector2( 20.0f, 20.0f ), Vector2( 5.0f, 10.0f ) ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2( 5.0f, 10.0f ), ShrinkInside( Vector2( 10.0f, 10.0f ), Vector2( 10.0f, 20.0f ) ), TEST_LOCATION );
+ DALI_TEST_EQUALS( Vector2( 10.0f, 5.0f ), ShrinkInside( Vector2( 10.0f, 10.0f ), Vector2( 20.0f, 10.0f ) ), TEST_LOCATION );
+ END_TEST;
+}
+
+
+
+
+int UtcDaliVector2Add(void)
+{
+ Vector2 v0(1.0f, 2.0f);
+ Vector2 v1(10.0f, 20.0f);
+ Vector2 r0(11.0f, 22.0f);
+
+ Vector2 v2 = v0+v1;
+ DALI_TEST_EQUALS(v2, r0, TEST_LOCATION);
+
+ v0 += v1;
+ DALI_TEST_EQUALS(v0, r0, TEST_LOCATION);
+ END_TEST;
+}
+
+
+// Subtract
+int UtcDaliVector2Subtract(void)
+{
+ Vector2 v0(11.0f, 22.0f);
+ Vector2 v1(10.0f, 20.0f);
+ Vector2 r0(1.0f, 2.0f);
+
+ Vector2 v2 = v0-v1;
+ DALI_TEST_EQUALS(v2, r0, TEST_LOCATION);
+
+ v0 -= v1;
+ DALI_TEST_EQUALS(v0, r0, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliVector2Negate(void)
+{
+ Vector2 v1(10.0f, 20.0f);
+ Vector2 r0(-10.0f, -20.0f);
+
+ Vector2 v2 = -v1;
+ DALI_TEST_EQUALS(v2, r0, TEST_LOCATION);
+ END_TEST;
+}
+
+
+// Multiply
+int UtcDaliVector2Multiply(void)
+{
+ Vector2 v0(2.0f, 3.0f);
+ Vector2 v1(10.0f, 20.0f);
+ Vector2 r0(20.0f, 60.0f);
+
+ Vector2 v2 = v0 * v1;
+ DALI_TEST_EQUALS(v2, r0, TEST_LOCATION);
+
+ v0 *= v1;
+ DALI_TEST_EQUALS(v0, r0, TEST_LOCATION);
+ END_TEST;
+}
+
+// Divide
+int UtcDaliVector2Divide(void)
+{
+ Vector2 v0(1.0f, 1.0f);
+ Vector2 v1(2.0f, 3.0f);
+ Vector2 v2(4.0f, 9.0f);
+
+ DALI_TEST_EQUALS( v0/v0, v0, TEST_LOCATION);
+ DALI_TEST_EQUALS( v1/v0, v1, TEST_LOCATION);
+ DALI_TEST_EQUALS( v1/v1, v0, TEST_LOCATION);
+ DALI_TEST_EQUALS( v2/v1, v1, TEST_LOCATION);
+
+ Vector2 v4(v0);
+ v4 /= v0;
+ DALI_TEST_EQUALS(v4, v0, TEST_LOCATION);
+
+ Vector2 v5(v1);
+ v5 /= v0;
+ DALI_TEST_EQUALS(v5, v1, TEST_LOCATION);
+
+ Vector2 v6(v1);
+ v6 /= v6;
+ DALI_TEST_EQUALS(v6, v0, TEST_LOCATION);
+
+ v2 /= v1;
+ DALI_TEST_EQUALS(v2, v1, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliVector2Scale(void)
+{
+ Vector2 v0(2.0f, 4.0f);
+ const Vector2 r0(20.0f, 40.0f);
+ const Vector2 r1(10.0f, 20.0f);
+ const Vector2 r2( 1.0f, 2.0f);
+ const Vector2 r3(2.0f, 4.0f);
+
+ Vector2 v2 = v0 * 10.0f;
+ DALI_TEST_EQUALS(v2, r0, TEST_LOCATION);
+
+ v0 *= 5.0f;
+ DALI_TEST_EQUALS(v0, r1, TEST_LOCATION);
+
+ v2 = r0 / 10.0f;
+ DALI_TEST_EQUALS(v2, r3, TEST_LOCATION);
+
+ v2 = r1;
+ v2 /= 10.0f;
+ DALI_TEST_EQUALS(v2, r2, TEST_LOCATION);
+ END_TEST;
+}
+
+// Equals
+int UtcDaliVector2Equals(void)
+{
+ Vector2 v0(1.0f, 2.0f);
+ Vector2 v1(1.0f, 2.0f);
+
+ DALI_TEST_CHECK(v0 == v1);
+
+ Vector2 v2 = Vector2(0.0f, 2.0f);
+ DALI_TEST_CHECK(v0 != v2);
+
+ v2 = Vector2(1.0f, 0.0f);
+ DALI_TEST_CHECK(v0 != v2);
+
+ v2 = Vector2(1.0f, 77.0f);
+ DALI_TEST_CHECK(v0 != v2);
+
+ v2 = Vector2(33.0f, 44.0f);
+ DALI_TEST_CHECK(v0 != v2);
+ END_TEST;
+}
+
+// Length
+int UtcDaliVector2Length(void)
+{
+ Vector2 v(1.0f, 2.0f);
+ DALI_TEST_EQUALS(v.Length(), sqrtf(v.x*v.x + v.y*v.y), 0.001f, TEST_LOCATION);
+
+ Vector2 v1(0.0f, 0.0f);
+ DALI_TEST_EQUALS(v1.Length(), 0.0f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Length squared
+int UtcDaliVector2LengthSquared(void)
+{
+ Vector2 v(1.0f, 2.0f);
+ DALI_TEST_EQUALS(v.LengthSquared(), v.x*v.x + v.y*v.y, 0.001f, TEST_LOCATION);
+
+ Vector2 v1(0.0f, 0.0f);
+ DALI_TEST_EQUALS(v1.LengthSquared(), 0.0f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Max
+int UtcDaliVector2Max(void)
+{
+ Vector2 v0(2.0f, 1.0f);
+ Vector2 v1(1.0f, 2.0f);
+
+ DALI_TEST_EQUALS(Max(v0, v1), Vector2(2.0f, 2.0f), 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Min
+int UtcDaliVector2Min(void)
+{
+ Vector2 v0(2.0f, 1.0f);
+ Vector2 v1(1.0f, 2.0f);
+
+ DALI_TEST_EQUALS(Min(v0, v1), Vector2(1.0f, 1.0f), 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliVector2Clamp(void)
+{
+ tet_infoline("Testing Dali::Vector2::Clamp( const Vector2& v, const float& min, const float& max )");
+
+ Vector2 v0(2.0f, 0.8f);
+ Vector2 v1(-1.0f, 2.0f);
+
+ DALI_TEST_EQUALS( Clamp( v0, 0.9f, 1.1f ), Vector2(1.1f, 0.9f), 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( Clamp( v1, 1.0f, 1.0f ), Vector2(1.0f, 1.0f), 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( Clamp( v1, 0.0f, 3.0f ), Vector2(0.0f, 2.0f), 0.01f, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliVector2ClampVector2(void)
+{
+ tet_infoline("Testing Dali::Vector2::Clamp( const Vector2& v, const Vector2& min, const Vector2& max )");
+
+ Vector2 v0(2.0f, 0.8f);
+ Vector2 v1(-1.0f, 2.0f);
+ Vector2 v2(10.0f, 5.0f);
+ Vector2 v3(8.0f, 10.0f);
+ Vector2 v4(4.9f, 5.1f);
+ Vector2 min(1.0f, 4.0f);
+ Vector2 max(9.0f, 6.0f);
+
+ v0.Clamp( min, max );
+ v1.Clamp( min, max );
+ v2.Clamp( min, max );
+ v3.Clamp( min, max );
+ v4.Clamp( min, max );
+
+ DALI_TEST_EQUALS( v0, Vector2(2.0f, 4.0f), 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( v1, Vector2(1.0f, 4.0f), 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( v2, Vector2(9.0f, 5.0f), 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( v3, Vector2(8.0f, 6.0f), 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( v4, Vector2(4.9f, 5.1f), 0.01f, TEST_LOCATION );
+ END_TEST;
+}
+
+// Normalize
+int UtcDaliVector2Normalize(void)
+{
+ for (float f=0.0f; f<6.0f; f+=1.0f)
+ {
+ Vector2 v(cosf(f)*10.0f, cosf(f+1.0f)*10.0f);
+ v.Normalize();
+ DALI_TEST_EQUALS(v.LengthSquared(), 1.0f, 0.001f, TEST_LOCATION);
+ }
+
+ Vector4 v(0.0f, 0.0f, 0.0f, 1.0f);
+ v.Normalize();
+ DALI_TEST_EQUALS(v.LengthSquared(), 0.0f, 0.00001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliVector2OperatorSubscript(void)
+{
+ tet_infoline("Testing Dali::Vector2::operator[]()");
+
+ Vector2 testVector(1.0f, 2.0f);
+
+ // read array subscripts
+ DALI_TEST_EQUALS( testVector[0], 1.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testVector[1], 2.0f, TEST_LOCATION );
+
+ // write array subscripts/read struct memebers
+ testVector[0] = 3.0f;
+ testVector[1] = 4.0f;
+
+ DALI_TEST_EQUALS( testVector.x, 3.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testVector.y, 4.0f, TEST_LOCATION );
+
+ // write struct members/read array subscripts
+ testVector.x = 5.0f;
+ testVector.y = 6.0f;
+
+ const Vector2 testVector2(3.0f, 4.0f);
+ const float& x = testVector2[0];
+ const float& y = testVector2[1];
+ DALI_TEST_EQUALS( x, 3.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( y, 4.0f, TEST_LOCATION );
+
+
+ try
+ {
+ float& w = testVector[4];
+ if(w==0.0f);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, "index < 2", TEST_LOCATION);
+ }
+
+ try
+ {
+ const float& w = testVector2[4];
+ if(w==0.0f);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, "index < 2" , TEST_LOCATION);
+ }
+
+
+ END_TEST;
+}
+
+int UtcDaliVector2OStreamOperator(void)
+{
+ std::ostringstream oss;
+
+ Vector2 vector(1, 2);
+
+ oss << vector;
+
+ std::string expectedOutput = "[1, 2]";
+
+ DALI_TEST_EQUALS( oss.str(), expectedOutput, TEST_LOCATION);
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <sstream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_vector3_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_vector3_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+int UtcDaliVector3Cons(void)
+{
+ Vector3 va;
+ Vector3 vb(Vector2(1.0f, 2.0f));
+ Vector3 vc(Vector4(5.63f, 2.31f, 9.83f, 11.23f));
+ float array[] = {1.0f, 2.0f, 3.0f};
+ Vector3 vd(array);
+
+ DALI_TEST_EQUALS(va.x, 0.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(va.y, 0.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(va.z, 0.0f, 0.001f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(vb.x, 1.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vb.y, 2.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vb.z, 0.0f, 0.001f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(vc.x, 5.63f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vc.y, 2.31f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vc.z, 9.83f, 0.001f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(vd.x, 1.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vd.y, 2.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vd.z, 3.0f, 0.001f, TEST_LOCATION);
+
+ Vector3* vecPtr = new Vector3(1.0f, 2.0f, 3.0f);
+ DALI_TEST_CHECK( vecPtr != NULL );
+ DALI_TEST_EQUALS(vecPtr->x, 1.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vecPtr->y, 2.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vecPtr->z, 3.0f, 0.001f, TEST_LOCATION);
+
+ Vector3 vec3;
+ vec3 = *vecPtr;
+ delete vecPtr;
+
+ Vector3 vec3b(vd);
+ DALI_TEST_EQUALS(vec3b.x, 1.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vec3b.y, 2.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vec3b.z, 3.0f, 0.001f, TEST_LOCATION);
+
+ Vector3 vec3c = vd;
+ DALI_TEST_EQUALS(vec3c.x, 1.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vec3c.y, 2.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vec3c.z, 3.0f, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliVector3Assign(void)
+{
+ Vector3 v0;
+ const float array[] = { 1.0f, 2.0f, 3.0f };
+ v0 = (const float*)array;
+
+ DALI_TEST_EQUALS(v0.x, 1.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(v0.y, 2.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(v0.z, 3.0f, 0.001f, TEST_LOCATION);
+
+ Vector2 vec2_q(1.0f, 2.0f);
+ Vector3 vec3a;
+ vec3a = vec2_q;
+
+ DALI_TEST_EQUALS(vec3a.x, 1.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vec3a.y, 2.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vec3a.z, 0.0f, 0.001f, TEST_LOCATION);
+
+ Vector4 vec4_q(4.0f, 3.0f, 2.0f, 1.0f);
+ Vector3 vec3b;
+ vec3b = vec4_q;
+
+ DALI_TEST_EQUALS(vec3b.x, 4.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vec3b.y, 3.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vec3b.z, 2.0f, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+// Add
+int UtcDaliVector3Add(void)
+{
+ Vector3 v0(1.0f, 2.0f, 3.0f);
+ Vector3 v1(10.0f, 20.0f, 30.0f);
+ Vector3 r0(11.0f, 22.0f, 33.0f);
+
+ Vector3 v2 = v0+v1;
+ DALI_TEST_EQUALS(v2, r0, TEST_LOCATION);
+
+ v0 += v1;
+ DALI_TEST_EQUALS(v0, r0, TEST_LOCATION);
+ END_TEST;
+}
+
+// Constants
+int UtcDaliVector3Constants(void)
+{
+ Vector3 va = Vector3::ZERO;
+ Vector3 vb = Vector3::ONE;
+ Vector3 vc = Vector3::XAXIS;
+
+ DALI_TEST_EQUALS(va.x, 0.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(va.y, 0.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(va.z, 0.0f, 0.001f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(vb.x, 1.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vb.y, 1.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vb.z, 1.0f, 0.001f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(vc.x, 1.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vc.y, 0.0f, 0.001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(vc.z, 0.0f, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Cross
+int UtcDaliVector3Cross(void)
+{
+ DALI_TEST_EQUALS(Vector3::XAXIS.Cross(Vector3::YAXIS), Vector3::ZAXIS, 0.0001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector3::YAXIS.Cross(Vector3::ZAXIS), Vector3::XAXIS, 0.0001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector3::ZAXIS.Cross(Vector3::XAXIS), Vector3::YAXIS, 0.0001f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(Vector3::XAXIS.Cross(Vector3::ZAXIS), -Vector3::YAXIS, 0.0001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector3::YAXIS.Cross(Vector3::XAXIS), -Vector3::ZAXIS, 0.0001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector3::ZAXIS.Cross(Vector3::YAXIS), -Vector3::XAXIS, 0.0001f, TEST_LOCATION);
+
+ Vector3 v0(2.0f, 3.0f, 4.0f);
+ Vector3 v1(10.0f, 20.0f, 30.0f);
+ Vector3 result( (v0.y * v1.z) - (v0.z * v1.y),
+ (v0.z * v1.x) - (v0.x * v1.z),
+ (v0.x * v1.y) - (v0.y * v1.x) );
+
+
+ DALI_TEST_EQUALS(v0.Cross(v1), result, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Dot
+int UtcDaliVector3Dot(void)
+{
+ DALI_TEST_EQUALS(Vector3::XAXIS.Dot(Vector3::YAXIS), 0.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector3::XAXIS.Dot(Vector3::ZAXIS), 0.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector3::XAXIS.Dot(Vector3::XAXIS), 1.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector3::YAXIS.Dot(Vector3::YAXIS), 1.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector3::ZAXIS.Dot(Vector3::ZAXIS), 1.0f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(Vector3(1.0f, 0.0f, 0.0f).Dot(Vector3(1.0f, 0.0f, 0.0f)), 1.0f, TEST_LOCATION);
+
+ for (float x = 0; x<6.0f; x+=1.0f)
+ {
+ Vector3 v0(cosf(x), sinf(x), 0.0f);
+ Vector3 v1(sinf(x), -cosf(x), 0.0f);
+ DALI_TEST_EQUALS(v0.Dot(v1), 0.0f, 0.0001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(v0.Dot(v0), 1.0f, 0.0001f, TEST_LOCATION);
+
+ v0 = Vector3(cosf(x), 0.0f, sinf(x));
+ v1 = Vector3(sinf(x), 0.0f, -cosf(x));
+ DALI_TEST_EQUALS(v0.Dot(v0), 1.0f, 0.0001f, TEST_LOCATION);
+ }
+
+ Vector3 v0 = Vector3(12.0f, 7.0f, 9.0f);
+ v0.Normalize();
+
+ Vector3 v1 = v0 * 2.0f;
+ DALI_TEST_EQUALS(v0.Dot(v1), 2.0f, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+
+// Equals
+int UtcDaliVector3Equals(void)
+{
+ Vector3 v0(1.0f, 2.0f, 3.0f);
+ Vector3 v1(1.0f, 2.0f, 3.0f);
+
+ DALI_TEST_CHECK(v0 == v1);
+
+ Vector3 v2 = Vector3(0.0f, 2.0f, 3.0f);
+ DALI_TEST_CHECK(v0 != v2);
+
+ v2 = Vector3(1.0f, 0.0f, 3.0f);
+ DALI_TEST_CHECK(v0 != v2);
+
+ v2 = Vector3(1.0f, 2.0f, 0.0f);
+ DALI_TEST_CHECK(v0 != v2);
+
+ v2 = Vector3(11.0f, 22.0f, 33.0f);
+ DALI_TEST_CHECK(v0 != v2);
+ END_TEST;
+}
+
+
+// Length
+int UtcDaliVector3Length(void)
+{
+ Vector3 v(1.0f, 2.0f, 3.0f);
+ DALI_TEST_EQUALS(v.Length(), sqrtf(v.x*v.x + v.y*v.y + v.z*v.z), 0.001f, TEST_LOCATION);
+
+ Vector3 v1(0.0f, 0.0f, 0.0f);
+ DALI_TEST_EQUALS(v1.Length(), 0.0f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Length squared
+int UtcDaliVector3LengthSquared(void)
+{
+ Vector3 v(1.0f, 2.0f, 3.0f);
+ DALI_TEST_EQUALS(v.LengthSquared(), v.x*v.x + v.y*v.y + v.z*v.z, 0.001f, TEST_LOCATION);
+
+ Vector3 v1(0.0f, 0.0f, 0.0f);
+ DALI_TEST_EQUALS(v1.LengthSquared(), 0.0f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Max
+int UtcDaliVector3Max(void)
+{
+ Vector3 v0(2.0f, 1.0f, 3.0f);
+ Vector3 v1(1.0f, 2.0f, 3.0f);
+
+ DALI_TEST_EQUALS(Max(v0, v1), Vector3(2.0f, 2.0f, 3.0f), 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Min
+int UtcDaliVector3Min(void)
+{
+ Vector3 v0(2.0f, 2.0f, 1.0f);
+ Vector3 v1(1.0f, 1.0f, 2.0f);
+
+ DALI_TEST_EQUALS(Min(v0, v1), Vector3(1.0f, 1.0f, 1.0f), 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliVector3Clamp(void)
+{
+ tet_infoline("Testing Dali::Vector3::Clamp()");
+
+ Vector3 v0( 2.0f, 1.0f, 0.0f );
+ Vector3 v1( -1.0f, 2.0f, 1.0f );
+
+ DALI_TEST_EQUALS( Clamp( v0, 0.9f, 1.1f ), Vector3(1.1f, 1.0f, 0.9f), 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( Clamp( v1, 1.0f, 1.0f ), Vector3(1.0f, 1.0f, 1.0f), 0.01f, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliVector3ClampVector3(void)
+{
+ tet_infoline("Testing Dali::Vector3::Clamp( const Vector3& v, const Vector3& min, const Vector3& max )");
+
+ Vector3 v0(2.0f, 0.8f, 0.0f);
+ Vector3 v1(-1.0f, 2.0f, 10.0f);
+ Vector3 v2(10.0f, 5.0f, 0.0f);
+ Vector3 v3(8.0f, 10.0f, 5.0f);
+ Vector3 v4(4.9f, 5.1f, 10.0f);
+ Vector3 min(1.0f, 4.0f, 1.5f);
+ Vector3 max(9.0f, 6.0f, 8.0f);
+
+ v0.Clamp( min, max );
+ v1.Clamp( min, max );
+ v2.Clamp( min, max );
+ v3.Clamp( min, max );
+ v4.Clamp( min, max );
+
+ DALI_TEST_EQUALS( v0, Vector3(2.0f, 4.0f, 1.5f), 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( v1, Vector3(1.0f, 4.0f, 8.0f), 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( v2, Vector3(9.0f, 5.0f, 1.5f), 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( v3, Vector3(8.0f, 6.0f, 5.0f), 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( v4, Vector3(4.9f, 5.1f, 8.0f), 0.01f, TEST_LOCATION );
+ END_TEST;
+}
+
+// Multiply
+int UtcDaliVector3Multiply(void)
+{
+ Vector3 v0(2.0f, 3.0f, 4.0f);
+ Vector3 v1(10.0f, 20.0f, 30.0f);
+ Vector3 r0(20.0f, 60.0f, 120.0f);
+
+ Vector3 v2 = v0 * v1;
+ DALI_TEST_EQUALS(v2, r0, TEST_LOCATION);
+
+ v0 *= v1;
+ DALI_TEST_EQUALS(v0, r0, TEST_LOCATION);
+ END_TEST;
+}
+
+
+// Divide
+int UtcDaliVector3Divide(void)
+{
+ Vector3 v0(1.0f, 1.0f, 1.0f);
+ Vector3 v1(2.0f, 3.0f, 5.0f);
+ Vector3 v2(4.0f, 9.0f, 25.0f);
+
+ DALI_TEST_EQUALS( v0/v0, v0, TEST_LOCATION);
+ DALI_TEST_EQUALS( v1/v0, v1, TEST_LOCATION);
+ DALI_TEST_EQUALS( v1/v1, v0, TEST_LOCATION);
+ DALI_TEST_EQUALS( v2/v1, v1, TEST_LOCATION);
+
+ Vector3 v4(v0);
+ v4 /= v0;
+ DALI_TEST_EQUALS(v4, v0, TEST_LOCATION);
+
+ Vector3 v5(v1);
+ v5 /= v0;
+ DALI_TEST_EQUALS(v5, v1, TEST_LOCATION);
+
+ Vector3 v6(v1);
+ v6 /= v6;
+ DALI_TEST_EQUALS(v6, v0, TEST_LOCATION);
+
+ v2 /= v1;
+ DALI_TEST_EQUALS(v2, v1, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliVector3Scale(void)
+{
+ Vector3 v0(2.0f, 4.0f, 8.0f);
+ const Vector3 r0(20.0f, 40.0f, 80.0f);
+ const Vector3 r1(10.0f, 20.0f, 40.0f);
+ const Vector3 r2( 1.0f, 2.0f, 4.0f);
+ const Vector3 r3(2.0f, 4.0f, 8.0f);
+
+ Vector3 v2 = v0 * 10.0f;
+ DALI_TEST_EQUALS(v2, r0, TEST_LOCATION);
+
+ v0 *= 5.0f;
+ DALI_TEST_EQUALS(v0, r1, TEST_LOCATION);
+
+ v2 = r0 / 10.0f;
+ DALI_TEST_EQUALS(v2, r3, TEST_LOCATION);
+
+ v2 = r1;
+ v2 /= 10.0f;
+ DALI_TEST_EQUALS(v2, r2, TEST_LOCATION);
+ END_TEST;
+}
+
+
+
+// Normalize
+int UtcDaliVector3Normalize(void)
+{
+ for (float f=0.0f; f<6.0f; f+=1.0f)
+ {
+ Vector3 v(cosf(f)*10.0f, cosf(f+1.0f)*10.0f, cosf(f+2.0f)*10.0f);
+ v.Normalize();
+ DALI_TEST_EQUALS(v.LengthSquared(), 1.0f, 0.001f, TEST_LOCATION);
+ }
+
+ Vector3 v(0.0f, 0.0f, 0.0f);
+ v.Normalize();
+ DALI_TEST_EQUALS(v.LengthSquared(), 0.0f, 0.00001f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Subtract
+int UtcDaliVector3Subtract(void)
+{
+ Vector3 v0(11.0f, 22.0f, 33.0f);
+ Vector3 v1(10.0f, 20.0f, 30.0f);
+ Vector3 r0(1.0f, 2.0f, 3.0f);
+
+ Vector3 v2 = v0-v1;
+ DALI_TEST_EQUALS(v2, r0, TEST_LOCATION);
+
+ v0 -= v1;
+ DALI_TEST_EQUALS(v0, r0, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliVector3OperatorSubscript(void)
+{
+ Vector3 testVector(1.0f, 2.0f, 3.0f);
+
+ // read array subscripts
+ DALI_TEST_EQUALS( testVector[0], 1.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testVector[1], 2.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testVector[2], 3.0f, TEST_LOCATION );
+
+ // write array subscripts/read struct memebers
+ testVector[0] = 4.0f;
+ testVector[1] = 5.0f;
+ testVector[2] = 6.0f;
+
+ DALI_TEST_EQUALS( testVector.x, 4.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testVector.y, 5.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testVector.z, 6.0f, TEST_LOCATION );
+
+ // write struct members/read array subscripts
+ testVector.x = 7.0f;
+ testVector.y = 8.0f;
+ testVector.z = 9.0f;
+
+ DALI_TEST_EQUALS( testVector[0], 7.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testVector[1], 8.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testVector[2], 9.0f, TEST_LOCATION );
+
+ // write struct members/read array subscripts
+ const Vector3 testVector2(1.0f, 2.0f, 3.0f);
+ const float& x = testVector2[0];
+ const float& y = testVector2[1];
+ const float& z ( testVector2[2] );
+
+ DALI_TEST_EQUALS( x, 1.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( y, 2.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( z, 3.0f, TEST_LOCATION );
+
+ try
+ {
+ float& w = testVector[4];
+ if(w==0.0f);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, "index < 3", TEST_LOCATION );
+ }
+
+ try
+ {
+ const float& w = testVector2[4];
+ if(w==0.0f);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT(e, "index < 3", TEST_LOCATION);
+ }
+
+ END_TEST;
+}
+
+int UtcDaliVector3OStreamOperator(void)
+{
+ std::ostringstream oss;
+
+ Vector3 vector(1, 2, 3);
+
+ oss << vector;
+
+ std::string expectedOutput = "[1, 2, 3]";
+
+ DALI_TEST_EQUALS( oss.str(), expectedOutput, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliVector3Rotate(void)
+{
+ TestApplication application;
+
+ Vector3 vec3(Vector3::YAXIS);
+ Quaternion rotation(Math::PI_2, Vector3::ZAXIS);
+ Vector3 result(-Vector3::XAXIS);
+ vec3 *= rotation;
+ DALI_TEST_EQUALS( vec3, result, 0.001, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliVector3AsFloat(void)
+{
+ float values[] = {0.0f, 1.0f, 2.0f};
+ Vector3 v0(values);
+
+ for (int i=0;i<3;++i)
+ {
+ DALI_TEST_EQUALS(v0.AsFloat()[i], values[i], TEST_LOCATION);
+ }
+
+ const Vector3 v1(values);
+ for (int i=0;i<3;++i)
+ {
+ DALI_TEST_EQUALS(v1.AsFloat()[i], values[i], TEST_LOCATION);
+ }
+ END_TEST;
+}
+
+int UtcDaliVector3AsVectorXY(void)
+{
+ float values[] = {0.0f, 1.0f, 2.0f};
+ Vector3 v0(values);
+ const Vector3 v1(5.0f, 10.0f, 15.0f);
+ // X = 0.0
+ // Y = 1.0
+ // Z = 2.0
+
+ DALI_TEST_EQUALS(v0.GetVectorXY().x, values[0], TEST_LOCATION);
+ DALI_TEST_EQUALS(v0.GetVectorXY().y, values[1], TEST_LOCATION);
+
+ v0.GetVectorXY() = v1.GetVectorYZ();
+ // X = y
+ // Y = z
+ // Z = 2.0
+ DALI_TEST_EQUALS(v0.GetVectorXY().x, v1.y, TEST_LOCATION);
+ DALI_TEST_EQUALS(v0.GetVectorXY().y, v1.z, TEST_LOCATION);
+ DALI_TEST_EQUALS(v0.z, values[2], TEST_LOCATION);
+
+ v0.GetVectorYZ() = v1.GetVectorXY();
+ // X = y
+ // Y = x
+ // Z = y
+ DALI_TEST_EQUALS(v0.x, v1.y, TEST_LOCATION);
+ DALI_TEST_EQUALS(v0.y, v1.x, TEST_LOCATION);
+ DALI_TEST_EQUALS(v0.z, v1.y, TEST_LOCATION);
+ END_TEST;
+}
+
+
+int UtcDaliVector3FitKeepAspectRatio(void)
+{
+ TestApplication application;
+ Vector3 target(10.0f, 20.0f, 30.0f);
+ Vector3 source1(1.0f, 2.0f, 3.0f);
+ Vector3 source2(1.0f, 1.0f, 1.0f);
+
+ DALI_TEST_EQUALS( FitKeepAspectRatio( target, target ), Vector3(1.0f, 1.0f, 1.0f), 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( FitKeepAspectRatio( target, source1 ), Vector3(10.0f, 10.0f, 10.0f), 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( FitKeepAspectRatio( target, source2 ), Vector3(10.0f, 10.0f, 10.0f), 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( FitKeepAspectRatio( source2, target ), Vector3(0.0333f, 0.0333f, 0.0333f), 0.001, TEST_LOCATION );
+ END_TEST;
+}
+
+int UtcDaliVector3FillKeepAspectRatio(void)
+{
+ TestApplication application;
+ Vector3 target(10.0f, 20.0f, 30.0f);
+ Vector3 source1(1.0f, 2.0f, 3.0f);
+ Vector3 source2(1.0f, 1.0f, 1.0f);
+
+ DALI_TEST_EQUALS( FillKeepAspectRatio( target, target ), Vector3(1.0f, 1.0f, 1.0f), 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( FillKeepAspectRatio( target, source1 ), Vector3(10.0f, 10.0f, 10.0f), 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( FillKeepAspectRatio( target, source2 ), Vector3(30.0f, 30.0f, 30.0f), 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( FillKeepAspectRatio( source2, target ), Vector3(0.1f, 0.1f, 0.1f), 0.001, TEST_LOCATION );
+
+ END_TEST;
+}
+
+int UtcDaliVector3FillXYKeepAspectRatio(void)
+{
+ TestApplication application;
+ Vector3 target(10.0f, 20.0f, 30.0f);
+ Vector3 source1(1.0f, 2.0f, 3.0f);
+ Vector3 source2(1.0f, 1.0f, 1.0f);
+
+ DALI_TEST_EQUALS( FillXYKeepAspectRatio( target, target ), Vector3(1.0f, 1.0f, 1.0f), 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( FillXYKeepAspectRatio( target, source1 ), Vector3(10.0f, 10.0f, 10.0f), 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( FillXYKeepAspectRatio( target, source2 ), Vector3(20.0f, 20.0f, 20.0f), 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( FillXYKeepAspectRatio( source2, target ), Vector3(0.1f, 0.1f, 0.1f), 0.001, TEST_LOCATION );
+
+ END_TEST;
+}
+
+int UtcDaliVector3ShrinkInsideKeepAspectRatio(void)
+{
+ TestApplication application;
+ Vector3 target(1.0f, 2.0f, 3.0f);
+ Vector3 source1(10.0f, 20.0f, 30.0f);
+ Vector3 source2(10.0f, 10.0f, 10.0f);
+
+ DALI_TEST_EQUALS( ShrinkInsideKeepAspectRatio( target, target ), Vector3(1.0f, 1.0f, 1.0f), 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( ShrinkInsideKeepAspectRatio( target, source1 ), Vector3(0.1f, 0.1f, 0.1f), 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( ShrinkInsideKeepAspectRatio( target, source2 ), Vector3(0.1f, 0.1f, 0.1f), 0.001, TEST_LOCATION );
+ DALI_TEST_EQUALS( ShrinkInsideKeepAspectRatio( source2, target ), Vector3::ONE, 0.001, TEST_LOCATION );
+ END_TEST;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Flora License, Version 1.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://floralicense.org/license/
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an AS IS BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <iostream>
+#include <sstream>
+
+#include <stdlib.h>
+#include <dali/dali.h>
+#include <dali-test-suite-utils.h>
+
+using namespace Dali;
+
+void utc_dali_vector4_startup(void)
+{
+ test_return_value = TET_UNDEF;
+}
+
+void utc_dali_vector4_cleanup(void)
+{
+ test_return_value = TET_PASS;
+}
+
+
+
+// Constructor
+int UtcDaliVector4Vector4(void)
+{
+ float f[] = {2.0f, 3.0f, 4.0f, 5.0f};
+ Vector2 vec2(1.0f, 2.0f);
+ Vector3 vec3(1.0f, 2.0f, 3.0f);
+ Vector4 v0(f);
+ Vector4 v1(f[0], f[1], f[2], f[3]);
+ Vector4 v2(v0);
+ Vector4 v3;
+ v3 = (const float*) f;
+ Vector4 v4(vec2);
+ Vector4 v5(vec3);
+
+ DALI_TEST_EQUALS(v0, v1, TEST_LOCATION);
+ DALI_TEST_EQUALS(v0, v2, TEST_LOCATION);
+ DALI_TEST_EQUALS(v3, v0, TEST_LOCATION);
+ DALI_TEST_EQUALS(v4, Vector4(1.0f, 2.0f, 0.0f, 0.0f), TEST_LOCATION);
+ DALI_TEST_EQUALS(v5, Vector4(1.0f, 2.0f, 3.0f, 0.0f), TEST_LOCATION);
+ DALI_TEST_CHECK(v0 == v1);
+
+ v1 = vec2;
+ v2 = vec3;
+ DALI_TEST_EQUALS(v1.x, 1.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(v1.y, 2.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(v2.x, 1.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(v2.y, 2.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(v2.z, 3.0f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Add
+int UtcDaliVector4Add(void)
+{
+ Vector4 v0(1.0f, 2.0f, 3.0f, 4.0f);
+ Vector4 v1(10.0f, 20.0f, 30.0f, 40.0f);
+ Vector4 r0(11.0f, 22.0f, 33.0f, 44.0f);
+
+ Vector4 v2 = v0+v1;
+ DALI_TEST_EQUALS(v2, r0, TEST_LOCATION);
+
+ v0 += v1;
+ DALI_TEST_EQUALS(v0, r0, TEST_LOCATION);
+ END_TEST;
+}
+
+// Constants
+int UtcDaliVector4Constants(void)
+{
+ float f[] = {2.0f, 3.0f, 4.0f, 5.0f};
+ Vector4 v0(f);
+ Vector4 v1(f[0], f[1], f[2], f[3]);
+ Vector4 v2(v0);
+
+ DALI_TEST_EQUALS(v0, v1, TEST_LOCATION);
+ DALI_TEST_EQUALS(v0, v2, TEST_LOCATION);
+ DALI_TEST_CHECK(v0 == v1);
+ END_TEST;
+}
+
+// Cross
+int UtcDaliVector4Cross(void)
+{
+ DALI_TEST_EQUALS(Vector4::XAXIS.Cross(Vector4::YAXIS), Vector4::ZAXIS, 0.0001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector4::YAXIS.Cross(Vector4::ZAXIS), Vector4::XAXIS, 0.0001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector4::ZAXIS.Cross(Vector4::XAXIS), Vector4::YAXIS, 0.0001f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(Vector4::XAXIS.Cross(Vector4::ZAXIS), -Vector4::YAXIS, 0.0001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector4::YAXIS.Cross(Vector4::XAXIS), -Vector4::ZAXIS, 0.0001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector4::ZAXIS.Cross(Vector4::YAXIS), -Vector4::XAXIS, 0.0001f, TEST_LOCATION);
+
+ Vector4 v0(2.0f, 3.0f, 4.0f, 5.0f);
+ Vector4 v1(10.0f, 20.0f, 30.0f, 40.0f);
+ Vector4 result( (v0.y * v1.z) - (v0.z * v1.y),
+ (v0.z * v1.x) - (v0.x * v1.z),
+ (v0.x * v1.y) - (v0.y * v1.x),
+ 0.0f);
+
+ DALI_TEST_EQUALS(v0.Cross(v1), result, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Dot
+int UtcDaliVector4Dot(void)
+{
+ DALI_TEST_EQUALS(Vector4::XAXIS.Dot(Vector4::YAXIS), 0.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector4::XAXIS.Dot(Vector4::ZAXIS), 0.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector4::XAXIS.Dot(Vector4::XAXIS), 1.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector4::YAXIS.Dot(Vector4::YAXIS), 1.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector4::ZAXIS.Dot(Vector4::ZAXIS), 1.0f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(Vector4(1.0f, 0.0f, 0.0f, 1.0f).Dot(Vector4(1.0f, 0.0f, 0.0f, 1.0f)), 1.0f, TEST_LOCATION);
+
+ // Test v0 . v0 and v0 . v1 (v1 is always 90 degrees out of phase with v0)
+ for (float x = 0; x<6.0f; x+=1.0f)
+ {
+ // vectors rotating in the XY plane.
+ Vector4 v0(cosf(x), sinf(x), 0.0f, 1.0f);
+ Vector4 v1(sinf(x), -cosf(x), 0.0f, 1.0f);
+ DALI_TEST_EQUALS(v0.Dot(v1), 0.0f, 0.0001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(v0.Dot(v0), 1.0f, 0.0001f, TEST_LOCATION);
+
+ // vectors rotating in the XZ plane.
+ v0 = Vector4(cosf(x), 0.0f, sinf(x), 0.0f);
+ v1 = Vector4(sinf(x), 0.0f, -cosf(x), 0.0f);
+ DALI_TEST_EQUALS(v0.Dot(v1), 0.0f, 0.0001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(v0.Dot(v0), 1.0f, 0.0001f, TEST_LOCATION);
+ }
+
+ Vector4 v0 = Vector4(12.0f, 7.0f, 9.0f, 14.0f);
+ v0.Normalize();
+
+ Vector4 v1 = v0 * 2.0f;
+ DALI_TEST_EQUALS(v0.Dot(v1), 2.0f, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Dot (with vector3)
+int UtcDaliVector4DotVector3(void)
+{
+ DALI_TEST_EQUALS(Vector4::XAXIS.Dot(Vector3::YAXIS), 0.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector4::XAXIS.Dot(Vector3::ZAXIS), 0.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector4::XAXIS.Dot(Vector3::XAXIS), 1.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector4::YAXIS.Dot(Vector3::YAXIS), 1.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector4::ZAXIS.Dot(Vector3::ZAXIS), 1.0f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(Vector4(1.0f, 0.0f, 0.0f, 1.0f).Dot(Vector3(1.0f, 0.0f, 0.0f)), 1.0f, TEST_LOCATION);
+
+ // Test v0 . v0b and v0 . v1 (v1 is always 90 degrees out of phase with v0)
+ for (float x = 0; x<6.0f; x+=1.0f)
+ {
+ // vectors rotating in the XY plane.
+ Vector4 v0(cosf(x), sinf(x), 0.0f, 1.0f);
+ Vector3 v0b(cosf(x), sinf(x), 0.0f);
+ Vector3 v1(sinf(x), -cosf(x), 0.0f);
+ DALI_TEST_EQUALS(v0.Dot(v1), 0.0f, 0.0001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(v0.Dot(v0b), 1.0f, 0.0001f, TEST_LOCATION);
+
+ // vectors rotating in the XZ plane.
+ v0 = Vector4(cosf(x), 0.0f, sinf(x), 0.0f);
+ v0b = Vector3(cosf(x), 0.0f, sinf(x));
+ v1 = Vector3(sinf(x), 0.0f, -cosf(x));
+ DALI_TEST_EQUALS(v0.Dot(v1), 0.0f, 0.0001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(v0.Dot(v0b), 1.0f, 0.0001f, TEST_LOCATION);
+ }
+
+ Vector4 v0 = Vector4(12.0f, 7.0f, 9.0f, 14.0f);
+ v0.Normalize();
+
+ Vector3 v1(v0 * 2.0f);
+ DALI_TEST_EQUALS(v0.Dot(v1), 2.0f, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Dot4
+int UtcDaliVector4Dot4(void)
+{
+ DALI_TEST_EQUALS(Vector4::XAXIS.Dot4(Vector4::YAXIS), 0.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector4::XAXIS.Dot4(Vector4::ZAXIS), 0.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector4::YAXIS.Dot4(Vector4::ZAXIS), 0.0f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(Vector4::XAXIS.Dot4(Vector4::XAXIS), 1.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector4::YAXIS.Dot4(Vector4::YAXIS), 1.0f, TEST_LOCATION);
+ DALI_TEST_EQUALS(Vector4::ZAXIS.Dot4(Vector4::ZAXIS), 1.0f, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(Vector4(1.0f, 0.0f, 0.0f, 1.0f).Dot4(Vector4(1.0f, 0.0f, 0.0f, 1.0f)), 2.0f, TEST_LOCATION);
+
+ for (float x = 0; x<6.0f; x+=1.0f)
+ {
+ Vector4 v0(cosf(x), sinf(x), 0.0f, 1.0f);
+ Vector4 v1(sinf(x), -cosf(x), 0.0f, 1.0f);
+ DALI_TEST_EQUALS(v0.Dot4(v1), 1.0f, 0.0001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(v0.Dot4(v0), 2.0f, 0.0001f, TEST_LOCATION);
+
+ v0 = Vector4(cosf(x), 0.0f, sinf(x), 0.0f);
+ v1 = Vector4(sinf(x), 0.0f, -cosf(x), 0.0f);
+ DALI_TEST_EQUALS(v0.Dot4(v1), 0.0f, 0.0001f, TEST_LOCATION);
+ DALI_TEST_EQUALS(v0.Dot4(v0), 1.0f, 0.0001f, TEST_LOCATION);
+ }
+
+ Vector4 v0(12.0f, 7.0f, 9.0f, 3.0f);
+ v0.Normalize();
+
+ Vector4 v1 = v0 * 2.0f;
+ DALI_TEST_EQUALS(v0.Dot4(v1), 2.0f + 3.0f*6.0f, 0.001f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Equals
+int UtcDaliVector4Equals(void)
+{
+ Vector4 v0(1.0f, 2.0f, 3.0f, 4.0f);
+ Vector4 v1(1.0f, 2.0f, 3.0f, 4.0f);
+
+ DALI_TEST_CHECK(v0 == v1);
+
+ Vector4 v2 = Vector4(0.0f, 2.0f, 3.0f, 4.0f);
+ DALI_TEST_CHECK(v0 != v2);
+
+ v2 = Vector4(1.0f, 0.0f, 3.0f, 4.0f);
+ DALI_TEST_CHECK(v0 != v2);
+
+ v2 = Vector4(1.0f, 2.0f, 0.0f, 4.0f);
+ DALI_TEST_CHECK(v0 != v2);
+
+ v2 = Vector4(1.0f, 2.0f, 3.0f, 0.0f);
+ DALI_TEST_CHECK(v0 != v2);
+ END_TEST;
+}
+
+// Length
+int UtcDaliVector4Length(void)
+{
+ Vector4 v(1.0f, 2.0f, 3.0f, 4.0f);
+ DALI_TEST_EQUALS(v.Length(), sqrtf(v.x*v.x + v.y*v.y + v.z*v.z), 0.001f, TEST_LOCATION);
+
+ Vector4 v1(0.0f, 0.0f, 0.0f, 0.0f);
+ DALI_TEST_EQUALS(v1.Length(), 0.0f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Length squared
+int UtcDaliVector4LengthSquared(void)
+{
+ Vector4 v(1.0f, 2.0f, 3.0f, 4.0f);
+ DALI_TEST_EQUALS(v.LengthSquared(), v.x*v.x + v.y*v.y + v.z*v.z, 0.001f, TEST_LOCATION);
+
+ Vector4 v1(0.0f, 0.0f, 0.0f, 0.0f);
+ DALI_TEST_EQUALS(v1.LengthSquared(), 0.0f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Max
+int UtcDaliVector4Max(void)
+{
+ Vector4 v0(2.0f, 2.0f, 1.0f, 1.0f);
+ Vector4 v1(1.0f, 1.0f, 2.0f, 2.0f);
+
+ DALI_TEST_EQUALS(Max(v0, v1), Vector4(2.0f, 2.0f, 2.0f, 2.0f), 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Min
+int UtcDaliVector4Min(void)
+{
+ Vector4 v0(2.0f, 2.0f, 1.0f, 1.0f);
+ Vector4 v1(1.0f, 1.0f, 2.0f, 2.0f);
+
+ DALI_TEST_EQUALS(Min(v0, v1), Vector4(1.0f, 1.0f, 1.0f, 1.0f), 0.01f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Clamp
+int UtcDaliVector4Clamp(void)
+{
+ tet_infoline("Testing Dali::Vector4::Clamp()");
+
+ Vector4 v0(2.0f, 2.0f, -2.0f, -2.0f);
+ DALI_TEST_EQUALS(Clamp(v0, -1.0f, 1.0f), Vector4(1.0f, 1.0f, -1.0f, -1.0f), 0.01f, TEST_LOCATION);
+
+ Vector4 v1(1.0f, 0.0f, 0.0f, -1.0f);
+ DALI_TEST_EQUALS(Clamp(v1, -1.0f, 1.0f), v1, 0.01f, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliVector4ClampVector4(void)
+{
+ tet_infoline("Testing Dali::Vector4::Clamp( const Vector4& v, const Vector4& min, const Vector4& max )");
+
+ Vector4 v0(2.0f, 0.8f, 0.0f, 5.0f);
+ Vector4 v1(-1.0f, 2.0f, 10.0f, -10.0f);
+ Vector4 v2(10.0f, 5.0f, 0.0f, 10.0f);
+ Vector4 v3(8.0f, 10.0f, 5.0f, -20.0f);
+ Vector4 v4(4.9f, 5.1f, 10.0f, 0.0f);
+
+ Vector4 min(1.0f, -2.0f, -8.0f, -16.0f);
+ Vector4 max(2.0f, 4.0f, 4.0f, -8.0f);
+
+ v0.Clamp( min, max );
+ v1.Clamp( min, max );
+ v2.Clamp( min, max );
+ v3.Clamp( min, max );
+ v4.Clamp( min, max );
+
+ DALI_TEST_EQUALS( v0, Vector4( 2.0f, 0.8f, 0.0f, -8.0f), 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( v1, Vector4( 1.0f, 2.0f, 4.0f, -10.0f), 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( v2, Vector4( 2.0f, 4.0f, 0.0f, -8.0f), 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( v3, Vector4( 2.0f, 4.0f, 4.0f, -16.0f), 0.01f, TEST_LOCATION );
+ DALI_TEST_EQUALS( v4, Vector4( 2.0f, 4.0f, 4.0f, -8.0f), 0.01f, TEST_LOCATION );
+ END_TEST;
+}
+
+// Multiply
+int UtcDaliVector4Multiply(void)
+{
+ Vector4 v0(2.0f, 3.0f, 4.0f, 5.0f);
+ Vector4 v1(10.0f, 20.0f, 30.0f, 40.0f);
+ Vector4 r0(20.0f, 60.0f, 120.0f, 200.0f);
+
+ Vector4 v2 = v0 * v1;
+ DALI_TEST_EQUALS(v2, r0, TEST_LOCATION);
+
+ v0 *= v1;
+ DALI_TEST_EQUALS(v0, r0, TEST_LOCATION);
+ END_TEST;
+}
+
+// Divide
+int UtcDaliVector4Divide(void)
+{
+ Vector4 v0(1.0f, 1.0f, 1.0f, 1.0f);
+ Vector4 v1(2.0f, 3.0f, 5.0f, 7.0f);
+ Vector4 v2(4.0f, 9.0f, 25.0f, 49.0f);
+
+ DALI_TEST_EQUALS( v0/v0, v0, TEST_LOCATION);
+ DALI_TEST_EQUALS( v1/v0, v1, TEST_LOCATION);
+ DALI_TEST_EQUALS( v1/v1, v0, TEST_LOCATION);
+ DALI_TEST_EQUALS( v2/v1, v1, TEST_LOCATION);
+
+ Vector4 v4(v0);
+ v4 /= v0;
+ DALI_TEST_EQUALS(v4, v0, TEST_LOCATION);
+
+ Vector4 v5(v1);
+ v5 /= v0;
+ DALI_TEST_EQUALS(v5, v1, TEST_LOCATION);
+
+ Vector4 v6(v1);
+ v6 /= v6;
+ DALI_TEST_EQUALS(v6, v0, TEST_LOCATION);
+
+ v2 /= v1;
+ DALI_TEST_EQUALS(v2, v1, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliVector4Scale(void)
+{
+ Vector4 v0(2.0f, 4.0f, 8.0f, 16.0f);
+ const Vector4 r0(20.0f, 40.0f, 80.0f, 160.0f);
+ const Vector4 r1(10.0f, 20.0f, 40.0f, 80.0f);
+ const Vector4 r2( 1.0f, 2.0f, 4.0f, 8.0f);
+ const Vector4 r3(2.0f, 4.0f, 8.0f, 16.0f);
+
+ Vector4 v2 = v0 * 10.0f;
+ DALI_TEST_EQUALS(v2, r0, TEST_LOCATION);
+
+ v0 *= 5.0f;
+ DALI_TEST_EQUALS(v0, r1, TEST_LOCATION);
+
+ v2 = r0 / 10.0f;
+ DALI_TEST_EQUALS(v2, r3, TEST_LOCATION);
+
+ v2 = r1;
+ v2 /= 10.0f;
+ DALI_TEST_EQUALS(v2, r2, TEST_LOCATION);
+ END_TEST;
+}
+
+
+// Normalize
+int UtcDaliVector4Normalize(void)
+{
+ for (float f=0.0f; f<6.0f; f+=1.0f)
+ {
+ Vector4 v(cosf(f)*10.0f, cosf(f+1.0f)*10.0f, cosf(f+2.0f)*10.0f, 1.0f);
+ v.Normalize();
+ DALI_TEST_EQUALS(v.LengthSquared(), 1.0f, 0.001f, TEST_LOCATION);
+ }
+
+ Vector4 v(0.0f, 0.0f, 0.0f, 1.0f);
+ v.Normalize();
+ DALI_TEST_EQUALS(v.LengthSquared(), 0.0f, 0.00001f, TEST_LOCATION);
+ END_TEST;
+}
+
+// Subtract
+int UtcDaliVector4Subtract(void)
+{
+ Vector4 v0(11.0f, 22.0f, 33.0f, 44.0f);
+ Vector4 v1(10.0f, 20.0f, 30.0f, 40.0f);
+ Vector4 r0(1.0f, 2.0f, 3.0f, 4.0f);
+
+ Vector4 v2 = v0-v1;
+ DALI_TEST_EQUALS(v2, r0, TEST_LOCATION);
+
+ v0 -= v1;
+ DALI_TEST_EQUALS(v0, r0, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliVector4OperatorSubscript(void)
+{
+ Vector4 testVector(1.0f, 2.0f, 3.0f, 4.0f);
+
+ // read array subscripts
+ DALI_TEST_EQUALS( testVector[0], 1.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testVector[1], 2.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testVector[2], 3.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testVector[3], 4.0f, TEST_LOCATION );
+
+ // write array subscripts/read struct memebers
+ testVector[0] = 5.0f;
+ testVector[1] = 6.0f;
+ testVector[2] = 7.0f;
+ testVector[3] = 8.0f;
+
+ DALI_TEST_EQUALS( testVector.x, 5.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testVector.y, 6.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testVector.z, 7.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testVector.w, 8.0f, TEST_LOCATION );
+
+ // write struct members/read array subscripts
+ testVector.x = 9.0f;
+ testVector.y = 10.0f;
+ testVector.z = 11.0f;
+ testVector.w = 12.0f;
+
+ DALI_TEST_EQUALS( testVector[0], 9.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testVector[1], 10.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testVector[2], 11.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( testVector[3], 12.0f, TEST_LOCATION );
+
+
+ // write struct members/read array subscripts
+ const Vector4 testVector2(1.0f, 2.0f, 3.0f, 4.0f);
+ const float& x = testVector2[0];
+ const float& y = testVector2[1];
+ const float& z ( testVector2[2] );
+ const float& w ( testVector2[3] );
+
+ DALI_TEST_EQUALS( x, 1.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( y, 2.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( z, 3.0f, TEST_LOCATION );
+ DALI_TEST_EQUALS( w, 4.0f, TEST_LOCATION );
+
+ try
+ {
+ float& w = testVector[4];
+ if(w==0.0f);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, "index < 4", TEST_LOCATION );
+ }
+
+ try
+ {
+ const float& w = testVector2[4];
+ if(w==0.0f);
+ tet_result(TET_FAIL);
+ }
+ catch (Dali::DaliException& e)
+ {
+ tet_printf("Assertion %s failed at %s\n", e.mCondition.c_str(), e.mLocation.c_str());
+ DALI_TEST_ASSERT( e, "index < 4", TEST_LOCATION );
+ }
+ END_TEST;
+}
+
+int UtcDaliVector4OStreamOperator(void)
+{
+ std::ostringstream oss;
+
+ Vector4 vector(1.0f, 2.0f, 3.0f, 4.0f);
+
+ oss << vector;
+
+ std::string expectedOutput = "[1, 2, 3, 4]";
+
+ DALI_TEST_EQUALS( oss.str(), expectedOutput, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliVector4AsFloat(void)
+{
+ float values[] = {0.0f, 1.0f, 2.0f, 3.0f};
+ Vector4 v0(values);
+
+ for (int i=0;i<4;++i)
+ {
+ DALI_TEST_EQUALS(v0.AsFloat()[i], values[i], TEST_LOCATION);
+ }
+
+ const Vector4 v1(values);
+ for (int i=0;i<4;++i)
+ {
+ DALI_TEST_EQUALS(v1.AsFloat()[i], values[i], TEST_LOCATION);
+ }
+ END_TEST;
+}
--- /dev/null
+function getScrollTop() {
+ return f_scrollTop();
+}
+
+function f_scrollTop() {
+ return f_filterResults($(window) ? $(window).scrollTop() : 0,
+ document.documentElement ? document.documentElement.scrollTop : 0,
+ document.body ? document.body.scrollTop : 0);
+}
+function f_filterResults(n_win, n_docel, n_body) {
+ var n_result = n_win ? n_win : 0;
+ if (n_docel && (!n_result || (n_result > n_docel)))
+ n_result = n_docel;
+ return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
+}
+
+function setScrollTop() {
+ $(window) ? $(window).scrollTop(0) : 0;
+ document.documentElement ? document.documentElement.scrollTop = 0 : 0;
+ document.body ? document.body.scrollTop = 0 : 0;
+}
+
+function goTopEx() {
+ $node = $('#goTopBtn');
+ if (getScrollTop() > 0) {
+ $node.show();
+ } else {
+ $node.hide();
+ }
+
+ $(window).scroll(function() {
+ if (getScrollTop() > 0) {
+ $node.show();
+ } else {
+ $node.hide();
+ }
+ });
+
+ $node.click(function() {
+ setScrollTop();
+ });
+}
+
+function drawRatio() {
+ $('.suite_item').each(function(i, node) {
+ drawSuiteRatio(node)
+ });
+}
+
+$(".see_all").click(function(){
+ $("#see_all").show();
+ $("#see_fail").hide();
+ $("#see_block").hide();
+ $("#see_na").hide();
+ updateToggles();
+ return false;
+});
+
+$(".see_failed").click(function(){
+ $("#see_all").hide();
+ $("#see_fail").show();
+ $("#see_block").hide();
+ $("#see_na").hide();
+ updateToggles();
+ return false;
+});
+
+$(".see_blocked").click(function(){
+ $("#see_all").hide();
+ $("#see_fail").hide();
+ $("#see_block").show();
+ $("#see_na").hide();
+ updateToggles();
+ return false;
+});
+
+$(".see_na").click(function(){
+ $("#see_all").hide();
+ $("#see_fail").hide();
+ $("#see_block").hide();
+ $("#see_na").show();
+ updateToggles();
+ return false;
+});
+
+$("a.test_case_popup").click(function(){
+ var $this = $(this);
+ Popup.show($this.attr('id'));
+ return false;
+});
+
+$(".see_capabilities").click(function(){
+ if ($('#capability_table').css('display') == 'none') {
+ $("#capability_table").show();
+ }else{
+ $("#capability_table").hide();
+ }
+ return false;
+});
+
+function drawSuiteRatio(node) {
+ arrTitle = new Array("Passed", "Failed", "Blocked", "Not Executed");
+ var $node = $(node);
+ var $total = $node.find('.total');
+ var $pass = $node.find('.pass');
+ var $fail = $node.find('.fail');
+ var $block = $node.find('.block');
+ var $na = $node.find('.na');
+ var $div = $node.find('.RatioGraphic');
+
+ var total_int = parseInt($total.text());
+ var pass_int = parseInt($pass.text());
+ var fail_int = parseInt($fail.text());
+ var block_int = parseInt($block.text());
+ var na_int = parseInt($na.text());
+
+ var pass_rate = pass_int * 100 / total_int;
+ var fail_rate = fail_int * 100 / total_int;
+ var block_rate = block_int * 100 / total_int;
+ var na_rate = na_int * 100 / total_int;
+
+ var areaWidth = 380;
+
+ var pass_width = areaWidth * pass_rate / 100;
+ var fail_width = areaWidth * fail_rate / 100;
+ var block_width = areaWidth * block_rate / 100;
+ var na_width = areaWidth * na_rate / 100;
+
+ pass_rate = pass_rate.toFixed(2);
+ fail_rate = fail_rate.toFixed(2);
+ block_rate = block_rate.toFixed(2);
+ na_rate = na_rate.toFixed(2);
+
+ var pass_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/blue.jpg");"
+ var fail_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/red.jpg");"
+ var block_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/orange.jpg");"
+ var na_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/gray.jpg");"
+
+ var html = "<table width=\"380.68\" align=\"center\"><tbody><tr>";
+ if (pass_width > 0){
+ html += "<td width=\""
+ + pass_width
+ + "\" style=\""
+ + pass_style
+ + "\" title=\"Passed :"
+ + pass_rate
+ + "%\">";
+ if (pass_width > 20){
+ html += pass_rate + "%"
+ }
+ html += "</td>";
+ }
+ if (fail_width > 0){
+ html += "<td width=\""
+ + fail_width
+ + "\" style=\""
+ + fail_style
+ + "\" title=\"Failed :"
+ + fail_rate
+ + "%\">";
+ if (fail_width > 20){
+ html += fail_rate + "%"
+ }
+ html += "</td>";
+ }
+ if (block_width > 0){
+ html += "<td width=\""
+ + block_width
+ + "\" style=\""
+ + block_style
+ + "\" title=\"Blocked :"
+ + block_rate
+ + "%\">";
+ if (block_width > 20){
+ html += block_rate + "%"
+ }
+ html += "</td>";
+ }
+ if (na_width > 0){
+ html += "<td width=\""
+ + na_width
+ + "\" style=\""
+ + na_style
+ + "\" title=\"Blocked :"
+ + na_rate
+ + "%\">";
+ if (na_width > 20){
+ html += na_rate + "%"
+ }
+ html += "</td>";
+ }
+ html += "</tr></tbody></table>";
+ $div.html(html);
+}
--- /dev/null
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file
--- /dev/null
+/**
+ * Copyright (c)2005-2009 Matt Kruse (javascripttoolbox.com)
+ *
+ * Dual licensed under the MIT and GPL licenses.
+ * This basically means you can use this code however you want for
+ * free, but don't claim to have written it yourself!
+ * Donations always accepted: http://www.JavascriptToolbox.com/donate/
+ *
+ * Please do not link to the .js files on javascripttoolbox.com from
+ * your site. Copy the files locally to your server instead.
+ *
+ */
+/* ******************************************************************* */
+/* UTIL FUNCTIONS */
+/* ******************************************************************* */
+var Util = {'$VERSION':1.06};
+
+// Util functions - these are GLOBAL so they
+// look like built-in functions.
+
+// Determine if an object is an array
+function isArray(o) {
+ return (o!=null && typeof(o)=="object" && typeof(o.length)=="number" && (o.length==0 || defined(o[0])));
+};
+
+// Determine if an object is an Object
+function isObject(o) {
+ return (o!=null && typeof(o)=="object" && defined(o.constructor) && o.constructor==Object && !defined(o.nodeName));
+};
+
+// Determine if a reference is defined
+function defined(o) {
+ return (typeof(o)!="undefined");
+};
+
+// Iterate over an array, object, or list of items and run code against each item
+// Similar functionality to Perl's map() function
+function map(func) {
+ var i,j,o;
+ var results = [];
+ if (typeof(func)=="string") {
+ func = new Function('$_',func);
+ }
+ for (i=1; i<arguments.length; i++) {
+ o = arguments[i];
+ if (isArray(o)) {
+ for (j=0; j<o.length; j++) {
+ results[results.length] = func(o[j]);
+ }
+ }
+ else if (isObject(o)) {
+ for (j in o) {
+ results[results.length] = func(o[j]);
+ }
+ }
+ else {
+ results[results.length] = func(o);
+ }
+ }
+ return results;
+};
+
+// Set default values in an object if they are undefined
+function setDefaultValues(o,values) {
+ if (!defined(o) || o==null) {
+ o = {};
+ }
+ if (!defined(values) || values==null) {
+ return o;
+ }
+ for (var val in values) {
+ if (!defined(o[val])) {
+ o[val] = values[val];
+ }
+ }
+ return o;
+};
+
+/* ******************************************************************* */
+/* DEFAULT OBJECT PROTOTYPE ENHANCEMENTS */
+/* ******************************************************************* */
+// These functions add useful functionality to built-in objects
+Array.prototype.contains = function(o) {
+ var i,l;
+ if (!(l = this.length)) { return false; }
+ for (i=0; i<l; i++) {
+ if (o==this[i]) {
+ return true;
+ }
+ }
+};
+
+/* ******************************************************************* */
+/* DOM FUNCTIONS */
+/* ******************************************************************* */
+var DOM = (function() {
+ var dom = {};
+
+ // Get a parent tag with a given nodename
+ dom.getParentByTagName = function(o,tagNames) {
+ if(o==null) { return null; }
+ if (isArray(tagNames)) {
+ tagNames = map("return $_.toUpperCase()",tagNames);
+ while (o=o.parentNode) {
+ if (o.nodeName && tagNames.contains(o.nodeName)) {
+ return o;
+ }
+ }
+ }
+ else {
+ tagNames = tagNames.toUpperCase();
+ while (o=o.parentNode) {
+ if (o.nodeName && tagNames==o.nodeName) {
+ return o;
+ }
+ }
+ }
+ return null;
+ };
+
+ // Remove a node from its parent
+ dom.removeNode = function(o) {
+ if (o!=null && o.parentNode && o.parentNode.removeChild) {
+ // First remove all attributes which are func references, to avoid memory leaks
+ for (var i in o) {
+ if (typeof(o[i])=="function") {
+ o[i] = null;
+ }
+ }
+ o.parentNode.removeChild(o);
+ return true;
+ }
+ return false;
+ };
+
+ // Get the outer width in pixels of an object, including borders, padding, and margin
+ dom.getOuterWidth = function(o) {
+ if (defined(o.offsetWidth)) {
+ return o.offsetWidth;
+ }
+ return null;
+ };
+
+ // Get the outer height in pixels of an object, including borders, padding, and margin
+ dom.getOuterHeight = function(o) {
+ if (defined(o.offsetHeight)) {
+ return o.offsetHeight;
+ }
+ return null;
+ };
+
+ // Resolve an item, an array of items, or an object of items
+ dom.resolve = function() {
+ var results = new Array();
+ var i,j,o;
+ for (var i=0; i<arguments.length; i++) {
+ var o = arguments[i];
+ if (o==null) {
+ if (arguments.length==1) {
+ return null;
+ }
+ results[results.length] = null;
+ }
+ else if (typeof(o)=='string') {
+ if (document.getElementById) {
+ o = document.getElementById(o);
+ }
+ else if (document.all) {
+ o = document.all[o];
+ }
+ if (arguments.length==1) {
+ return o;
+ }
+ results[results.length] = o;
+ }
+ else if (isArray(o)) {
+ for (j=0; j<o.length; j++) {
+ results[results.length] = o[j];
+ }
+ }
+ else if (isObject(o)) {
+ for (j in o) {
+ results[results.length] = o[j];
+ }
+ }
+ else if (arguments.length==1) {
+ return o;
+ }
+ else {
+ results[results.length] = o;
+ }
+ }
+ return results;
+ };
+ dom.$ = dom.resolve;
+
+ return dom;
+})();
+
+/* ******************************************************************* */
+/* CSS FUNCTIONS */
+/* ******************************************************************* */
+var CSS = (function(){
+ var css = {};
+
+ // Convert an RGB string in the form "rgb (255, 255, 255)" to "#ffffff"
+ css.rgb2hex = function(rgbString) {
+ if (typeof(rgbString)!="string" || !defined(rgbString.match)) { return null; }
+ var result = rgbString.match(/^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*/);
+ if (result==null) { return rgbString; }
+ var rgb = +result[1] << 16 | +result[2] << 8 | +result[3];
+ var hex = "";
+ var digits = "0123456789abcdef";
+ while(rgb!=0) {
+ hex = digits.charAt(rgb&0xf)+hex;
+ rgb>>>=4;
+ }
+ while(hex.length<6) { hex='0'+hex; }
+ return "#" + hex;
+ };
+
+ // Convert hyphen style names like border-width to camel case like borderWidth
+ css.hyphen2camel = function(property) {
+ if (!defined(property) || property==null) { return null; }
+ if (property.indexOf("-")<0) { return property; }
+ var str = "";
+ var c = null;
+ var l = property.length;
+ for (var i=0; i<l; i++) {
+ c = property.charAt(i);
+ str += (c!="-")?c:property.charAt(++i).toUpperCase();
+ }
+ return str;
+ };
+
+ // Determine if an object or class string contains a given class.
+ css.hasClass = function(obj,className) {
+ if (!defined(obj) || obj==null || !RegExp) { return false; }
+ var re = new RegExp("(^|\\s)" + className + "(\\s|$)");
+ if (typeof(obj)=="string") {
+ return re.test(obj);
+ }
+ else if (typeof(obj)=="object" && obj.className) {
+ return re.test(obj.className);
+ }
+ return false;
+ };
+
+ // Add a class to an object
+ css.addClass = function(obj,className) {
+ if (typeof(obj)!="object" || obj==null || !defined(obj.className)) { return false; }
+ if (obj.className==null || obj.className=='') {
+ obj.className = className;
+ return true;
+ }
+ if (css.hasClass(obj,className)) { return true; }
+ obj.className = obj.className + " " + className;
+ return true;
+ };
+
+ // Remove a class from an object
+ css.removeClass = function(obj,className) {
+ if (typeof(obj)!="object" || obj==null || !defined(obj.className) || obj.className==null) { return false; }
+ if (!css.hasClass(obj,className)) { return false; }
+ var re = new RegExp("(^|\\s+)" + className + "(\\s+|$)");
+ obj.className = obj.className.replace(re,' ');
+ return true;
+ };
+
+ // Fully replace a class with a new one
+ css.replaceClass = function(obj,className,newClassName) {
+ if (typeof(obj)!="object" || obj==null || !defined(obj.className) || obj.className==null) { return false; }
+ css.removeClass(obj,className);
+ css.addClass(obj,newClassName);
+ return true;
+ };
+
+ // Get the currently-applied style of an object
+ css.getStyle = function(o, property) {
+ if (o==null) { return null; }
+ var val = null;
+ var camelProperty = css.hyphen2camel(property);
+ // Handle "float" property as a special case
+ if (property=="float") {
+ val = css.getStyle(o,"cssFloat");
+ if (val==null) {
+ val = css.getStyle(o,"styleFloat");
+ }
+ }
+ else if (o.currentStyle && defined(o.currentStyle[camelProperty])) {
+ val = o.currentStyle[camelProperty];
+ }
+ else if (window.getComputedStyle) {
+ val = window.getComputedStyle(o,null).getPropertyValue(property);
+ }
+ else if (o.style && defined(o.style[camelProperty])) {
+ val = o.style[camelProperty];
+ }
+ // For color values, make the value consistent across browsers
+ // Convert rgb() colors back to hex for consistency
+ if (/^\s*rgb\s*\(/.test(val)) {
+ val = css.rgb2hex(val);
+ }
+ // Lowercase all #hex values
+ if (/^#/.test(val)) {
+ val = val.toLowerCase();
+ }
+ return val;
+ };
+ css.get = css.getStyle;
+
+ // Set a style on an object
+ css.setStyle = function(o, property, value) {
+ if (o==null || !defined(o.style) || !defined(property) || property==null || !defined(value)) { return false; }
+ if (property=="float") {
+ o.style["cssFloat"] = value;
+ o.style["styleFloat"] = value;
+ }
+ else if (property=="opacity") {
+ o.style['-moz-opacity'] = value;
+ o.style['-khtml-opacity'] = value;
+ o.style.opacity = value;
+ if (defined(o.style.filter)) {
+ o.style.filter = "alpha(opacity=" + value*100 + ")";
+ }
+ }
+ else {
+ o.style[css.hyphen2camel(property)] = value;
+ }
+ return true;
+ };
+ css.set = css.setStyle;
+
+ // Get a unique ID which doesn't already exist on the page
+ css.uniqueIdNumber=1000;
+ css.createId = function(o) {
+ if (defined(o) && o!=null && defined(o.id) && o.id!=null && o.id!="") {
+ return o.id;
+ }
+ var id = null;
+ while (id==null || document.getElementById(id)!=null) {
+ id = "ID_"+(css.uniqueIdNumber++);
+ }
+ if (defined(o) && o!=null && (!defined(o.id)||o.id=="")) {
+ o.id = id;
+ }
+ return id;
+ };
+
+ return css;
+})();
+
+/* ******************************************************************* */
+/* EVENT FUNCTIONS */
+/* ******************************************************************* */
+
+var Event = (function(){
+ var ev = {};
+
+ // Resolve an event using IE's window.event if necessary
+ // --------------------------------------------------------------------
+ ev.resolve = function(e) {
+ if (!defined(e) && defined(window.event)) {
+ e = window.event;
+ }
+ return e;
+ };
+
+ // Add an event handler to a function
+ // Note: Don't use 'this' within functions added using this method, since
+ // the attachEvent and addEventListener models differ.
+ // --------------------------------------------------------------------
+ ev.add = function( obj, type, fn, capture ) {
+ if (obj.addEventListener) {
+ obj.addEventListener( type, fn, capture );
+ return true;
+ }
+ else if (obj.attachEvent) {
+ obj.attachEvent( "on"+type, fn );
+ return true;
+ }
+ return false;
+ };
+
+ // Get the mouse position of an event
+ // --------------------------------------------------------------------
+ // PageX/Y, where they exist, are more reliable than ClientX/Y because
+ // of some browser bugs in Opera/Safari
+ ev.getMouseX = function(e) {
+ e = ev.resolve(e);
+ if (defined(e.pageX)) {
+ return e.pageX;
+ }
+ if (defined(e.clientX)) {
+ return e.clientX+Screen.getScrollLeft();
+ }
+ return null;
+ };
+ ev.getMouseY = function(e) {
+ e = ev.resolve(e);
+ if (defined(e.pageY)) {
+ return e.pageY;
+ }
+ if (defined(e.clientY)) {
+ return e.clientY+Screen.getScrollTop();
+ }
+ return null;
+ };
+
+ // Stop the event from bubbling up to parent elements.
+ // Two method names map to the same function
+ // --------------------------------------------------------------------
+ ev.cancelBubble = function(e) {
+ e = ev.resolve(e);
+ if (typeof(e.stopPropagation)=="function") { e.stopPropagation(); }
+ if (defined(e.cancelBubble)) { e.cancelBubble = true; }
+ };
+ ev.stopPropagation = ev.cancelBubble;
+
+ // Prevent the default handling of the event to occur
+ // --------------------------------------------------------------------
+ ev.preventDefault = function(e) {
+ e = ev.resolve(e);
+ if (typeof(e.preventDefault)=="function") { e.preventDefault(); }
+ if (defined(e.returnValue)) { e.returnValue = false; }
+ };
+
+ return ev;
+})();
+
+/* ******************************************************************* */
+/* SCREEN FUNCTIONS */
+/* ******************************************************************* */
+var Screen = (function() {
+ var screen = {};
+
+ // Get a reference to the body
+ // --------------------------------------------------------------------
+ screen.getBody = function() {
+ if (document.body) {
+ return document.body;
+ }
+ if (document.getElementsByTagName) {
+ var bodies = document.getElementsByTagName("BODY");
+ if (bodies!=null && bodies.length>0) {
+ return bodies[0];
+ }
+ }
+ return null;
+ };
+
+ // Get the amount that the main document has scrolled from top
+ // --------------------------------------------------------------------
+ screen.getScrollTop = function() {
+ if (document.documentElement && defined(document.documentElement.scrollTop) && document.documentElement.scrollTop>0) {
+ return document.documentElement.scrollTop;
+ }
+ if (document.body && defined(document.body.scrollTop)) {
+ return document.body.scrollTop;
+ }
+ return null;
+ };
+
+ // Get the amount that the main document has scrolled from left
+ // --------------------------------------------------------------------
+ screen.getScrollLeft = function() {
+ if (document.documentElement && defined(document.documentElement.scrollLeft) && document.documentElement.scrollLeft>0) {
+ return document.documentElement.scrollLeft;
+ }
+ if (document.body && defined(document.body.scrollLeft)) {
+ return document.body.scrollLeft;
+ }
+ return null;
+ };
+
+ // Util function to default a bad number to 0
+ // --------------------------------------------------------------------
+ screen.zero = function(n) {
+ return (!defined(n) || isNaN(n))?0:n;
+ };
+
+ // Get the width of the entire document
+ // --------------------------------------------------------------------
+ screen.getDocumentWidth = function() {
+ var width = 0;
+ var body = screen.getBody();
+ if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
+ var rightMargin = parseInt(CSS.get(body,'marginRight'),10) || 0;
+ var leftMargin = parseInt(CSS.get(body,'marginLeft'), 10) || 0;
+ width = Math.max(body.offsetWidth + leftMargin + rightMargin, document.documentElement.clientWidth);
+ }
+ else {
+ width = Math.max(body.clientWidth, body.scrollWidth);
+ }
+ if (isNaN(width) || width==0) {
+ width = screen.zero(self.innerWidth);
+ }
+ return width;
+ };
+
+ // Get the height of the entire document
+ // --------------------------------------------------------------------
+ screen.getDocumentHeight = function() {
+ var body = screen.getBody();
+ var innerHeight = (defined(self.innerHeight)&&!isNaN(self.innerHeight))?self.innerHeight:0;
+ if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
+ var topMargin = parseInt(CSS.get(body,'marginTop'),10) || 0;
+ var bottomMargin = parseInt(CSS.get(body,'marginBottom'), 10) || 0;
+ return Math.max(body.offsetHeight + topMargin + bottomMargin, document.documentElement.clientHeight, document.documentElement.scrollHeight, screen.zero(self.innerHeight));
+ }
+ return Math.max(body.scrollHeight, body.clientHeight, screen.zero(self.innerHeight));
+ };
+
+ // Get the width of the viewport (viewable area) in the browser window
+ // --------------------------------------------------------------------
+ screen.getViewportWidth = function() {
+ if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
+ return document.documentElement.clientWidth;
+ }
+ else if (document.compatMode && document.body) {
+ return document.body.clientWidth;
+ }
+ return screen.zero(self.innerWidth);
+ };
+
+ // Get the height of the viewport (viewable area) in the browser window
+ // --------------------------------------------------------------------
+ screen.getViewportHeight = function() {
+ if (!window.opera && document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
+ return document.documentElement.clientHeight;
+ }
+ else if (document.compatMode && !window.opera && document.body) {
+ return document.body.clientHeight;
+ }
+ return screen.zero(self.innerHeight);
+ };
+
+ return screen;
+})();var Sort = (function(){
+ var sort = {};
+ sort.AlphaNumeric = function(a,b) {
+ if (a==b) { return 0; }
+ if (a<b) { return -1; }
+ return 1;
+ };
+
+ sort.Default = sort.AlphaNumeric;
+
+ sort.NumericConversion = function(val) {
+ if (typeof(val)!="number") {
+ if (typeof(val)=="string") {
+ val = parseFloat(val.replace(/,/g,''));
+ if (isNaN(val) || val==null) { val=0; }
+ }
+ else {
+ val = 0;
+ }
+ }
+ return val;
+ };
+
+ sort.Numeric = function(a,b) {
+ return sort.NumericConversion(a)-sort.NumericConversion(b);
+ };
+
+ sort.IgnoreCaseConversion = function(val) {
+ if (val==null) { val=""; }
+ return (""+val).toLowerCase();
+ };
+
+ sort.IgnoreCase = function(a,b) {
+ return sort.AlphaNumeric(sort.IgnoreCaseConversion(a),sort.IgnoreCaseConversion(b));
+ };
+
+ sort.CurrencyConversion = function(val) {
+ if (typeof(val)=="string") {
+ val = val.replace(/^[^\d\.]/,'');
+ }
+ return sort.NumericConversion(val);
+ };
+
+ sort.Currency = function(a,b) {
+ return sort.Numeric(sort.CurrencyConversion(a),sort.CurrencyConversion(b));
+ };
+
+ sort.DateConversion = function(val) {
+ // inner util function to parse date formats
+ function getdate(str) {
+ // inner util function to convert 2-digit years to 4
+ function fixYear(yr) {
+ yr = +yr;
+ if (yr<50) { yr += 2000; }
+ else if (yr<100) { yr += 1900; }
+ return yr;
+ };
+ var ret;
+ // YYYY-MM-DD
+ if (ret=str.match(/(\d{2,4})-(\d{1,2})-(\d{1,2})/)) {
+ return (fixYear(ret[1])*10000) + (ret[2]*100) + (+ret[3]);
+ }
+ // MM/DD/YY[YY] or MM-DD-YY[YY]
+ if (ret=str.match(/(\d{1,2})[\/-](\d{1,2})[\/-](\d{2,4})/)) {
+ return (fixYear(ret[3])*10000) + (ret[1]*100) + (+ret[2]);
+ }
+ return 99999999; // So non-parsed dates will be last, not first
+ };
+ return getdate(val);
+ };
+
+ sort.Date = function(a,b) {
+ return sort.Numeric(sort.DateConversion(a),sort.DateConversion(b));
+ };
+
+ return sort;
+})();
+
+var Position = (function() {
+ // Resolve a string identifier to an object
+ // ========================================
+ function resolveObject(s) {
+ if (document.getElementById && document.getElementById(s)!=null) {
+ return document.getElementById(s);
+ }
+ else if (document.all && document.all[s]!=null) {
+ return document.all[s];
+ }
+ else if (document.anchors && document.anchors.length && document.anchors.length>0 && document.anchors[0].x) {
+ for (var i=0; i<document.anchors.length; i++) {
+ if (document.anchors[i].name==s) {
+ return document.anchors[i]
+ }
+ }
+ }
+ }
+
+ var pos = {};
+ pos.$VERSION = 1.0;
+
+ // Set the position of an object
+ // =============================
+ pos.set = function(o,left,top) {
+ if (typeof(o)=="string") {
+ o = resolveObject(o);
+ }
+ if (o==null || !o.style) {
+ return false;
+ }
+
+ // If the second parameter is an object, it is assumed to be the result of getPosition()
+ if (typeof(left)=="object") {
+ var pos = left;
+ left = pos.left;
+ top = pos.top;
+ }
+
+ o.style.left = left + "px";
+ o.style.top = top + "px";
+ return true;
+ };
+
+ // Retrieve the position and size of an object
+ // ===========================================
+ pos.get = function(o) {
+ var fixBrowserQuirks = true;
+ // If a string is passed in instead of an object ref, resolve it
+ if (typeof(o)=="string") {
+ o = resolveObject(o);
+ }
+
+ if (o==null) {
+ return null;
+ }
+
+ var left = 0;
+ var top = 0;
+ var width = 0;
+ var height = 0;
+ var parentNode = null;
+ var offsetParent = null;
+
+
+ offsetParent = o.offsetParent;
+ var originalObject = o;
+ var el = o; // "el" will be nodes as we walk up, "o" will be saved for offsetParent references
+ while (el.parentNode!=null) {
+ el = el.parentNode;
+ if (el.offsetParent==null) {
+ }
+ else {
+ var considerScroll = true;
+ /*
+ In Opera, if parentNode of the first object is scrollable, then offsetLeft/offsetTop already
+ take its scroll position into account. If elements further up the chain are scrollable, their
+ scroll offsets still need to be added in. And for some reason, TR nodes have a scrolltop value
+ which must be ignored.
+ */
+ if (fixBrowserQuirks && window.opera) {
+ if (el==originalObject.parentNode || el.nodeName=="TR") {
+ considerScroll = false;
+ }
+ }
+ if (considerScroll) {
+ if (el.scrollTop && el.scrollTop>0) {
+ top -= el.scrollTop;
+ }
+ if (el.scrollLeft && el.scrollLeft>0) {
+ left -= el.scrollLeft;
+ }
+ }
+ }
+ // If this node is also the offsetParent, add on the offsets and reset to the new offsetParent
+ if (el == offsetParent) {
+ left += o.offsetLeft;
+ if (el.clientLeft && el.nodeName!="TABLE") {
+ left += el.clientLeft;
+ }
+ top += o.offsetTop;
+ if (el.clientTop && el.nodeName!="TABLE") {
+ top += el.clientTop;
+ }
+ o = el;
+ if (o.offsetParent==null) {
+ if (o.offsetLeft) {
+ left += o.offsetLeft;
+ }
+ if (o.offsetTop) {
+ top += o.offsetTop;
+ }
+ }
+ offsetParent = o.offsetParent;
+ }
+ }
+
+
+ if (originalObject.offsetWidth) {
+ width = originalObject.offsetWidth;
+ }
+ if (originalObject.offsetHeight) {
+ height = originalObject.offsetHeight;
+ }
+
+ return {'left':left, 'top':top, 'width':width, 'height':height
+ };
+ };
+
+ // Retrieve the position of an object's center point
+ // =================================================
+ pos.getCenter = function(o) {
+ var c = this.get(o);
+ if (c==null) { return null; }
+ c.left = c.left + (c.width/2);
+ c.top = c.top + (c.height/2);
+ return c;
+ };
+
+ return pos;
+})();// CLASS CONSTRUCTOR
+// --------------------------------------------------------------------
+var Popup = function(div, options) {
+ this.div = defined(div)?div:null;
+ this.index = Popup.maxIndex++;
+ this.ref = "Popup.objects["+this.index+"]";
+ Popup.objects[this.index] = this;
+ // Store a reference to the DIV by id, also
+ if (typeof(this.div)=="string") {
+ Popup.objectsById[this.div] = this;
+ }
+ if (defined(this.div) && this.div!=null && defined(this.div.id)) {
+ Popup.objectsById[this.div.id] = this.div.id;
+ }
+ // Apply passed-in options
+ if (defined(options) && options!=null && typeof(options)=="object") {
+ for (var i in options) {
+ this[i] = options[i];
+ }
+ }
+ return this;
+};
+
+// CLASS PROPERTIES
+// --------------------------------------------------------------------
+// Index of popup objects, to maintain a global reference if necessary
+Popup.maxIndex = 0;
+Popup.objects = {};
+Popup.objectsById = {};
+
+// The z-index value that popups will start at
+Popup.minZIndex = 101;
+
+// Class names to assign to other objects
+Popup.screenClass = "PopupScreen";
+Popup.iframeClass = "PopupIframe";
+Popup.screenIframeClass = "PopupScreenIframe";
+
+// CLASS METHODS
+// --------------------------------------------------------------------
+
+// Hide all currently-visible non-modal dialogs
+Popup.hideAll = function() {
+ for (var i in Popup.objects) {
+ var p = Popup.objects[i];
+ if (!p.modal && p.autoHide) {
+ p.hide();
+ }
+ }
+};
+// Catch global events as a trigger to hide auto-hide popups
+Event.add(document, "mouseup", Popup.hideAll, false);
+
+// A simple class method to show a popup without creating an instance
+Popup.show = function(divObject, referenceObject, position, options, modal) {
+ var popup;
+ if (defined(divObject)) {
+ popup = new Popup(divObject);
+ }
+ else {
+ popup = new Popup();
+ popup.destroyDivOnHide = true;
+ }
+ if (defined(referenceObject)) { popup.reference = DOM.resolve(referenceObject); }
+ if (defined(position)) { popup.position = position; }
+ if (defined(options) && options!=null && typeof(options)=="object") {
+ for (var i in options) {
+ popup[i] = options[i];
+ }
+ }
+ if (typeof(modal)=="boolean") {
+ popup.modal = modal;
+ }
+ popup.destroyObjectsOnHide = true;
+ popup.show();
+ return popup;
+};
+
+// A simple class method to show a modal popup
+Popup.showModal = function(divObject, referenceObject, position, options) {
+ Popup.show(divObject, referenceObject, position, options, true);
+};
+
+// A method to retrieve a popup object based on a div ID
+Popup.get = function(divId) {
+ if (defined(Popup.objectsById[divId])) {
+ return Popup.objectsById[divId];
+ }
+ return null;
+};
+
+// A method to hide a popup based on a div id
+Popup.hide = function(divId) {
+ var popup = Popup.get(divId);
+ if (popup!=null) {
+ popup.hide();
+ }
+};
+
+// PROTOTYPE PROPERTIES
+// --------------------------------------------------------------------
+Popup.prototype.content = null;
+Popup.prototype.className = "PopupDiv";
+Popup.prototype.style = null; // Styles to be applied to the DIV
+Popup.prototype.width = null;
+Popup.prototype.height = null;
+Popup.prototype.top = null;
+Popup.prototype.left = null;
+Popup.prototype.offsetLeft = 0;
+Popup.prototype.offsetTop = 0;
+Popup.prototype.constrainToScreen = true;
+Popup.prototype.autoHide = true;
+Popup.prototype.useIframeShim = false; /*@cc_on @*/ /*@if (@_win32) {Popup.prototype.useIframeShim = true;} @end @*/
+Popup.prototype.iframe = null;
+Popup.prototype.position = null; // vertical: "above top center bottom below", horizontal: "adjacent-left,left,center,right,adjacent-right"
+Popup.prototype.reference = null;
+Popup.prototype.modal = false;
+Popup.prototype.destroyDivOnHide = false;
+Popup.prototype.destroyObjectsOnHide = false;
+Popup.prototype.screen = null;
+Popup.prototype.screenIframeShim = null;
+Popup.prototype.screenOpacity=.4;
+Popup.prototype.screenColor="#cccccc";
+
+// INSTANCE METHODS
+// --------------------------------------------------------------------
+
+// Show the popup
+// --------------------------------------------------------------------
+Popup.prototype.show = function(options, modal) {
+ this.modal = this.modal || (typeof(modal)=="boolean" && modal);
+ if (defined(options) && options!=null && typeof(options)=="object") {
+ for (var i in options) {
+ this[i] = options[i];
+ }
+ }
+ this.div = DOM.resolve(this.div);
+ CSS.setStyle(this.div,'position','absolute');
+
+ // If there is no div pre-defined to use, create one
+ if (this.div==null) {
+ this.div = this.createDiv();
+ }
+ if (this.content!=null) {
+ this.div.innerHTML = this.content;
+ this.content = null;
+ }
+ if (this.className!=null) {
+ this.div.className = this.className;
+ }
+ if (this.style!=null) {
+ this.applyStyle();
+ }
+ if (this.width!=null) {
+ this.div.style.width = this.width+"px";
+ this.div.style.overflowX="auto";
+ }
+ if (this.height!=null) {
+ this.div.style.height = this.height+"px";
+ this.div.style.overflowY="auto";
+ }
+
+ // Do the actual display - this is a separate method so display transitions can be implemented
+ this.transition();
+
+ // Make sure clicks on the DIV don't bubble up to the document
+ this.div.onclick = function(e) {
+ Event.cancelBubble(Event.resolve(e));
+ };
+ this.div.onmouseup = this.div.onclick;
+
+ // Focus to the DIV if possible
+ if (this.modal && this.div.focus) {
+ this.div.focus();
+ }
+};
+
+// Show the popup but make it modal
+// --------------------------------------------------------------------
+Popup.prototype.transition = function() {
+ if (this.modal) {
+ this.addScreen();
+ }
+
+ // Make the DIV displayed but hidden so its size can be measured
+ CSS.setStyle(this.div,'visibility','hidden');
+ CSS.setStyle(this.div,'display','block');
+
+ // Position the popup
+ this.setPosition();
+
+ // Add the shim if necessary
+ if (this.useIframeShim) {
+ this.addIframeShim();
+ }
+
+ // Make sure the DIV is higher than the shim
+ this.div.style.zIndex = Popup.minZIndex++;
+
+ CSS.setStyle(this.div,'display','block');
+ CSS.setStyle(this.div,'visibility','visible');
+};
+
+// Show the popup but make it modal
+// --------------------------------------------------------------------
+Popup.prototype.showModal = function(options) {
+ this.show(options,true);
+};
+
+// Apply user styles to the DIV
+// --------------------------------------------------------------------
+Popup.prototype.applyStyle = function() {
+ if (this.div!=null && this.style!=null && typeof(this.style)=="object") {
+ for (var i in this.style) {
+ this.div.style[i] = this.style[i];
+ }
+ }
+};
+
+// Hide the popup
+// --------------------------------------------------------------------
+Popup.prototype.hide = function() {
+ // If this was a temp object creating on-the-fly, then remove objects from the DOM so
+ // The document doesn't get littered with extra objects
+ if (this.destroyDivOnHide) {
+ DOM.removeNode(this.div);
+ this.div = null;
+ delete Popup.objects[this.id];
+ }
+ else if (this.div!=null) {
+ CSS.setStyle(this.div,'display','none');
+ }
+
+ if (this.destroyObjectsOnHide) {
+ DOM.removeNode(this.iframe);
+ DOM.removeNode(this.screen);
+ DOM.removeNode(this.screenIframeShim);
+ }
+ else {
+ if (this.iframe!=null) {
+ this.iframe.style.display = "none";
+ }
+ if (this.screen!=null) {
+ this.screen.style.display = "none";
+ }
+ if (this.screenIframeShim!=null) {
+ this.screenIframeShim.style.display = "none";
+ }
+ }
+};
+
+// Util funcs for position
+// --------------------------------------------------------------------
+Popup.prototype.setTop = function(top) {
+ this.div.style.top = top+"px";
+};
+Popup.prototype.setLeft = function(left) {
+ this.div.style.left = left+"px";
+};
+Popup.prototype.getTop = function() {
+ return parseInt(CSS.getStyle(this.div,"top"),10);
+};
+Popup.prototype.getLeft = function() {
+ return parseInt(CSS.getStyle(this.div,"left"),10);
+};
+
+// All the logic to position the popup based on various criteria
+// --------------------------------------------------------------------
+Popup.prototype.setPosition = function() {
+ if (this.position!=null) {
+ var m = this.position.match(/^(\S+)\s+(\S+)/);
+ if (m!=null && m.length==3) {
+ var v = m[1];
+ var h = m[2];
+
+ var ref = this.reference;
+ if (ref==null) { ref = Screen.getBody(); }
+ var p = Position.get(ref);
+ var refTop = p.top;
+ var refLeft = p.left;
+ var refWidth = DOM.getOuterWidth(ref);
+ var refHeight = DOM.getOuterHeight(ref);
+
+ var width = DOM.getOuterWidth(this.div);
+ var height = DOM.getOuterHeight(this.div);
+
+ var scrollLeft = Screen.getScrollLeft();
+ var scrollTop = Screen.getScrollTop();
+
+ // Set vertical position relative to reference object
+ if (v=="above") { this.setTop(refTop-height+this.offsetTop); }
+ else if (v=="top") { this.setTop(refTop+this.offsetTop); }
+ else if (v=="center") { this.setTop(refTop+(refHeight/2)-(height/2)+this.offsetTop); }
+ else if (v=="bottom") { this.setTop(refTop+refHeight-height+this.offsetTop); }
+ else if (v=="below") { this.setTop(refTop+refHeight+this.offsetTop); }
+
+ // Set horizontal position relative to reference object
+ if (h=="adjacent-left") { this.setLeft(refLeft-width+this.offsetLeft); }
+ else if (h=="left") { this.setLeft(refLeft+this.offsetLeft); }
+ else if (h=="center") { this.setLeft(refLeft+(refWidth/2)-(width/2)+this.offsetLeft); }
+ else if (h=="right") { this.setLeft(refLeft+refWidth-width+this.offsetLeft); }
+ else if (h=="adjacent-right") { this.setLeft(refLeft+refWidth+this.offsetLeft); }
+ }
+ }
+ else if (this.top==null && this.left==null) {
+ this.center();
+ }
+ else {
+ if (this.top==null) { this.top=0; }
+ if (this.left==null) { this.left=0; }
+ this.div.style.top = this.top+this.offsetTop+"px";
+ this.div.style.left = this.left+this.offsetLeft+"px";
+ }
+
+ // Re-position to make sure it stays on the screen
+ if (this.constrainToScreen) {
+ this.fitToScreen();
+ }
+};
+
+// Append an object to the body
+// --------------------------------------------------------------------
+Popup.prototype.appendToBody = function(o) {
+ var body = Screen.getBody();
+ if (body && body.appendChild) {
+ body.appendChild(o);
+ }
+};
+
+// Create a new DIV object to be used for a popup
+// --------------------------------------------------------------------
+Popup.prototype.createDiv = function() {
+ if (document.createElement) {
+ var d = document.createElement("DIV");
+ d.style.position="absolute";
+ d.style.display="block";
+ d.style.visibility="hidden";
+ this.appendToBody(d);
+ return d;
+ }
+ alert("ERROR: Couldn't create DIV element in Popup.prototype.createDiv()");
+ return null;
+};
+
+// Create a new IFRAME object to be used behind the popup
+// --------------------------------------------------------------------
+Popup.prototype.createIframe = function() {
+ if (document.createElement) {
+ var i= document.createElement("IFRAME");
+ i.style.position="absolute";
+ i.style.display="block";
+ i.style.visibility="hidden";
+ i.style.background="none";
+ this.appendToBody(i);
+ return i;
+ }
+ else {
+ alert("ERROR: Couldn't create IFRAME object in Popup.prototype.createIframe()");
+ }
+};
+
+// Add an IFRAME shim for the DIV
+// --------------------------------------------------------------------
+Popup.prototype.addIframeShim = function() {
+ if (this.iframe==null) {
+ this.iframe = this.createIframe();
+ }
+ this.iframe.className = Popup.iframeClass;
+ CSS.setStyle(this.iframe,'top',this.getTop()+"px");
+ CSS.setStyle(this.iframe,'left',this.getLeft()+"px");
+ CSS.setStyle(this.iframe,'width',DOM.getOuterWidth(this.div) + "px");
+ CSS.setStyle(this.iframe,'height',DOM.getOuterHeight(this.div) + "px");
+ CSS.setStyle(this.iframe,'zIndex',Popup.minZIndex++);
+ CSS.setStyle(this.iframe,'opacity',0);
+ CSS.setStyle(this.iframe,'visibility','visible');
+ CSS.setStyle(this.iframe,'display','block');
+};
+
+// Create a "screen" to make a popup modal
+// --------------------------------------------------------------------
+Popup.prototype.addScreen = function() {
+ if (this.screen==null) {
+ this.screen = this.createDiv();
+ this.screen.style.top="0px";
+ this.screen.style.left="0px";
+ this.screen.style.backgroundColor = this.screenColor;
+ this.screen.className=Popup.screenClass;;
+ CSS.setStyle(this.screen,"opacity",this.screenOpacity);
+ this.screen.onclick = function(e) { Event.cancelBubble(Event.resolve(e)); }
+ }
+ if (this.screenIframeShim==null) {
+ this.screenIframeShim = this.createIframe();
+ this.screenIframeShim.style.top="0px";
+ this.screenIframeShim.style.left="0px";
+ this.screenIframeShim.className=Popup.screenIframeClass;
+ CSS.setStyle(this.screenIframeShim,"opacity",0);
+ }
+ this.screen.style.width = Screen.getDocumentWidth()+"px";
+ this.screen.style.height = Screen.getDocumentHeight()+"px";
+ this.screenIframeShim.style.width = Screen.getDocumentWidth()+"px";
+ this.screenIframeShim.style.height = Screen.getDocumentHeight()+"px";
+ this.screenIframeShim.style.zIndex = Popup.minZIndex++;
+ this.screenIframeShim.style.visibility="visible";
+ this.screenIframeShim.style.display="block";
+ this.screen.style.zIndex = Popup.minZIndex++;
+ this.screen.style.visibility="visible";
+ this.screen.style.display="block";
+};
+
+// Re-position the DIV so it stays on the screen
+// --------------------------------------------------------------------
+Popup.prototype.fitToScreen = function() {
+ var width = DOM.getOuterWidth(this.div);
+ var height = DOM.getOuterHeight(this.div);
+ var top = this.getTop();
+ var left = this.getLeft();
+
+ var clientWidth = Screen.getViewportWidth();
+ var clientHeight = Screen.getViewportHeight();
+
+ var scrollLeft = Screen.getScrollLeft();
+ var scrollTop = Screen.getScrollTop();
+
+ if (top-scrollTop+height>clientHeight) {
+ top = top - ((top+height) - (scrollTop+clientHeight));
+ this.div.style.top = top + "px";
+ }
+ if (left-scrollLeft+width>clientWidth) {
+ left = left - ((left+width) - (scrollLeft+clientWidth));
+ this.div.style.left = left + "px";
+ }
+ if (top<scrollTop) {
+ this.div.style.top=scrollTop+"px";
+ }
+ if (left<scrollLeft) {
+ this.div.style.left=scrollLeft+"px";
+ }
+};
+
+// Center the DIV object
+// --------------------------------------------------------------------
+Popup.prototype.center = function() {
+ var left = DOM.getOuterWidth(this.div);
+ var top = DOM.getOuterHeight(this.div);
+ if (isNaN(left)) { left=0; }
+ if (isNaN(top)) { top=0; }
+ var clientW = Screen.getViewportWidth();
+ var clientH = Screen.getViewportHeight();
+ if (clientW!=null && clientH!=null) {
+ top = (clientH-top)/2;
+ left = (clientW-left)/2;
+ }
+ top += Screen.getScrollTop();
+ left += Screen.getScrollLeft();
+
+ this.div.style.top = top+this.offsetTop+"px";
+ this.div.style.left = left+this.offsetLeft+"px";
+};
+
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="html" version="1.0" encoding="UTF-8"
+ indent="yes" />
+ <xsl:template match="/">
+ <html>
+ <STYLE type="text/css">
+ @import "./style/tests.css";
+ </STYLE>
+ <head>
+ <script type="text/javascript" src="./style/jquery.min.js" />
+ </head>
+ <body>
+ <div id="testcasepage">
+ <div id="title">
+ <table>
+ <tr>
+ <td>
+ <h1>TCT Report</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="overview">
+ <table>
+ <tr>
+ <td>
+ <div id="summary">
+ <table>
+ <tr>
+ <th colspan="2">Test Summary</th>
+ </tr>
+ <!-- tr>
+ <td>TCT Version</td>
+ <td>
+ <xsl:value-of select="result_summary/environment/@cts_version" />
+ </td>
+ </tr -->
+ <tr>
+ <td>Test Plan Name</td>
+ <td>
+ <xsl:value-of select="result_summary/@plan_name" />
+ </td>
+ </tr>
+ <tr>
+ <td>Build ID</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@build_id">
+ <xsl:if test="result_summary/environment/@build_id = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@build_id" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Test Total</td>
+ <td>
+ <xsl:value-of select="sum(result_summary//suite/total_case)" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Passed</td>
+ <td>
+ <xsl:value-of select="sum(result_summary//suite/pass_case)" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Failed</td>
+ <td>
+ <xsl:value-of select="sum(result_summary//suite/fail_case)" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Blocked</td>
+ <td>
+ <xsl:value-of select="sum(result_summary//suite/block_case)" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Not Executed</td>
+ <td>
+ <xsl:value-of select="sum(result_summary//suite/na_case)" />
+ </td>
+ </tr>
+ <tr>
+ <td>Time</td>
+ <td>
+ <xsl:value-of select="result_summary/summary/start_at" />
+ ~
+ <xsl:value-of select="result_summary/summary/end_at" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ <td>
+ <div id="device">
+ <table>
+ <tr>
+ <th colspan="2">Device Information</th>
+ </tr>
+ <tr>
+ <td>Host Device</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@host">
+ <xsl:if test="result_summary/environment/@host = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@host" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Manufacturer</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@manufacturer">
+ <xsl:if test="result_summary/environment/@manufacturer = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@manufacturer" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Device Model</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@device_model">
+ <xsl:if test="result_summary/environment/@device_model = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@device_model" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Device ID</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@device_id">
+ <xsl:if test="result_summary/environment/@device_id = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@device_id" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Screen Size</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@screen_size">
+ <xsl:if test="result_summary/environment/@screen_size = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@screen_size" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Resolution</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@resolution">
+ <xsl:if test="result_summary/environment/@resolution = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@resolution" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </div>
+
+ <div id="capability">
+ <div id="title">
+ <a name="contents"></a>
+ <table>
+ <tr>
+ <td class="title">
+ <h1><a href="#" class="see_capabilities">Device Capability</a></h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <xsl:choose>
+ <xsl:when test="result_summary/capabilities">
+ <div id="capability_table" style="display:none;">
+ <table>
+ <tr>
+ <th>Capability Name</th>
+ <th>Type</th>
+ <th>Value</th>
+ </tr>
+ <xsl:for-each select="result_summary/capabilities/capability">
+ <xsl:sort select="@name" />
+ <tr>
+ <td>
+ <xsl:value-of select="@name" />
+ </td>
+ <td>
+ <xsl:value-of select="@type" />
+ </td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="value">
+ <xsl:value-of select="value" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@support" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ The information of device capability is not available.
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+
+ <div id="suite_summary">
+ <div id="title">
+ <a name="contents"></a>
+ <table>
+ <tr>
+ <td class="title">
+ <h1>Test Summary by Suite</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <table>
+ <tr>
+ <th>Suite</th>
+ <th>Total</th>
+ <th>Passed</th>
+ <th>Failed</th>
+ <th>Blocked</th>
+ <th>Not Executed</th>
+ <th class="Ratio">Ratio</th>
+ </tr>
+ <xsl:for-each select="result_summary/suite">
+ <xsl:sort select="@name" />
+ <tr class="suite_item">
+ <xsl:attribute name="id">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ <td>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@name" />.xml</xsl:attribute>
+ <xsl:value-of select="@name" />
+ </a>
+ </td>
+ <td class="total">
+ <xsl:value-of select="total_case" />
+ </td>
+ <td class="pass">
+ <xsl:value-of select="pass_case" />
+ </td>
+ <td class="fail">
+ <xsl:value-of select="fail_case" />
+ </td>
+ <td class="block">
+ <xsl:value-of select="block_case" />
+ </td>
+ <td class="na">
+ <xsl:value-of select="na_case" />
+ </td>
+ <td class="Ratio">
+ <div class="RatioGraphic" />
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </div>
+
+ </div>
+ <div id="goTopBtn">
+ <img border="0" src="./style/back_top.png" />
+ </div>
+ <script type="text/javascript" src="./style/application.js" />
+ <script language="javascript" type="text/javascript">
+ $(document).ready(function(){
+ goTopEx();
+ drawRatio();
+ });
+ </script>
+ </body>
+ </html>
+ </xsl:template>
+ <xsl:template name="br-replace">
+ <xsl:param name="word" />
+ <xsl:variable name="cr">
+ <xsl:text>\n</xsl:text>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="contains($word,$cr)">
+ <xsl:value-of select="substring-before($word,$cr)" />
+ <br />
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="substring-after($word,$cr)" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$word" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="html" version="1.0" encoding="UTF-8"
+ indent="yes" />
+ <xsl:template match="/">
+ <html>
+ <STYLE type="text/css">
+ @import "./style/tests.css";
+ </STYLE>
+ <head>
+ <script type="text/javascript" src="./style/jquery.min.js" />
+ <script type="text/javascript" src="./style/popup.js" />
+ </head>
+ <body>
+ <div id="title">
+ <table>
+ <tr>
+ <td class="title">
+ <h1 align="center">Suite Test Results</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="btc">
+ <table>
+ <tr>
+ <td>
+ <a href="#" class="see_all">Show all</a>
+ </td>
+ <td>
+ <a href="#" class="see_failed">Show only failed</a>
+ </td>
+ <td>
+ <a href="#" class="see_blocked">Show only blocked</a>
+ </td>
+ <td>
+ <a href="#" class="see_na">Show only not executed</a>
+ </td>
+ <td>
+ <a href="summary.xml">Summary</a>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="testcasepage">
+ <div id="cases">
+ <div id="see_all">
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name" />
+ <div id="suite_title">
+ <h2>
+ Test Suite:
+ <xsl:value-of select="@name" />
+ (All)
+ </h2>
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ </a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stderr</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <xsl:sort select="@name" />
+ <tr>
+ <xsl:choose>
+ <xsl:when test="@name">
+ <td colspan="3">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ <td colspan="1">
+ <h4>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@set_debug_msg" /></xsl:attribute>
+ dlog
+ </a>
+ </h4>
+ </td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td colspan="4">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+ <xsl:for-each select=".//testcase">
+ <xsl:sort select="@id" />
+ <tr>
+ <td>
+ <div
+ style="background-color:#F5DEB3;border:1px solid black;display:none;">
+ <xsl:attribute name="id"><xsl:value-of
+ select="@id" /></xsl:attribute>
+ <p>
+ <xsl:for-each select="./description/steps//step">
+ <xsl:sort select="@order" />
+ <B>
+ Step
+ <xsl:value-of select="@order" />
+ :
+ </B>
+ <br />
+ <xsl:value-of select=".//step_desc" />
+ <br />
+ <B>Expected:</B>
+ <xsl:value-of select=".//expected" />
+ <br />
+ </xsl:for-each>
+ </p>
+ <p>
+ <br />
+ <B>
+ Entry:
+ <br />
+ </B>
+ <xsl:value-of select="./description//test_script_entry" />
+ <br />
+ </p>
+ </div>
+ <a href="#" class="test_case_popup">
+ <xsl:attribute name="id"><xsl:value-of
+ select="@id" /></xsl:attribute>
+ <xsl:value-of select="@id" />
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose" />
+ </td>
+
+ <xsl:choose>
+ <xsl:when test="@result">
+ <xsl:if test="@result = 'FAIL'">
+ <td class="red_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ </xsl:if>
+ <xsl:if test="@result = 'PASS'">
+ <td class="green_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ </xsl:if>
+ <xsl:if test="@result = 'BLOCK' ">
+ <td class="orange_rate">
+ BLOCK
+ </td>
+ </xsl:if>
+ <xsl:if
+ test="@result != 'BLOCK' and @result != 'FAIL' and @result != 'PASS' ">
+ <td class="gray_rate">
+ Not Run
+ </td>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <td>
+
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ <td>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word"
+ select=".//result_info/stderr" />
+ </xsl:call-template>
+ <xsl:if test=".//result_info/stderr = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ <div id="see_fail" style="display:none;">
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name" />
+ <div id="suite_title">
+ <h2>
+ Test Suite:
+ <xsl:value-of select="@name" />
+ (Failed only)
+ </h2>
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ </a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stderr</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <xsl:sort select="@name" />
+ <tr>
+ <xsl:choose>
+ <xsl:when test="@name">
+ <td colspan="3">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ <td colspan="1">
+ <h4>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@set_debug_msg" /></xsl:attribute>
+ dlog
+ </a>
+ </h4>
+ </td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td colspan="4">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+ <xsl:for-each select=".//testcase[@result='FAIL']">
+ <xsl:sort select="@id" />
+ <tr>
+ <td>
+ <div
+ style="background-color:#F5DEB3;border:1px solid black;display:none;">
+ <xsl:attribute name="id">fail_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <p>
+ <xsl:for-each select="./description/steps//step">
+ <xsl:sort select="@order" />
+ <B>
+ Step
+ <xsl:value-of select="@order" />
+ :
+ </B>
+ <br />
+ <xsl:value-of select=".//step_desc" />
+ <br />
+ <B>Expected:</B>
+ <xsl:value-of select=".//expected" />
+ <br />
+ </xsl:for-each>
+ </p>
+ <p>
+ <br />
+ <B>
+ Entry:
+ <br />
+ </B>
+ <xsl:value-of select="./description//test_script_entry" />
+ <br />
+ </p>
+ </div>
+ <a href="#" class="test_case_popup">
+ <xsl:attribute name="id">fail_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <xsl:value-of select="@id" />
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose" />
+ </td>
+
+ <td class="red_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ <td>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word"
+ select=".//result_info/stderr" />
+ </xsl:call-template>
+ <xsl:if test=".//result_info/stderr = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ <div id="see_block" style="display:none;">
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name" />
+ <div id="suite_title">
+ <h2>
+ Test Suite:
+ <xsl:value-of select="@name" />
+ (Blocked Only)
+ </h2>
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ </a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stderr</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <xsl:sort select="@name" />
+ <tr>
+ <xsl:choose>
+ <xsl:when test="@name">
+ <td colspan="3">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ <td colspan="1">
+ <h4>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@set_debug_msg" /></xsl:attribute>
+ dlog
+ </a>
+ </h4>
+ </td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td colspan="4">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+ <xsl:for-each select=".//testcase[@result='BLOCK']">
+ <xsl:sort select="@id" />
+ <tr>
+ <td>
+ <div
+ style="background-color:#F5DEB3;border:1px solid black;display:none;">
+ <xsl:attribute name="id">block_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <p>
+ <xsl:for-each select="./description/steps//step">
+ <xsl:sort select="@order" />
+ <B>
+ Step
+ <xsl:value-of select="@order" />
+ :
+ </B>
+ <br />
+ <xsl:value-of select=".//step_desc" />
+ <br />
+ <B>Expected:</B>
+ <xsl:value-of select=".//expected" />
+ <br />
+ </xsl:for-each>
+ </p>
+ <p>
+ <br />
+ <B>
+ Entry:
+ <br />
+ </B>
+ <xsl:value-of select="./description//test_script_entry" />
+ <br />
+ </p>
+ </div>
+ <a href="#" class="test_case_popup">
+ <xsl:attribute name="id">block_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <xsl:value-of select="@id" />
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose" />
+ </td>
+
+ <td class="orange_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ <td>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word"
+ select=".//result_info/stderr" />
+ </xsl:call-template>
+ <xsl:if test=".//result_info/stderr = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ <div id="see_na" style="display:none;">
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name" />
+ <div id="suite_title">
+ <h2>
+ Test Suite:
+ <xsl:value-of select="@name" />
+ (Not executed Only)
+ </h2>
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ </a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stderr</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <xsl:sort select="@name" />
+ <tr>
+ <xsl:choose>
+ <xsl:when test="@name">
+ <td colspan="3">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ <td colspan="1">
+ <h4>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@set_debug_msg" /></xsl:attribute>
+ dlog
+ </a>
+ </h4>
+ </td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td colspan="4">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+ <xsl:for-each select=".//testcase[@result='N/A']">
+ <xsl:sort select="@id" />
+ <tr>
+ <td>
+ <div
+ style="background-color:#F5DEB3;border:1px solid black;display:none;">
+ <xsl:attribute name="id">na_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <p>
+ <xsl:for-each select="./description/steps//step">
+ <xsl:sort select="@order" />
+ <B>
+ Step
+ <xsl:value-of select="@order" />
+ :
+ </B>
+ <br />
+ <xsl:value-of select=".//step_desc" />
+ <br />
+ <B>Expected:</B>
+ <xsl:value-of select=".//expected" />
+ <br />
+ </xsl:for-each>
+ </p>
+ <p>
+ <br />
+ <B>
+ Entry:
+ <br />
+ </B>
+ <xsl:value-of select="./description//test_script_entry" />
+ <br />
+ </p>
+ </div>
+ <a href="#" class="test_case_popup">
+ <xsl:attribute name="id">na_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <xsl:value-of select="@id" />
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose" />
+ </td>
+
+ <td class="gray_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ <td>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word"
+ select=".//result_info/stderr" />
+ </xsl:call-template>
+ <xsl:if test=".//result_info/stderr = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ </div>
+ </div>
+ <div id="goTopBtn">
+ <img border="0" src="./style/back_top.png" />
+ </div>
+ <script type="text/javascript" src="./style/application.js" />
+ <script language="javascript" type="text/javascript">
+ $(document).ready(function(){
+ goTopEx();
+ });
+ </script>
+ </body>
+ </html>
+ </xsl:template>
+ <xsl:template name="br-replace">
+ <xsl:param name="word" />
+ <xsl:variable name="cr">
+ <xsl:text>\n</xsl:text>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="contains($word,$cr)">
+ <xsl:value-of select="substring-before($word,$cr)" />
+ <br />
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="substring-after($word,$cr)" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$word" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
--- /dev/null
+@charset "UTF-8";
+/* CSS Document */
+#testcasepage div,#testcasepage h1,#testcasepage p,#testcasepage table,#testcasepage tr,#testcasepage th,#testcasepage td
+ {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-weight: inherit;
+ font-style: inherit;
+ font-size: 0.96em;
+ font-family: arial;
+ vertical-align: baseline;
+}
+
+#title td, #btc td{
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-weight: inherit;
+ font-style: inherit;
+ font-size: 0.96em;
+ font-family: arial;
+ vertical-align: baseline;
+}
+
+td.Ratio {
+ text-align: left;
+ font-weight: normal;
+ padding: 4px 10px 4px 5px;
+ vertical-align: middle;
+}
+
+th.Ratio {
+ width: 400px;
+}
+
+#testcasepage p {
+ text-align: left;
+}
+
+#suite_title {
+ text-align: left;
+}
+
+#btc {
+ text-align: right;
+}
+
+#btc table {
+ position: absolute;
+ right: 0px;
+ width: 600px;
+}
+
+#testcasepage table {
+ border-collapse: separate;
+ border-spacing: 0;
+ margin-bottom: 1.4em;
+ vertical-align: middle;
+}
+
+#testcasepage th,#testcasepage td {
+ text-align: left;
+ font-weight: normal;
+ padding: 4px 10px 4px 5px;
+ vertical-align: middle;
+}
+
+#cases table {
+ width: 101%;
+}
+
+#cases td {
+ border-left: 0px;
+ font-weight: normal;
+ border-bottom: 0px;
+}
+
+#suite_summary table {
+ width: 100%;
+}
+
+
+#overview table {
+ width: 101%;
+}
+
+#overview table, #overview td, #overview tr {
+ border-left: none;
+ border-bottom: none;
+ border-right: none;
+ vertical-align: top;
+}
+
+#overview td{
+ width: 50%;
+}
+
+#capability table {
+ width: 50%;
+}
+
+#fail_cases table {
+ width: 101%;
+}
+
+#title table {
+ width: 101%;
+}
+
+#device table {
+ width: 100%;
+}
+
+#summary table {
+ width: 100%;
+}
+
+#testcasepage th {
+ border-bottom: 1px solid #000;
+ background-color: #AAAAAA;
+ border-left: 1px solid #000;
+ border-top: 1px solid #000;
+ color: #000;
+ font-weight: bold;
+ vertical-align: bottom;
+}
+
+#summary th:last-child,#summary td:last-child, #device th:last-child,#device td:last-child, #suite_summary th:last-child,#suite_summary td:last-child,#cases th:last-child,#cases td:last-child,#capability th:last-child,#capability td:last-child {
+ border-right: 1px solid #000;
+}
+
+#testcasepage td {
+ font-weight: normal;
+}
+
+#summary td, #device td, #capability td, #suite_summary td, #cases td{
+ border-left: 1px solid;
+ font-weight: normal;
+ border-bottom: 1px solid;
+}
+
+#testcasepage td.yellow_rate {
+ background-color: #ffcc00;
+}
+
+#testcasepage td.green_rate {
+ background-color: #1E90FF;
+}
+
+#testcasepage td.dgreen_rate {
+ background-color: #339933;
+}
+
+#testcasepage td.red_rate {
+ background-color: #FF3333;
+}
+
+#testcasepage td.orange_rate {
+ background-color: #FFA500;
+}
+
+#testcasepage td.gray_rate {
+ background-color: #AAAAAA;
+}
+
+#title table,#title tr,#title td {
+ border-left: none;
+ border-bottom: none;
+ text-align: center;
+}
+
+#title td:last-child {
+ border-right: none;
+}
+
+#testcasepage h1 {
+ font-size: 2em;
+ font-family: Arial, sans-serif;
+ font-weight: bold;
+ line-height: 1;
+ color: #000;
+ margin-bottom: 0.75em;
+ padding-top: 0.25em;
+ font-weight: bold;
+}
+
+#goTopBtn {
+ right: 0px;
+ bottom: 0px;
+ position: fixed; +
+ position: absolute;
+ top: expression(parseInt(document.body.scrollTop)+document.body.clientHeight-40
+ );
+}
--- /dev/null
+scripts/tcbuild.sh
\ No newline at end of file
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = dali-core.pc dali-test-suite-utils.pc
-automated_tests_src_dir = ../../automated-tests
-include ../../automated-tests/file.list
+automated_tests_src_dir = ../../automated-tests/TET
+include ../../automated-tests/TET/file.list
dalitestsuitedir = $(includedir)/dali/test-suite-utils
dalitestsuite_HEADERS = $(test_suite_utils_header_files)
dali-core/Makefile
dali-core.pc
dali-test-suite-utils.pc
- ../../automated-tests/rules.mk
+ ../../automated-tests/TET/rules.mk
])
AC_OUTPUT
noinst_PROGRAMS = linker.test
-linker_test_SOURCES = linker-test.cpp ../../../automated-tests/dali-test-suite-utils/test-application.cpp
+linker_test_SOURCES = linker-test.cpp ../../../automated-tests/TET/dali-test-suite-utils/test-application.cpp
linker_test_CXXFLAGS = \
-Werror -Wall -Wfloat-equal \
- -I../../../automated-tests/dali-test-suite-utils \
+ -I../../../automated-tests/TET/dali-test-suite-utils \
$(dali_core_includes) \
$(DALI_CFLAGS) \
$(OPENGLES20_CFLAGS)