From e44a7e37b6c7b5961adaffc62b9042b8d442938e Mon Sep 17 00:00:00 2001 From: mensonge Date: Thu, 13 Nov 2008 09:49:11 +0000 Subject: New feature: basic Ajax suggestion for tags and implementation of Dojo toolkit git-svn-id: https://semanticscuttle.svn.sourceforge.net/svnroot/semanticscuttle/trunk@151 b3834d28-1941-0410-a4f8-b48e95affb8f --- includes/js/dojox/dtl/tests/text/tag.js | 480 ++++++++++++++++++++++++++++++++ 1 file changed, 480 insertions(+) create mode 100644 includes/js/dojox/dtl/tests/text/tag.js (limited to 'includes/js/dojox/dtl/tests/text/tag.js') diff --git a/includes/js/dojox/dtl/tests/text/tag.js b/includes/js/dojox/dtl/tests/text/tag.js new file mode 100644 index 0000000..7abbc43 --- /dev/null +++ b/includes/js/dojox/dtl/tests/text/tag.js @@ -0,0 +1,480 @@ +if(!dojo._hasResource["dojox.dtl.tests.text.tag"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.tests.text.tag"] = true; +dojo.provide("dojox.dtl.tests.text.tag"); + +dojo.require("dojox.dtl"); +dojo.require("dojox.dtl.Context"); + +doh.register("dojox.dtl.text.tag", + [ + function test_tag_block_and_extends(t){ + var dd = dojox.dtl; + + // Simple (messy) string-based extension + var template = new dd.Template('{% extends "../../dojox/dtl/tests/templates/pocket.html" %}{% block pocket %}Simple{% endblock %}'); + t.is("Simple Pocket", template.render()); + + // Variable replacement + var context = new dd.Context({ + parent: "../../dojox/dtl/tests/templates/pocket.html" + }) + template = new dd.Template('{% extends parent %}{% block pocket %}Variabled{% endblock %}'); + t.is("Variabled Pocket", template.render(context)); + + // Nicer dojo.moduleUrl and variable based extension + context.parent = dojo.moduleUrl("dojox.dtl.tests.templates", "pocket.html"); + template = new dd.Template('{% extends parent %}{% block pocket %}Slightly More Advanced{% endblock %}'); + t.is("Slightly More Advanced Pocket", template.render(context)); + + // dojo.moduleUrl with support for more variables. + // This is important for HTML templates where the "shared" flag will be important. + context.parent = { + url: dojo.moduleUrl("dojox.dtl.tests.templates", "pocket.html") + } + template = new dd.Template('{% extends parent %}{% block pocket %}Super{% endblock %}'); + t.is("Super Pocket", template.render(context)); + }, + function test_tag_block(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + parent: dojo.moduleUrl("dojox.dtl.tests.templates", "pocket2.html"), + items: ["apple", "banana", "lemon" ] + }); + + var template = new dd.Template("{% extends parent %}{% block pocket %}My {{ item }}{% endblock %}"); + t.is("(My apple) (My banana) (My lemon) Pocket", template.render(context)); + }, + function test_tag_comment(t){ + var dd = dojox.dtl; + + var template = new dd.Template('Hot{% comment %}Make me disappear{% endcomment %} Pocket'); + t.is("Hot Pocket", template.render()); + + var found = false; + try{ + template = new dd.Template('Hot{% comment %}Make me disappear Pocket'); + }catch(e){ + t.is("Unclosed tag found when looking for endcomment", e.message); + found = true; + } + t.t(found); + }, + function test_tag_cycle(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + items: ["apple", "banana", "lemon"], + unplugged: "Torrey" + }); + var template = new dd.Template("{% for item in items %}{% cycle 'Hot' 'Diarrhea' unplugged 'Extra' %} Pocket. {% endfor %}"); + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. ", template.render(context)); + // Make sure that it doesn't break on re-render + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. ", template.render(context)); + + // Test repeating the loop + context.items.push("guava", "mango", "pineapple"); + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. Extra Pocket. Hot Pocket. Diarrhea Pocket. ", template.render(context)); + + // Repeat the above tests for the old style + // ======================================== + context.items = context.items.slice(0, 3); + template = new dd.Template("{% for item in items %}{% cycle Hot,Diarrhea,Torrey,Extra %} Pocket. {% endfor %}"); + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. ", template.render(context)); + // Make sure that it doesn't break on re-render + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. ", template.render(context)); + + // Test repeating the loop + context.items.push("guava", "mango", "pineapple"); + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. Extra Pocket. Hot Pocket. Diarrhea Pocket. ", template.render(context)); + + // Now test outside of the for loop + // ================================ + context = new dojox.dtl.Context({ unplugged: "Torrey" }); + template = new dd.Template("{% cycle 'Hot' 'Diarrhea' unplugged 'Extra' as steakum %} Pocket. {% cycle steakum %} Pocket. {% cycle steakum %} Pocket."); + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket.", template.render(context)); + + template = new dd.Template("{% cycle 'Hot' 'Diarrhea' unplugged 'Extra' as steakum %} Pocket. {% cycle steakum %} Pocket. {% cycle steakum %} Pocket. {% cycle steakum %} Pocket. {% cycle steakum %} Pocket. {% cycle steakum %} Pocket."); + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. Extra Pocket. Hot Pocket. Diarrhea Pocket.", template.render(context)); +//t.t(false) + // Test for nested objects + context.items = { + list: ["apple", "banana", "lemon"] + }; + template = new dd.Template("{% for item in items.list %}{% cycle 'Hot' 'Diarrhea' unplugged 'Extra' %} Pocket. {% endfor %}"); + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. ", template.render(context)); + // Make sure that it doesn't break on re-render + t.is("Hot Pocket. Diarrhea Pocket. Torrey Pocket. ", template.render(context)); + }, + function test_tag_debug(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + items: ["apple", "banana", "lemon"], + unplugged: "Torrey" + }); + var template = new dd.Template("{% debug %}"); + t.is('items: ["apple","banana","lemon"]\n\nunplugged: "Torrey"\n\n', template.render(context)); + }, + function test_tag_filter(t){ + var dd = dojox.dtl; + + var template = new dd.Template('{% filter lower|center:"15" %}Hot Pocket{% endfilter %}'); + t.is(" hot pocket ", template.render()); + }, + function test_tag_firstof(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + found: "unicorn" + }); + + var template = new dd.Template("{% firstof one two three four found %}"); + t.is("unicorn", template.render(context)); + + context.four = null; + t.is("null", template.render(context)); + + context.three = false; + t.is("false", template.render(context)); + }, + function test_tag_for(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + items: ["apple", "banana", "lemon"] + }); + var template = new dd.Template("{% for item in items %}
  • {{ item }}
  • {% endfor %}"); + t.is("
  • apple
  • banana
  • lemon
  • ", template.render(context)); + + template = new dd.Template("{% for item in items reversed %}
  • {{ item }}
  • {% endfor %}"); + t.is("
  • lemon
  • banana
  • apple
  • ", template.render(context)); + + context.items = { + apple: "Red Delicious", + banana: "Cavendish", + lemon: "Citrus" + }; + template = new dd.Template("{% for key, value in items.items %}
  • {{ value }} {{ key|title }}
  • {% endfor %}"); + t.is("
  • Red Delicious Apple
  • Cavendish Banana
  • Citrus Lemon
  • ", template.render(context)); + + // The same thing above, but using "zipped" sets + context.items = [ + ["apple", "Red Delicious", 1.99], + ["banana", "Cavendish", 0.49], + ["lemon", "Citrus", 0.29] + ]; + template = new dd.Template("{% for fruit, type, price in items %}
  • {{ type }} {{ fruit|title }} costs ${{ price}}
  • {% endfor %}"); + t.is("
  • Red Delicious Apple costs $1.99
  • Cavendish Banana costs $0.49
  • Citrus Lemon costs $0.29
  • ", template.render(context)); + + template = new dd.Template("{% for fruit, type, price in items reversed %}
  • {{ type }} {{ fruit|title }} costs ${{ price}}
  • {% endfor %}"); + t.is("
  • Citrus Lemon costs $0.29
  • Cavendish Banana costs $0.49
  • Red Delicious Apple costs $1.99
  • ", template.render(context)); + + // Now to create some errors + var found = false; + try { + template = new dd.Template("{% for item initems %}
  • {{ item }}
  • {% endfor %}"); + }catch(e){ + found = true; + t.is("'for' statements should have at least four words: for item initems", e.message); + } + t.t(found); + + found = false; + try { + template = new dd.Template("{% for item ni items %}
  • {{ item }}
  • {% endfor %}"); + }catch(e){ + found = true; + t.is("'for' tag received an invalid argument: for item ni items", e.message); + } + t.t(found); + + found = false; + try { + template = new dd.Template("{% for my item in items %}
  • {{ item }}
  • {% endfor %}"); + }catch(e){ + found = true; + t.is("'for' tag received an invalid argument: for my item in items", e.message); + } + t.t(found); + }, + function test_tag_if(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + jokes: { + hot_pockets: true, + unicycles: true, + bacon: true + } + }); + var template = new dd.Template("Comedian is {% if jokes.hot_pockets and jokes.unicycles and jokes.bacon %}funny{% else %}not funny{% endif %}"); + t.is("Comedian is funny", template.render(context)); + + context.jokes.unicycles = false; + t.is("Comedian is not funny", template.render(context)); + + context.comedians = { + hedberg: true, + gaffigan: true, + cook: true + }; + template = new dd.Template("Show will be {% if comedians.hedberg or comedians.gaffigan %}worth seeing{% else %}not worth seeing{% endif %}"); + t.is("Show will be worth seeing", template.render(context)); + + // NOTE: "and" is implied by nesting. eg {% if sunny %}{% if windy %}It's Sunny and Windy{% endif %}{% endif %} + // Not mixing ands and ors allows for MUCH faster rendering + template = new dd.Template("Show will {% if comedians.hedberg or comedians.gaffigan %}{% if comedians.cook %}not {% endif %}be worth seeing{% else %}not be worth seeing{% endif %}"); + t.is("Show will not be worth seeing", template.render(context)); + + context.comedians.cook = false; + t.is("Show will be worth seeing", template.render(context)); + + template = new dd.Template("Show will be {% if comedians.hedberg and comedians.gaffigan and not comedians.cook %}AWESOME{% else %}almost awesome{% endif %}"); + t.is("Show will be AWESOME", template.render(context)); + + context.comedians.cook = true; + t.is("Show will be almost awesome", template.render(context)); + + // Now we test for errors. + var found = false; + try { + template = new dd.Template("Show will be {% if comedians.hedberg or comedians.gaffigan and not comedians.cook %}worth seeing{% else %}not worth seeing{% endif %}"); + }catch(e){ + found = true; + t.is("'if' tags can't mix 'and' and 'or'", e.message); + } + t.t(found); + }, + function test_tag_ifchanged(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + year: 2008, + days: [ + new Date(2008, 0, 12), + new Date(2008, 0, 28), + new Date(2008, 1, 1), + new Date(2008, 1, 1), + new Date(2008, 1, 1) + ] + }); + + var template = new dd.Template("

    Archive for {{ year }}

    "+ +"{% for date in days %}"+ +'{% ifchanged %}

    {{ date|date:"F" }}

    {% endifchanged %}'+ +'{{ date|date:\'j\' }}'+ +"{% endfor %}"); + t.is('

    Archive for 2008

    '+ +'

    January

    '+ +'12'+ +'28'+ +'

    February

    '+ +'1'+ +'1'+ +'1', template.render(context)); + + template = new dd.Template('{% for date in days %}'+ +'{% ifchanged date.date %} {{ date.date }} {% endifchanged %}'+ +'{% ifchanged date.hour date.date %}'+ +'{{ date.hour }}'+ +'{% endifchanged %}'+ +'{% endfor %}'); + t.is(' 2008-01-12 0 2008-01-28 0 2008-02-01 0', template.render(context)); + }, + function test_tag_ifequal(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + user: { + id: 314 + }, + comment: { + user_id: 314 + } + }); + + var template = new dd.Template("{% ifequal user.id comment.user_id %}You posted this{% endifequal %}"); + t.is("You posted this", template.render(context)); + + context.user.id = 313; + t.is("", template.render(context)); + + // Errors + var found = false; + try { + template = new dd.Template("{% ifequal user.id %}You posted this{% endifequal %}"); + }catch(e){ + found = true; + t.is("ifequal takes two arguments", e.message); + } + t.t(found); + + found = false; + try { + template = new dd.Template("{% ifequal user.id comment.user_id %}You posted this{% endif %}"); + }catch(e){ + found = true; + t.is("No tag found for endif", e.message); + } + t.t(found); + }, + function test_tag_ifnotequal(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + favorite: "hedberg", + comedian: "cook" + }); + + var template = new dd.Template("{% ifnotequal favorite comedian %}Not your favorite{% else %}Your favorite{% endifnotequal %}"); + t.is("Not your favorite", template.render(context)); + + context.comedian = "hedberg"; + t.is("Your favorite", template.render(context)); + }, + function test_tag_include(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + hello: dojo.moduleUrl("dojox.dtl.tests.templates", "hello.html"), + person: "Bob", + people: ["Charles", "Ralph", "Julia"] + }); + + var template = new dd.Template("{% include hello %}"); + t.is("Hello, Bob", template.render(context)); + + template = new dd.Template('{% include "../../dojox/dtl/tests/templates/hello.html" %}'); + t.is("Hello, Bob", template.render(context)); + + template = new dd.Template('{% for person in people %}{% include hello %} {% endfor %}'); + t.is("Hello, Charles Hello, Ralph Hello, Julia ", template.render(context)); + }, + function test_tag_load(t){ + t.f(dojox.dtl.tests.text.load); + new dojox.dtl.Template("{% load dojox.dtl.tests.text.load %}"); + t.t(dojox.dtl.tests.text.load); + }, + function test_tag_now(t){ + var dd = dojox.dtl; + + var template = new dd.Template('It is {% now "jS F Y H:i" %}'); + t.t(template.render().match(/^It is \d{1,2}[a-z]{2} [A-Z][a-z]+ [0-9]{4,} \d{2}:\d{2}$/)); + + template = new dd.Template('It is the {% now "jS \\o\\f F" %}'); + t.t(template.render().match(/^It is the \d{1,2}[a-z]{2} of [A-Z][a-z]+$/)); + + template = new dd.Template("It is the {% now 'jS \\o\\f F' %}"); + t.t(template.render().match(/^It is the \d{1,2}[a-z]{2} of [A-Z][a-z]+$/)); + + var found = false; + try{ + template = new dd.Template("It is the {% now 'jS \\o\\f F %}"); + }catch(e){ + found = true; + t.is("'now' statement takes one argument", e.message); + } + t.t(found); + + found = false; + try{ + template = new dd.Template('It is the {% now "jS \\o\\f F %}'); + }catch(e){ + found = true; + t.is("'now' statement takes one argument", e.message); + } + t.t(found); + }, + function test_tag_regroup(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + people: [ + { firstName: "Bill", lastName: "Clinton", gender: "Male" }, + { firstName: "Margaret", lastName: "Thatcher", gender: "Female" }, + { firstName: "Path", lastName: "Smith", gender: "Unkown" }, + { firstName: "Condoleezza", lastName: "Rice", gender: "Female" }, + { firstName: "George", lastName: "Bush", gender: "Male" } + ] + }); + + var template = new dd.Template("{% regroup people|dictsort:'gender' by gender as grouped %}"); + t.t(template.render(context).match(new RegExp("^$"))); + }, + function test_tag_spaceless(t){ + var dd = dojox.dtl; + + var template = new dd.Template("{% spaceless %}{% endspaceless %}"); + t.is("", template.render()); + }, + function test_tag_ssi(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + hello: dojo.moduleUrl("dojox.dtl.tests.templates", "hello.html"), + person: "Bob", + people: ["Charles", "Ralph", "Julia"] + }); + + var template = new dd.Template("{% ssi hello parsed %}"); + t.is("Hello, Bob", template.render(context)); + + template = new dd.Template("{% ssi hello %}"); + t.is("Hello, {{ person }}", template.render(context)); + + template = new dd.Template('{% ssi "../../dojox/dtl/tests/templates/hello.html" parsed %}'); + t.is("Hello, Bob", template.render(context)); + + template = new dd.Template('{% for person in people %}{% ssi hello parsed %} {% endfor %}'); + t.is("Hello, Charles Hello, Ralph Hello, Julia ", template.render(context)); + }, + function test_tag_templatetag(t){ + var dd = dojox.dtl; + + var template = new dd.Template("{% templatetag openblock %}"); + t.is("{%", template.render()); + template = new dd.Template("{% templatetag closeblock %}"); + t.is("%}", template.render()); + template = new dd.Template("{% templatetag openvariable %}"); + t.is("{{", template.render()); + template = new dd.Template("{% templatetag closevariable %}"); + t.is("}}", template.render()); + template = new dd.Template("{% templatetag openbrace %}"); + t.is("{", template.render()); + template = new dd.Template("{% templatetag closebrace %}"); + t.is("}", template.render()); + template = new dd.Template("{% templatetag opencomment %}"); + t.is("{#", template.render()); + template = new dd.Template("{% templatetag closecomment %}"); + t.is("#}", template.render()); + }, + function test_tag_widthratio(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + this_value: 175, + max_value: 200 + }); + + var template = new dd.Template(''); + t.is('', template.render(context)); + }, + function test_tag_with(t){ + var dd = dojox.dtl; + + var context = new dd.Context({ + person: { + someSqlMethod: function(){ + return 4815162342; + } + } + }); + + var template = new dd.Template('{% with person.someSqlMethod as total %}{{ total }} object{{ total|pluralize }}{% endwith %}') + t.is("4815162342 objects", template.render(context)); + } + ] +); + +} -- cgit v1.2.3-54-g00ecf