aboutsummaryrefslogtreecommitdiffhomepage
path: root/vendor/twig/twig/test/Twig/Tests
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/twig/twig/test/Twig/Tests')
-rw-r--r--vendor/twig/twig/test/Twig/Tests/AutoloaderTest.php21
-rw-r--r--vendor/twig/twig/test/Twig/Tests/CompilerTest.php33
-rw-r--r--vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php288
-rw-r--r--vendor/twig/twig/test/Twig/Tests/ErrorTest.php159
-rw-r--r--vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php332
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Extension/CoreTest.php117
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Extension/SandboxTest.php212
-rw-r--r--vendor/twig/twig/test/Twig/Tests/FileCachingTest.php70
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/errors/base.html1
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/errors/index.html7
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/unclosed_tag.test20
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array.test61
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array_call.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/binary.test46
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/bitwise.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/comparison.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/dotdot.test20
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/grouping.test8
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/literals.test22
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/magic_call.test27
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/method_call.test28
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/postfix.test22
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/strings.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator.test18
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_noelse.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_nothen.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_precedence.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/abs.test30
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch.test31
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_float.php31
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_empty_fill.test37
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_fill.test37
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/convert_encoding.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date.test76
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format_interval.test16
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_interval.test19
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_modify.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_namedargs.test13
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/default.test150
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/dynamic_filter.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape.test8
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_non_supported_charset.test8
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/first.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/force_escape.test18
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/format.test8
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/join.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/json_encode.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/last.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length_utf8.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/merge.test16
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/nl2br.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format.test18
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format_default.test21
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace.test8
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reverse.test18
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/slice.test42
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/sort.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/special_chars.test8
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split.test18
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/trim.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/attribute.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/constant.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/cycle.test16
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date.test27
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date_namedargs.test11
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump.test16
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump_array.test19
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dynamic_function.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/assignment.test13
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/autoescaping.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/basic.test17
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/expression.test17
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing.test8
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing_nested.test16
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/template_instance.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/templates_as_array.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_context.test16
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_variables.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/range.test8
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/special_chars.test8
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/functions/template_from_string.test11
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/macros/default_values.test16
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/macros/nested_calls.test18
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/macros/reserved_variables.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/macros/simple.test22
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/macros/with_filters.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/regression/empty_token.test8
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/regression/simple_xml_element.test17
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/regression/strings_like_numbers.test8
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/basic.test26
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/blocks.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/double_escaping.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/functions.test83
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/literal.test45
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/nested.test26
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/objects.test26
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/raw.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.test17
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/type.test69
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters.test131
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters_arguments.test23
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_pre_escape_filters.test68
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_preserves_safety_filters.test50
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/basic.test11
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/block_unique_name.test11
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/special_chars.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/basic.test35
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/error_line.test16
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/multiple.test50
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/nested.test42
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/with_extends.test57
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/basic.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/json_encode.test8
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/multiple.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/nested.test16
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_for_tag.test13
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_if_tag.test29
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/context.test18
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/else.test23
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/inner_variables.test17
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys.test11
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys_and_values.test11
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context.test19
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context_local.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined_cond.test9
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/nested_else.test17
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects.test43
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects_countable.test47
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/recursive.test18
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/values.test11
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/from.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/basic.test22
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/expression.test22
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/basic.test16
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/expression.test16
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/ignore_missing.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing.test8
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing_nested.test16
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/only.test16
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/template_instance.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/templates_as_array.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/with_variables.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/basic.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/conditional.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/dynamic.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/empty.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks.test22
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks_parent_only.test15
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_inheritance.test16
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_change.test16
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_in_a_block.test8
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_isolation.test20
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_nested.test28
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends.test8
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends_but_traits.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/template_instance.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/use.test44
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/basic.test17
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/endmacro_name.test16
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/external.test17
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from.test18
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/global.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/self_import.test17
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/special_chars.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/basic.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/mixed_usage_with_raw.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/whitespace_control.test56
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid1.test11
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid2.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/simple.test22
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/basic.test20
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture-empty.test9
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/expression.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/spaceless/simple.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/special_chars.test8
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/trim_block.test74
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/aliases.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/basic.test12
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep.test22
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep_empty.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple.test21
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple_aliases.test23
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/basic.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/mixed_usage_with_raw.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/whitespace_control.test56
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tests/array.test24
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tests/constant.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined.test108
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tests/empty.test45
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tests/even.test14
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in.test48
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in_with_objects.test19
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tests/iterable.test19
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Fixtures/tests/odd.test10
-rw-r--r--vendor/twig/twig/test/Twig/Tests/IntegrationTest.php217
-rw-r--r--vendor/twig/twig/test/Twig/Tests/LexerTest.php301
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Loader/ArrayTest.php97
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Loader/ChainTest.php79
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Loader/FilesystemTest.php97
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named/index.html1
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_bis/index.html1
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_final/index.html1
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_ter/index.html1
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal/index.html1
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_bis/index.html1
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_final/index.html1
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_ter/index.html1
-rw-r--r--vendor/twig/twig/test/Twig/Tests/NativeExtensionTest.php29
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/AutoEscapeTest.php44
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/BlockReferenceTest.php43
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/BlockTest.php51
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/DoTest.php44
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/ArrayTest.php49
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/AssignNameTest.php41
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AddTest.php47
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AndTest.php47
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ConcatTest.php47
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/DivTest.php47
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/FloorDivTest.php47
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ModTest.php47
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/MulTest.php47
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/OrTest.php47
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/SubTest.php47
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/CallTest.php67
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/ConditionalTest.php50
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/ConstantTest.php42
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/FilterTest.php133
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/FunctionTest.php99
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/GetAttrTest.php62
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/NameTest.php49
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FilterInclude.php6
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FunctionInclude.php6
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/TestInclude.php6
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/ParentTest.php40
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/TestTest.php68
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NegTest.php44
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NotTest.php44
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/PosTest.php44
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/ForTest.php203
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/IfTest.php100
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/ImportTest.php52
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/IncludeTest.php96
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/MacroTest.php73
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/ModuleTest.php196
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/PrintTest.php41
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/SandboxTest.php56
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/SandboxedModuleTest.php173
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/SandboxedPrintTest.php45
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/SetTest.php81
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/SpacelessTest.php49
-rw-r--r--vendor/twig/twig/test/Twig/Tests/Node/TextTest.php40
-rw-r--r--vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php114
-rw-r--r--vendor/twig/twig/test/Twig/Tests/ParserTest.php180
-rw-r--r--vendor/twig/twig/test/Twig/Tests/TemplateTest.php626
-rw-r--r--vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php70
-rw-r--r--vendor/twig/twig/test/Twig/Tests/escapingTest.php320
269 files changed, 10158 insertions, 0 deletions
diff --git a/vendor/twig/twig/test/Twig/Tests/AutoloaderTest.php b/vendor/twig/twig/test/Twig/Tests/AutoloaderTest.php
new file mode 100644
index 00000000..c8b7999a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/AutoloaderTest.php
@@ -0,0 +1,21 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_AutoloaderTest extends PHPUnit_Framework_TestCase
13{
14 public function testAutoload()
15 {
16 $this->assertFalse(class_exists('FooBarFoo'), '->autoload() does not try to load classes that does not begin with Twig');
17
18 $autoloader = new Twig_Autoloader();
19 $this->assertNull($autoloader->autoload('Foo'), '->autoload() returns false if it is not able to load a class');
20 }
21}
diff --git a/vendor/twig/twig/test/Twig/Tests/CompilerTest.php b/vendor/twig/twig/test/Twig/Tests/CompilerTest.php
new file mode 100644
index 00000000..ebe79aef
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/CompilerTest.php
@@ -0,0 +1,33 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_CompilerTest extends PHPUnit_Framework_TestCase
13{
14 public function testReprNumericValueWithLocale()
15 {
16 $compiler = new Twig_Compiler(new Twig_Environment());
17
18 $locale = setlocale(LC_NUMERIC, 0);
19 if (false === $locale) {
20 $this->markTestSkipped('Your platform does not support locales.');
21 }
22
23 $required_locales = array('fr_FR.UTF-8', 'fr_FR.UTF8', 'fr_FR.utf-8', 'fr_FR.utf8', 'French_France.1252');
24 if (false === setlocale(LC_ALL, $required_locales)) {
25 $this->markTestSkipped('Could not set any of required locales: ' . implode(", ", $required_locales));
26 }
27
28 $this->assertEquals('1.2', $compiler->repr(1.2)->getSource());
29 $this->assertContains('fr', strtolower(setlocale(LC_NUMERIC, 0)));
30
31 setlocale(LC_ALL, $locale);
32 }
33}
diff --git a/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php b/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php
new file mode 100644
index 00000000..22461b5d
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php
@@ -0,0 +1,288 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_EnvironmentTest extends PHPUnit_Framework_TestCase
13{
14 /**
15 * @expectedException LogicException
16 * @expectedExceptionMessage You must set a loader first.
17 */
18 public function testRenderNoLoader()
19 {
20 $env = new Twig_Environment();
21 $env->render('test');
22 }
23
24 public function testAutoescapeOption()
25 {
26 $loader = new Twig_Loader_Array(array(
27 'html' => '{{ foo }} {{ foo }}',
28 'js' => '{{ bar }} {{ bar }}',
29 ));
30
31 $twig = new Twig_Environment($loader, array(
32 'debug' => true,
33 'cache' => false,
34 'autoescape' => array($this, 'escapingStrategyCallback'),
35 ));
36
37 $this->assertEquals('foo&lt;br/ &gt; foo&lt;br/ &gt;', $twig->render('html', array('foo' => 'foo<br/ >')));
38 $this->assertEquals('foo\x3Cbr\x2F\x20\x3E foo\x3Cbr\x2F\x20\x3E', $twig->render('js', array('bar' => 'foo<br/ >')));
39 }
40
41 public function escapingStrategyCallback($filename)
42 {
43 return $filename;
44 }
45
46 public function testGlobals()
47 {
48 // globals can be added after calling getGlobals
49 $twig = new Twig_Environment(new Twig_Loader_String());
50 $twig->addGlobal('foo', 'foo');
51 $globals = $twig->getGlobals();
52 $twig->addGlobal('foo', 'bar');
53 $globals = $twig->getGlobals();
54 $this->assertEquals('bar', $globals['foo']);
55
56 // globals can be modified after runtime init
57 $twig = new Twig_Environment(new Twig_Loader_String());
58 $twig->addGlobal('foo', 'foo');
59 $globals = $twig->getGlobals();
60 $twig->initRuntime();
61 $twig->addGlobal('foo', 'bar');
62 $globals = $twig->getGlobals();
63 $this->assertEquals('bar', $globals['foo']);
64
65 // globals can be modified after extensions init
66 $twig = new Twig_Environment(new Twig_Loader_String());
67 $twig->addGlobal('foo', 'foo');
68 $globals = $twig->getGlobals();
69 $twig->getFunctions();
70 $twig->addGlobal('foo', 'bar');
71 $globals = $twig->getGlobals();
72 $this->assertEquals('bar', $globals['foo']);
73
74 // globals can be modified after extensions and runtime init
75 $twig = new Twig_Environment(new Twig_Loader_String());
76 $twig->addGlobal('foo', 'foo');
77 $globals = $twig->getGlobals();
78 $twig->getFunctions();
79 $twig->initRuntime();
80 $twig->addGlobal('foo', 'bar');
81 $globals = $twig->getGlobals();
82 $this->assertEquals('bar', $globals['foo']);
83
84 $twig = new Twig_Environment(new Twig_Loader_String());
85 $twig->getGlobals();
86 $twig->addGlobal('foo', 'bar');
87 $template = $twig->loadTemplate('{{foo}}');
88 $this->assertEquals('bar', $template->render(array()));
89
90 /* to be uncomment in Twig 2.0
91 // globals cannot be added after runtime init
92 $twig = new Twig_Environment(new Twig_Loader_String());
93 $twig->addGlobal('foo', 'foo');
94 $globals = $twig->getGlobals();
95 $twig->initRuntime();
96 try {
97 $twig->addGlobal('bar', 'bar');
98 $this->fail();
99 } catch (LogicException $e) {
100 $this->assertFalse(array_key_exists('bar', $twig->getGlobals()));
101 }
102
103 // globals cannot be added after extensions init
104 $twig = new Twig_Environment(new Twig_Loader_String());
105 $twig->addGlobal('foo', 'foo');
106 $globals = $twig->getGlobals();
107 $twig->getFunctions();
108 try {
109 $twig->addGlobal('bar', 'bar');
110 $this->fail();
111 } catch (LogicException $e) {
112 $this->assertFalse(array_key_exists('bar', $twig->getGlobals()));
113 }
114
115 // globals cannot be added after extensions and runtime init
116 $twig = new Twig_Environment(new Twig_Loader_String());
117 $twig->addGlobal('foo', 'foo');
118 $globals = $twig->getGlobals();
119 $twig->getFunctions();
120 $twig->initRuntime();
121 try {
122 $twig->addGlobal('bar', 'bar');
123 $this->fail();
124 } catch (LogicException $e) {
125 $this->assertFalse(array_key_exists('bar', $twig->getGlobals()));
126 }
127
128 // test adding globals after initRuntime without call to getGlobals
129 $twig = new Twig_Environment(new Twig_Loader_String());
130 $twig->initRuntime();
131 try {
132 $twig->addGlobal('bar', 'bar');
133 $this->fail();
134 } catch (LogicException $e) {
135 $this->assertFalse(array_key_exists('bar', $twig->getGlobals()));
136 }
137 */
138 }
139
140 public function testExtensionsAreNotInitializedWhenRenderingACompiledTemplate()
141 {
142 $options = array('cache' => sys_get_temp_dir().'/twig', 'auto_reload' => false, 'debug' => false);
143
144 // force compilation
145 $twig = new Twig_Environment(new Twig_Loader_String(), $options);
146 $cache = $twig->getCacheFilename('{{ foo }}');
147 if (!is_dir(dirname($cache))) {
148 mkdir(dirname($cache), 0777, true);
149 }
150 file_put_contents($cache, $twig->compileSource('{{ foo }}', '{{ foo }}'));
151
152 // check that extensions won't be initialized when rendering a template that is already in the cache
153 $twig = $this
154 ->getMockBuilder('Twig_Environment')
155 ->setConstructorArgs(array(new Twig_Loader_String(), $options))
156 ->setMethods(array('initExtensions'))
157 ->getMock()
158 ;
159
160 $twig->expects($this->never())->method('initExtensions');
161
162 // render template
163 $output = $twig->render('{{ foo }}', array('foo' => 'bar'));
164 $this->assertEquals('bar', $output);
165
166 unlink($cache);
167 }
168
169 public function testAddExtension()
170 {
171 $twig = new Twig_Environment(new Twig_Loader_String());
172 $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension());
173
174 $this->assertArrayHasKey('test', $twig->getTags());
175 $this->assertArrayHasKey('foo_filter', $twig->getFilters());
176 $this->assertArrayHasKey('foo_function', $twig->getFunctions());
177 $this->assertArrayHasKey('foo_test', $twig->getTests());
178 $this->assertArrayHasKey('foo_unary', $twig->getUnaryOperators());
179 $this->assertArrayHasKey('foo_binary', $twig->getBinaryOperators());
180 $this->assertArrayHasKey('foo_global', $twig->getGlobals());
181 $visitors = $twig->getNodeVisitors();
182 $this->assertEquals('Twig_Tests_EnvironmentTest_NodeVisitor', get_class($visitors[2]));
183 }
184
185 public function testRemoveExtension()
186 {
187 $twig = new Twig_Environment(new Twig_Loader_String());
188 $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension());
189 $twig->removeExtension('environment_test');
190
191 $this->assertFalse(array_key_exists('test', $twig->getTags()));
192 $this->assertFalse(array_key_exists('foo_filter', $twig->getFilters()));
193 $this->assertFalse(array_key_exists('foo_function', $twig->getFunctions()));
194 $this->assertFalse(array_key_exists('foo_test', $twig->getTests()));
195 $this->assertFalse(array_key_exists('foo_unary', $twig->getUnaryOperators()));
196 $this->assertFalse(array_key_exists('foo_binary', $twig->getBinaryOperators()));
197 $this->assertFalse(array_key_exists('foo_global', $twig->getGlobals()));
198 $this->assertCount(2, $twig->getNodeVisitors());
199 }
200}
201
202class Twig_Tests_EnvironmentTest_Extension extends Twig_Extension
203{
204 public function getTokenParsers()
205 {
206 return array(
207 new Twig_Tests_EnvironmentTest_TokenParser(),
208 );
209 }
210
211 public function getNodeVisitors()
212 {
213 return array(
214 new Twig_Tests_EnvironmentTest_NodeVisitor(),
215 );
216 }
217
218 public function getFilters()
219 {
220 return array(
221 'foo_filter' => new Twig_Filter_Function('foo_filter'),
222 );
223 }
224
225 public function getTests()
226 {
227 return array(
228 'foo_test' => new Twig_Test_Function('foo_test'),
229 );
230 }
231
232 public function getFunctions()
233 {
234 return array(
235 'foo_function' => new Twig_Function_Function('foo_function'),
236 );
237 }
238
239 public function getOperators()
240 {
241 return array(
242 array('foo_unary' => array()),
243 array('foo_binary' => array()),
244 );
245 }
246
247 public function getGlobals()
248 {
249 return array(
250 'foo_global' => 'foo_global',
251 );
252 }
253
254 public function getName()
255 {
256 return 'environment_test';
257 }
258}
259
260class Twig_Tests_EnvironmentTest_TokenParser extends Twig_TokenParser
261{
262 public function parse(Twig_Token $token)
263 {
264 }
265
266 public function getTag()
267 {
268 return 'test';
269 }
270}
271
272class Twig_Tests_EnvironmentTest_NodeVisitor implements Twig_NodeVisitorInterface
273{
274 public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)
275 {
276 return $node;
277 }
278
279 public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env)
280 {
281 return $node;
282 }
283
284 public function getPriority()
285 {
286 return 0;
287 }
288}
diff --git a/vendor/twig/twig/test/Twig/Tests/ErrorTest.php b/vendor/twig/twig/test/Twig/Tests/ErrorTest.php
new file mode 100644
index 00000000..9b286974
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/ErrorTest.php
@@ -0,0 +1,159 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_ErrorTest extends PHPUnit_Framework_TestCase
13{
14 public function testErrorWithObjectFilename()
15 {
16 $error = new Twig_Error('foo');
17 $error->setTemplateFile(new SplFileInfo(__FILE__));
18
19 $this->assertContains('test'.DIRECTORY_SEPARATOR.'Twig'.DIRECTORY_SEPARATOR.'Tests'.DIRECTORY_SEPARATOR.'ErrorTest.php', $error->getMessage());
20 }
21
22 public function testErrorWithArrayFilename()
23 {
24 $error = new Twig_Error('foo');
25 $error->setTemplateFile(array('foo' => 'bar'));
26
27 $this->assertEquals('foo in {"foo":"bar"}', $error->getMessage());
28 }
29
30 public function testTwigExceptionAddsFileAndLineWhenMissing()
31 {
32 $loader = new Twig_Loader_Array(array('index' => "\n\n{{ foo.bar }}\n\n\n{{ 'foo' }}"));
33 $twig = new Twig_Environment($loader, array('strict_variables' => true, 'debug' => true, 'cache' => false));
34
35 $template = $twig->loadTemplate('index');
36
37 try {
38 $template->render(array());
39
40 $this->fail();
41 } catch (Twig_Error_Runtime $e) {
42 $this->assertEquals('Variable "foo" does not exist in "index" at line 3', $e->getMessage());
43 $this->assertEquals(3, $e->getTemplateLine());
44 $this->assertEquals('index', $e->getTemplateFile());
45 }
46 }
47
48 public function testRenderWrapsExceptions()
49 {
50 $loader = new Twig_Loader_Array(array('index' => "\n\n\n{{ foo.bar }}\n\n\n\n{{ 'foo' }}"));
51 $twig = new Twig_Environment($loader, array('strict_variables' => true, 'debug' => true, 'cache' => false));
52
53 $template = $twig->loadTemplate('index');
54
55 try {
56 $template->render(array('foo' => new Twig_Tests_ErrorTest_Foo()));
57
58 $this->fail();
59 } catch (Twig_Error_Runtime $e) {
60 $this->assertEquals('An exception has been thrown during the rendering of a template ("Runtime error...") in "index" at line 4.', $e->getMessage());
61 $this->assertEquals(4, $e->getTemplateLine());
62 $this->assertEquals('index', $e->getTemplateFile());
63 }
64 }
65
66 public function testTwigExceptionAddsFileAndLineWhenMissingWithInheritance()
67 {
68 $loader = new Twig_Loader_Array(array(
69 'index' => "{% extends 'base' %}
70 {% block content %}
71 {{ foo.bar }}
72 {% endblock %}
73 {% block foo %}
74 {{ foo.bar }}
75 {% endblock %}",
76 'base' => '{% block content %}{% endblock %}'
77 ));
78 $twig = new Twig_Environment($loader, array('strict_variables' => true, 'debug' => true, 'cache' => false));
79
80 $template = $twig->loadTemplate('index');
81 try {
82 $template->render(array());
83
84 $this->fail();
85 } catch (Twig_Error_Runtime $e) {
86 $this->assertEquals('Variable "foo" does not exist in "index" at line 3', $e->getMessage());
87 $this->assertEquals(3, $e->getTemplateLine());
88 $this->assertEquals('index', $e->getTemplateFile());
89 }
90
91 try {
92 $template->render(array('foo' => new Twig_Tests_ErrorTest_Foo()));
93
94 $this->fail();
95 } catch (Twig_Error_Runtime $e) {
96 $this->assertEquals('An exception has been thrown during the rendering of a template ("Runtime error...") in "index" at line 3.', $e->getMessage());
97 $this->assertEquals(3, $e->getTemplateLine());
98 $this->assertEquals('index', $e->getTemplateFile());
99 }
100 }
101
102 public function testTwigExceptionAddsFileAndLineWhenMissingWithInheritanceAgain()
103 {
104 $loader = new Twig_Loader_Array(array(
105 'index' => "{% extends 'base' %}
106 {% block content %}
107 {{ parent() }}
108 {% endblock %}",
109 'base' => '{% block content %}{{ foo }}{% endblock %}'
110 ));
111 $twig = new Twig_Environment($loader, array('strict_variables' => true, 'debug' => true, 'cache' => false));
112
113 $template = $twig->loadTemplate('index');
114 try {
115 $template->render(array());
116
117 $this->fail();
118 } catch (Twig_Error_Runtime $e) {
119 $this->assertEquals('Variable "foo" does not exist in "base" at line 1', $e->getMessage());
120 $this->assertEquals(1, $e->getTemplateLine());
121 $this->assertEquals('base', $e->getTemplateFile());
122 }
123 }
124
125 public function testTwigExceptionAddsFileAndLineWhenMissingWithInheritanceOnDisk()
126 {
127 $loader = new Twig_Loader_Filesystem(dirname(__FILE__).'/Fixtures/errors');
128 $twig = new Twig_Environment($loader, array('strict_variables' => true, 'debug' => true, 'cache' => false));
129
130 $template = $twig->loadTemplate('index.html');
131 try {
132 $template->render(array());
133
134 $this->fail();
135 } catch (Twig_Error_Runtime $e) {
136 $this->assertEquals('Variable "foo" does not exist in "index.html" at line 3', $e->getMessage());
137 $this->assertEquals(3, $e->getTemplateLine());
138 $this->assertEquals('index.html', $e->getTemplateFile());
139 }
140
141 try {
142 $template->render(array('foo' => new Twig_Tests_ErrorTest_Foo()));
143
144 $this->fail();
145 } catch (Twig_Error_Runtime $e) {
146 $this->assertEquals('An exception has been thrown during the rendering of a template ("Runtime error...") in "index.html" at line 3.', $e->getMessage());
147 $this->assertEquals(3, $e->getTemplateLine());
148 $this->assertEquals('index.html', $e->getTemplateFile());
149 }
150 }
151}
152
153class Twig_Tests_ErrorTest_Foo
154{
155 public function bar()
156 {
157 throw new Exception('Runtime error...');
158 }
159}
diff --git a/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php b/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php
new file mode 100644
index 00000000..8ec6537a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php
@@ -0,0 +1,332 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_ExpressionParserTest extends PHPUnit_Framework_TestCase
13{
14 /**
15 * @expectedException Twig_Error_Syntax
16 * @dataProvider getFailingTestsForAssignment
17 */
18 public function testCanOnlyAssignToNames($template)
19 {
20 $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
21 $parser = new Twig_Parser($env);
22
23 $parser->parse($env->tokenize($template, 'index'));
24 }
25
26 public function getFailingTestsForAssignment()
27 {
28 return array(
29 array('{% set false = "foo" %}'),
30 array('{% set true = "foo" %}'),
31 array('{% set none = "foo" %}'),
32 array('{% set 3 = "foo" %}'),
33 array('{% set 1 + 2 = "foo" %}'),
34 array('{% set "bar" = "foo" %}'),
35 array('{% set %}{% endset %}')
36 );
37 }
38
39 /**
40 * @dataProvider getTestsForArray
41 */
42 public function testArrayExpression($template, $expected)
43 {
44 $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
45 $stream = $env->tokenize($template, 'index');
46 $parser = new Twig_Parser($env);
47
48 $this->assertEquals($expected, $parser->parse($stream)->getNode('body')->getNode(0)->getNode('expr'));
49 }
50
51 /**
52 * @expectedException Twig_Error_Syntax
53 * @dataProvider getFailingTestsForArray
54 */
55 public function testArraySyntaxError($template)
56 {
57 $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
58 $parser = new Twig_Parser($env);
59
60 $parser->parse($env->tokenize($template, 'index'));
61 }
62
63 public function getFailingTestsForArray()
64 {
65 return array(
66 array('{{ [1, "a": "b"] }}'),
67 array('{{ {"a": "b", 2} }}'),
68 );
69 }
70
71 public function getTestsForArray()
72 {
73 return array(
74 // simple array
75 array('{{ [1, 2] }}', new Twig_Node_Expression_Array(array(
76 new Twig_Node_Expression_Constant(0, 1),
77 new Twig_Node_Expression_Constant(1, 1),
78
79 new Twig_Node_Expression_Constant(1, 1),
80 new Twig_Node_Expression_Constant(2, 1),
81 ), 1),
82 ),
83
84 // array with trailing ,
85 array('{{ [1, 2, ] }}', new Twig_Node_Expression_Array(array(
86 new Twig_Node_Expression_Constant(0, 1),
87 new Twig_Node_Expression_Constant(1, 1),
88
89 new Twig_Node_Expression_Constant(1, 1),
90 new Twig_Node_Expression_Constant(2, 1),
91 ), 1),
92 ),
93
94 // simple hash
95 array('{{ {"a": "b", "b": "c"} }}', new Twig_Node_Expression_Array(array(
96 new Twig_Node_Expression_Constant('a', 1),
97 new Twig_Node_Expression_Constant('b', 1),
98
99 new Twig_Node_Expression_Constant('b', 1),
100 new Twig_Node_Expression_Constant('c', 1),
101 ), 1),
102 ),
103
104 // hash with trailing ,
105 array('{{ {"a": "b", "b": "c", } }}', new Twig_Node_Expression_Array(array(
106 new Twig_Node_Expression_Constant('a', 1),
107 new Twig_Node_Expression_Constant('b', 1),
108
109 new Twig_Node_Expression_Constant('b', 1),
110 new Twig_Node_Expression_Constant('c', 1),
111 ), 1),
112 ),
113
114 // hash in an array
115 array('{{ [1, {"a": "b", "b": "c"}] }}', new Twig_Node_Expression_Array(array(
116 new Twig_Node_Expression_Constant(0, 1),
117 new Twig_Node_Expression_Constant(1, 1),
118
119 new Twig_Node_Expression_Constant(1, 1),
120 new Twig_Node_Expression_Array(array(
121 new Twig_Node_Expression_Constant('a', 1),
122 new Twig_Node_Expression_Constant('b', 1),
123
124 new Twig_Node_Expression_Constant('b', 1),
125 new Twig_Node_Expression_Constant('c', 1),
126 ), 1),
127 ), 1),
128 ),
129
130 // array in a hash
131 array('{{ {"a": [1, 2], "b": "c"} }}', new Twig_Node_Expression_Array(array(
132 new Twig_Node_Expression_Constant('a', 1),
133 new Twig_Node_Expression_Array(array(
134 new Twig_Node_Expression_Constant(0, 1),
135 new Twig_Node_Expression_Constant(1, 1),
136
137 new Twig_Node_Expression_Constant(1, 1),
138 new Twig_Node_Expression_Constant(2, 1),
139 ), 1),
140 new Twig_Node_Expression_Constant('b', 1),
141 new Twig_Node_Expression_Constant('c', 1),
142 ), 1),
143 ),
144 );
145 }
146
147 /**
148 * @expectedException Twig_Error_Syntax
149 */
150 public function testStringExpressionDoesNotConcatenateTwoConsecutiveStrings()
151 {
152 $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false, 'optimizations' => 0));
153 $stream = $env->tokenize('{{ "a" "b" }}', 'index');
154 $parser = new Twig_Parser($env);
155
156 $parser->parse($stream);
157 }
158
159 /**
160 * @dataProvider getTestsForString
161 */
162 public function testStringExpression($template, $expected)
163 {
164 $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false, 'optimizations' => 0));
165 $stream = $env->tokenize($template, 'index');
166 $parser = new Twig_Parser($env);
167
168 $this->assertEquals($expected, $parser->parse($stream)->getNode('body')->getNode(0)->getNode('expr'));
169 }
170
171 public function getTestsForString()
172 {
173 return array(
174 array(
175 '{{ "foo" }}', new Twig_Node_Expression_Constant('foo', 1),
176 ),
177 array(
178 '{{ "foo #{bar}" }}', new Twig_Node_Expression_Binary_Concat(
179 new Twig_Node_Expression_Constant('foo ', 1),
180 new Twig_Node_Expression_Name('bar', 1),
181 1
182 ),
183 ),
184 array(
185 '{{ "foo #{bar} baz" }}', new Twig_Node_Expression_Binary_Concat(
186 new Twig_Node_Expression_Binary_Concat(
187 new Twig_Node_Expression_Constant('foo ', 1),
188 new Twig_Node_Expression_Name('bar', 1),
189 1
190 ),
191 new Twig_Node_Expression_Constant(' baz', 1),
192 1
193 )
194 ),
195
196 array(
197 '{{ "foo #{"foo #{bar} baz"} baz" }}', new Twig_Node_Expression_Binary_Concat(
198 new Twig_Node_Expression_Binary_Concat(
199 new Twig_Node_Expression_Constant('foo ', 1),
200 new Twig_Node_Expression_Binary_Concat(
201 new Twig_Node_Expression_Binary_Concat(
202 new Twig_Node_Expression_Constant('foo ', 1),
203 new Twig_Node_Expression_Name('bar', 1),
204 1
205 ),
206 new Twig_Node_Expression_Constant(' baz', 1),
207 1
208 ),
209 1
210 ),
211 new Twig_Node_Expression_Constant(' baz', 1),
212 1
213 ),
214 ),
215 );
216 }
217
218 /**
219 * @expectedException Twig_Error_Syntax
220 */
221 public function testAttributeCallDoesNotSupportNamedArguments()
222 {
223 $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
224 $parser = new Twig_Parser($env);
225
226 $parser->parse($env->tokenize('{{ foo.bar(name="Foo") }}', 'index'));
227 }
228
229 /**
230 * @expectedException Twig_Error_Syntax
231 */
232 public function testMacroCallDoesNotSupportNamedArguments()
233 {
234 $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
235 $parser = new Twig_Parser($env);
236
237 $parser->parse($env->tokenize('{% from _self import foo %}{% macro foo() %}{% endmacro %}{{ foo(name="Foo") }}', 'index'));
238 }
239
240 /**
241 * @expectedException Twig_Error_Syntax
242 * @expectedExceptionMessage An argument must be a name. Unexpected token "string" of value "a" ("name" expected) in "index" at line 1
243 */
244 public function testMacroDefinitionDoesNotSupportNonNameVariableName()
245 {
246 $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
247 $parser = new Twig_Parser($env);
248
249 $parser->parse($env->tokenize('{% macro foo("a") %}{% endmacro %}', 'index'));
250 }
251
252 /**
253 * @expectedException Twig_Error_Syntax
254 * @expectedExceptionMessage A default value for an argument must be a constant (a boolean, a string, a number, or an array) in "index" at line 1
255 * @dataProvider getMacroDefinitionDoesNotSupportNonConstantDefaultValues
256 */
257 public function testMacroDefinitionDoesNotSupportNonConstantDefaultValues($template)
258 {
259 $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
260 $parser = new Twig_Parser($env);
261
262 $parser->parse($env->tokenize($template, 'index'));
263 }
264
265 public function getMacroDefinitionDoesNotSupportNonConstantDefaultValues()
266 {
267 return array(
268 array('{% macro foo(name = "a #{foo} a") %}{% endmacro %}'),
269 array('{% macro foo(name = [["b", "a #{foo} a"]]) %}{% endmacro %}'),
270 );
271 }
272
273 /**
274 * @dataProvider getMacroDefinitionSupportsConstantDefaultValues
275 */
276 public function testMacroDefinitionSupportsConstantDefaultValues($template)
277 {
278 $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
279 $parser = new Twig_Parser($env);
280
281 $parser->parse($env->tokenize($template, 'index'));
282 }
283
284 public function getMacroDefinitionSupportsConstantDefaultValues()
285 {
286 return array(
287 array('{% macro foo(name = "aa") %}{% endmacro %}'),
288 array('{% macro foo(name = 12) %}{% endmacro %}'),
289 array('{% macro foo(name = true) %}{% endmacro %}'),
290 array('{% macro foo(name = ["a"]) %}{% endmacro %}'),
291 array('{% macro foo(name = [["a"]]) %}{% endmacro %}'),
292 array('{% macro foo(name = {a: "a"}) %}{% endmacro %}'),
293 array('{% macro foo(name = {a: {b: "a"}}) %}{% endmacro %}'),
294 );
295 }
296
297 /**
298 * @expectedException Twig_Error_Syntax
299 * @expectedExceptionMessage The function "cycl" does not exist. Did you mean "cycle" in "index" at line 1
300 */
301 public function testUnknownFunction()
302 {
303 $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
304 $parser = new Twig_Parser($env);
305
306 $parser->parse($env->tokenize('{{ cycl() }}', 'index'));
307 }
308
309 /**
310 * @expectedException Twig_Error_Syntax
311 * @expectedExceptionMessage The filter "lowe" does not exist. Did you mean "lower" in "index" at line 1
312 */
313 public function testUnknownFilter()
314 {
315 $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
316 $parser = new Twig_Parser($env);
317
318 $parser->parse($env->tokenize('{{ 1|lowe }}', 'index'));
319 }
320
321 /**
322 * @expectedException Twig_Error_Syntax
323 * @expectedExceptionMessage The test "nul" does not exist. Did you mean "null" in "index" at line 1
324 */
325 public function testUnknownTest()
326 {
327 $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
328 $parser = new Twig_Parser($env);
329
330 $parser->parse($env->tokenize('{{ 1 is nul }}', 'index'));
331 }
332}
diff --git a/vendor/twig/twig/test/Twig/Tests/Extension/CoreTest.php b/vendor/twig/twig/test/Twig/Tests/Extension/CoreTest.php
new file mode 100644
index 00000000..5743e343
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Extension/CoreTest.php
@@ -0,0 +1,117 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Extension_CoreTest extends PHPUnit_Framework_TestCase
13{
14 /**
15 * @dataProvider getRandomFunctionTestData
16 */
17 public function testRandomFunction($value, $expectedInArray)
18 {
19 $env = new Twig_Environment();
20
21 for ($i = 0; $i < 100; $i++) {
22 $this->assertTrue(in_array(twig_random($env, $value), $expectedInArray, true)); // assertContains() would not consider the type
23 }
24 }
25
26 public function getRandomFunctionTestData()
27 {
28 return array(
29 array( // array
30 array('apple', 'orange', 'citrus'),
31 array('apple', 'orange', 'citrus'),
32 ),
33 array( // Traversable
34 new ArrayObject(array('apple', 'orange', 'citrus')),
35 array('apple', 'orange', 'citrus'),
36 ),
37 array( // unicode string
38 'Ä€é',
39 array('Ä', '€', 'é'),
40 ),
41 array( // numeric but string
42 '123',
43 array('1', '2', '3'),
44 ),
45 array( // integer
46 5,
47 range(0, 5, 1),
48 ),
49 array( // float
50 5.9,
51 range(0, 5, 1),
52 ),
53 array( // negative
54 -2,
55 array(0, -1, -2),
56 ),
57 );
58 }
59
60 public function testRandomFunctionWithoutParameter()
61 {
62 $max = mt_getrandmax();
63
64 for ($i = 0; $i < 100; $i++) {
65 $val = twig_random(new Twig_Environment());
66 $this->assertTrue(is_int($val) && $val >= 0 && $val <= $max);
67 }
68 }
69
70 public function testRandomFunctionReturnsAsIs()
71 {
72 $this->assertSame('', twig_random(new Twig_Environment(), ''));
73 $this->assertSame('', twig_random(new Twig_Environment(null, array('charset' => null)), ''));
74
75 $instance = new stdClass();
76 $this->assertSame($instance, twig_random(new Twig_Environment(), $instance));
77 }
78
79 /**
80 * @expectedException Twig_Error_Runtime
81 */
82 public function testRandomFunctionOfEmptyArrayThrowsException()
83 {
84 twig_random(new Twig_Environment(), array());
85 }
86
87 public function testRandomFunctionOnNonUTF8String()
88 {
89 if (!function_exists('iconv') && !function_exists('mb_convert_encoding')) {
90 $this->markTestSkipped('needs iconv or mbstring');
91 }
92
93 $twig = new Twig_Environment();
94 $twig->setCharset('ISO-8859-1');
95
96 $text = twig_convert_encoding('Äé', 'ISO-8859-1', 'UTF-8');
97 for ($i = 0; $i < 30; $i++) {
98 $rand = twig_random($twig, $text);
99 $this->assertTrue(in_array(twig_convert_encoding($rand, 'UTF-8', 'ISO-8859-1'), array('Ä', 'é'), true));
100 }
101 }
102
103 public function testReverseFilterOnNonUTF8String()
104 {
105 if (!function_exists('iconv') && !function_exists('mb_convert_encoding')) {
106 $this->markTestSkipped('needs iconv or mbstring');
107 }
108
109 $twig = new Twig_Environment();
110 $twig->setCharset('ISO-8859-1');
111
112 $input = twig_convert_encoding('Äé', 'ISO-8859-1', 'UTF-8');
113 $output = twig_convert_encoding(twig_reverse_filter($twig, $input), 'UTF-8', 'ISO-8859-1');
114
115 $this->assertEquals($output, 'éÄ');
116 }
117}
diff --git a/vendor/twig/twig/test/Twig/Tests/Extension/SandboxTest.php b/vendor/twig/twig/test/Twig/Tests/Extension/SandboxTest.php
new file mode 100644
index 00000000..72253c88
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Extension/SandboxTest.php
@@ -0,0 +1,212 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Extension_SandboxTest extends PHPUnit_Framework_TestCase
13{
14 protected static $params, $templates;
15
16 public function setUp()
17 {
18 self::$params = array(
19 'name' => 'Fabien',
20 'obj' => new FooObject(),
21 'arr' => array('obj' => new FooObject()),
22 );
23
24 self::$templates = array(
25 '1_basic1' => '{{ obj.foo }}',
26 '1_basic2' => '{{ name|upper }}',
27 '1_basic3' => '{% if name %}foo{% endif %}',
28 '1_basic4' => '{{ obj.bar }}',
29 '1_basic5' => '{{ obj }}',
30 '1_basic6' => '{{ arr.obj }}',
31 '1_basic7' => '{{ cycle(["foo","bar"], 1) }}',
32 '1_basic8' => '{{ obj.getfoobar }}{{ obj.getFooBar }}',
33 '1_basic' => '{% if obj.foo %}{{ obj.foo|upper }}{% endif %}',
34 '1_layout' => '{% block content %}{% endblock %}',
35 '1_child' => '{% extends "1_layout" %}{% block content %}{{ "a"|json_encode }}{% endblock %}',
36 );
37 }
38
39 /**
40 * @expectedException Twig_Sandbox_SecurityError
41 * @expectedExceptionMessage Filter "json_encode" is not allowed in "1_child".
42 */
43 public function testSandboxWithInheritance()
44 {
45 $twig = $this->getEnvironment(true, array(), self::$templates, array('block'));
46 $twig->loadTemplate('1_child')->render(array());
47 }
48
49 public function testSandboxGloballySet()
50 {
51 $twig = $this->getEnvironment(false, array(), self::$templates);
52 $this->assertEquals('FOO', $twig->loadTemplate('1_basic')->render(self::$params), 'Sandbox does nothing if it is disabled globally');
53
54 $twig = $this->getEnvironment(true, array(), self::$templates);
55 try {
56 $twig->loadTemplate('1_basic1')->render(self::$params);
57 $this->fail('Sandbox throws a SecurityError exception if an unallowed method is called');
58 } catch (Twig_Sandbox_SecurityError $e) {
59 }
60
61 $twig = $this->getEnvironment(true, array(), self::$templates);
62 try {
63 $twig->loadTemplate('1_basic2')->render(self::$params);
64 $this->fail('Sandbox throws a SecurityError exception if an unallowed filter is called');
65 } catch (Twig_Sandbox_SecurityError $e) {
66 }
67
68 $twig = $this->getEnvironment(true, array(), self::$templates);
69 try {
70 $twig->loadTemplate('1_basic3')->render(self::$params);
71 $this->fail('Sandbox throws a SecurityError exception if an unallowed tag is used in the template');
72 } catch (Twig_Sandbox_SecurityError $e) {
73 }
74
75 $twig = $this->getEnvironment(true, array(), self::$templates);
76 try {
77 $twig->loadTemplate('1_basic4')->render(self::$params);
78 $this->fail('Sandbox throws a SecurityError exception if an unallowed property is called in the template');
79 } catch (Twig_Sandbox_SecurityError $e) {
80 }
81
82 $twig = $this->getEnvironment(true, array(), self::$templates);
83 try {
84 $twig->loadTemplate('1_basic5')->render(self::$params);
85 $this->fail('Sandbox throws a SecurityError exception if an unallowed method (__toString()) is called in the template');
86 } catch (Twig_Sandbox_SecurityError $e) {
87 }
88
89 $twig = $this->getEnvironment(true, array(), self::$templates);
90 try {
91 $twig->loadTemplate('1_basic6')->render(self::$params);
92 $this->fail('Sandbox throws a SecurityError exception if an unallowed method (__toString()) is called in the template');
93 } catch (Twig_Sandbox_SecurityError $e) {
94 }
95
96 $twig = $this->getEnvironment(true, array(), self::$templates);
97 try {
98 $twig->loadTemplate('1_basic7')->render(self::$params);
99 $this->fail('Sandbox throws a SecurityError exception if an unallowed function is called in the template');
100 } catch (Twig_Sandbox_SecurityError $e) {
101 }
102
103 $twig = $this->getEnvironment(true, array(), self::$templates, array(), array(), array('FooObject' => 'foo'));
104 FooObject::reset();
105 $this->assertEquals('foo', $twig->loadTemplate('1_basic1')->render(self::$params), 'Sandbox allow some methods');
106 $this->assertEquals(1, FooObject::$called['foo'], 'Sandbox only calls method once');
107
108 $twig = $this->getEnvironment(true, array(), self::$templates, array(), array(), array('FooObject' => '__toString'));
109 FooObject::reset();
110 $this->assertEquals('foo', $twig->loadTemplate('1_basic5')->render(self::$params), 'Sandbox allow some methods');
111 $this->assertEquals(1, FooObject::$called['__toString'], 'Sandbox only calls method once');
112
113 $twig = $this->getEnvironment(true, array(), self::$templates, array(), array('upper'));
114 $this->assertEquals('FABIEN', $twig->loadTemplate('1_basic2')->render(self::$params), 'Sandbox allow some filters');
115
116 $twig = $this->getEnvironment(true, array(), self::$templates, array('if'));
117 $this->assertEquals('foo', $twig->loadTemplate('1_basic3')->render(self::$params), 'Sandbox allow some tags');
118
119 $twig = $this->getEnvironment(true, array(), self::$templates, array(), array(), array(), array('FooObject' => 'bar'));
120 $this->assertEquals('bar', $twig->loadTemplate('1_basic4')->render(self::$params), 'Sandbox allow some properties');
121
122 $twig = $this->getEnvironment(true, array(), self::$templates, array(), array(), array(), array(), array('cycle'));
123 $this->assertEquals('bar', $twig->loadTemplate('1_basic7')->render(self::$params), 'Sandbox allow some functions');
124
125 foreach (array('getfoobar', 'getFoobar', 'getFooBar') as $name) {
126 $twig = $this->getEnvironment(true, array(), self::$templates, array(), array(), array('FooObject' => $name));
127 FooObject::reset();
128 $this->assertEquals('foobarfoobar', $twig->loadTemplate('1_basic8')->render(self::$params), 'Sandbox allow methods in a case-insensitive way');
129 $this->assertEquals(2, FooObject::$called['getFooBar'], 'Sandbox only calls method once');
130 }
131 }
132
133 public function testSandboxLocallySetForAnInclude()
134 {
135 self::$templates = array(
136 '2_basic' => '{{ obj.foo }}{% include "2_included" %}{{ obj.foo }}',
137 '2_included' => '{% if obj.foo %}{{ obj.foo|upper }}{% endif %}',
138 );
139
140 $twig = $this->getEnvironment(false, array(), self::$templates);
141 $this->assertEquals('fooFOOfoo', $twig->loadTemplate('2_basic')->render(self::$params), 'Sandbox does nothing if disabled globally and sandboxed not used for the include');
142
143 self::$templates = array(
144 '3_basic' => '{{ obj.foo }}{% sandbox %}{% include "3_included" %}{% endsandbox %}{{ obj.foo }}',
145 '3_included' => '{% if obj.foo %}{{ obj.foo|upper }}{% endif %}',
146 );
147
148 $twig = $this->getEnvironment(true, array(), self::$templates);
149 try {
150 $twig->loadTemplate('3_basic')->render(self::$params);
151 $this->fail('Sandbox throws a SecurityError exception when the included file is sandboxed');
152 } catch (Twig_Sandbox_SecurityError $e) {
153 }
154 }
155
156 public function testMacrosInASandbox()
157 {
158 $twig = $this->getEnvironment(true, array('autoescape' => true), array('index' => <<<EOF
159{%- import _self as macros %}
160
161{%- macro test(text) %}<p>{{ text }}</p>{% endmacro %}
162
163{{- macros.test('username') }}
164EOF
165 ), array('macro', 'import'), array('escape'));
166
167 $this->assertEquals('<p>username</p>', $twig->loadTemplate('index')->render(array()));
168 }
169
170 protected function getEnvironment($sandboxed, $options, $templates, $tags = array(), $filters = array(), $methods = array(), $properties = array(), $functions = array())
171 {
172 $loader = new Twig_Loader_Array($templates);
173 $twig = new Twig_Environment($loader, array_merge(array('debug' => true, 'cache' => false, 'autoescape' => false), $options));
174 $policy = new Twig_Sandbox_SecurityPolicy($tags, $filters, $methods, $properties, $functions);
175 $twig->addExtension(new Twig_Extension_Sandbox($policy, $sandboxed));
176
177 return $twig;
178 }
179}
180
181class FooObject
182{
183 public static $called = array('__toString' => 0, 'foo' => 0, 'getFooBar' => 0);
184
185 public $bar = 'bar';
186
187 public static function reset()
188 {
189 self::$called = array('__toString' => 0, 'foo' => 0, 'getFooBar' => 0);
190 }
191
192 public function __toString()
193 {
194 ++self::$called['__toString'];
195
196 return 'foo';
197 }
198
199 public function foo()
200 {
201 ++self::$called['foo'];
202
203 return 'foo';
204 }
205
206 public function getFooBar()
207 {
208 ++self::$called['getFooBar'];
209
210 return 'foobar';
211 }
212}
diff --git a/vendor/twig/twig/test/Twig/Tests/FileCachingTest.php b/vendor/twig/twig/test/Twig/Tests/FileCachingTest.php
new file mode 100644
index 00000000..8efc948f
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/FileCachingTest.php
@@ -0,0 +1,70 @@
1<?php
2
3class Twig_Tests_FileCachingTest extends PHPUnit_Framework_TestCase
4{
5 protected $fileName;
6 protected $env;
7 protected $tmpDir;
8
9 public function setUp()
10 {
11 $this->tmpDir = sys_get_temp_dir().'/TwigTests';
12 if (!file_exists($this->tmpDir)) {
13 @mkdir($this->tmpDir, 0777, true);
14 }
15
16 if (!is_writable($this->tmpDir)) {
17 $this->markTestSkipped(sprintf('Unable to run the tests as "%s" is not writable.', $this->tmpDir));
18 }
19
20 $this->env = new Twig_Environment(new Twig_Loader_String(), array('cache' => $this->tmpDir));
21 }
22
23 public function tearDown()
24 {
25 if ($this->fileName) {
26 unlink($this->fileName);
27 }
28
29 $this->removeDir($this->tmpDir);
30 }
31
32 public function testWritingCacheFiles()
33 {
34 $name = 'This is just text.';
35 $template = $this->env->loadTemplate($name);
36 $cacheFileName = $this->env->getCacheFilename($name);
37
38 $this->assertTrue(file_exists($cacheFileName), 'Cache file does not exist.');
39 $this->fileName = $cacheFileName;
40 }
41
42 public function testClearingCacheFiles()
43 {
44 $name = 'I will be deleted.';
45 $template = $this->env->loadTemplate($name);
46 $cacheFileName = $this->env->getCacheFilename($name);
47
48 $this->assertTrue(file_exists($cacheFileName), 'Cache file does not exist.');
49 $this->env->clearCacheFiles();
50 $this->assertFalse(file_exists($cacheFileName), 'Cache file was not cleared.');
51 }
52
53 private function removeDir($target)
54 {
55 $fp = opendir($target);
56 while (false !== $file = readdir($fp)) {
57 if (in_array($file, array('.', '..'))) {
58 continue;
59 }
60
61 if (is_dir($target.'/'.$file)) {
62 self::removeDir($target.'/'.$file);
63 } else {
64 unlink($target.'/'.$file);
65 }
66 }
67 closedir($fp);
68 rmdir($target);
69 }
70}
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/base.html b/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/base.html
new file mode 100644
index 00000000..cb0dbe44
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/base.html
@@ -0,0 +1 @@
{% block content %}{% endblock %}
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/index.html b/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/index.html
new file mode 100644
index 00000000..df57c822
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/index.html
@@ -0,0 +1,7 @@
1{% extends 'base.html' %}
2{% block content %}
3 {{ foo.bar }}
4{% endblock %}
5{% block foo %}
6 {{ foo.bar }}
7{% endblock %}
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/unclosed_tag.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/unclosed_tag.test
new file mode 100644
index 00000000..02245e93
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/unclosed_tag.test
@@ -0,0 +1,20 @@
1--TEST--
2Exception for an unclosed tag
3--TEMPLATE--
4{% block foo %}
5 {% if foo %}
6
7
8
9
10 {% for i in fo %}
11
12
13
14 {% endfor %}
15
16
17
18{% endblock %}
19--EXCEPTION--
20Twig_Error_Syntax: Unexpected tag name "endblock" (expecting closing tag for the "if" tag defined near line 4) in "index.twig" at line 16
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array.test
new file mode 100644
index 00000000..c69b1192
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array.test
@@ -0,0 +1,61 @@
1--TEST--
2Twig supports array notation
3--TEMPLATE--
4{# empty array #}
5{{ []|join(',') }}
6
7{{ [1, 2]|join(',') }}
8{{ ['foo', "bar"]|join(',') }}
9{{ {0: 1, 'foo': 'bar'}|join(',') }}
10{{ {0: 1, 'foo': 'bar'}|keys|join(',') }}
11
12{{ {0: 1, foo: 'bar'}|join(',') }}
13{{ {0: 1, foo: 'bar'}|keys|join(',') }}
14
15{# nested arrays #}
16{% set a = [1, 2, [1, 2], {'foo': {'foo': 'bar'}}] %}
17{{ a[2]|join(',') }}
18{{ a[3]["foo"]|join(',') }}
19
20{# works even if [] is used inside the array #}
21{{ [foo[bar]]|join(',') }}
22
23{# elements can be any expression #}
24{{ ['foo'|upper, bar|upper, bar == foo]|join(',') }}
25
26{# arrays can have a trailing , like in PHP #}
27{{
28 [
29 1,
30 2,
31 ]|join(',')
32}}
33
34{# keys can be any expression #}
35{% set a = 1 %}
36{% set b = "foo" %}
37{% set ary = { (a): 'a', (b): 'b', 'c': 'c', (a ~ b): 'd' } %}
38{{ ary|keys|join(',') }}
39{{ ary|join(',') }}
40--DATA--
41return array('bar' => 'bar', 'foo' => array('bar' => 'bar'))
42--EXPECT--
431,2
44foo,bar
451,bar
460,foo
47
481,bar
490,foo
50
511,2
52bar
53
54bar
55
56FOO,BAR,
57
581,2
59
601,foo,c,1foo
61a,b,c,d
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array_call.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array_call.test
new file mode 100644
index 00000000..f3df328f
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array_call.test
@@ -0,0 +1,14 @@
1--TEST--
2Twig supports method calls
3--TEMPLATE--
4{{ items.foo }}
5{{ items['foo'] }}
6{{ items[foo] }}
7{{ items[items[foo]] }}
8--DATA--
9return array('foo' => 'bar', 'items' => array('foo' => 'bar', 'bar' => 'foo'))
10--EXPECT--
11bar
12bar
13foo
14bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/binary.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/binary.test
new file mode 100644
index 00000000..f5e68456
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/binary.test
@@ -0,0 +1,46 @@
1--TEST--
2Twig supports binary operations (+, -, *, /, ~, %, and, or)
3--TEMPLATE--
4{{ 1 + 1 }}
5{{ 2 - 1 }}
6{{ 2 * 2 }}
7{{ 2 / 2 }}
8{{ 3 % 2 }}
9{{ 1 and 1 }}
10{{ 1 and 0 }}
11{{ 0 and 1 }}
12{{ 0 and 0 }}
13{{ 1 or 1 }}
14{{ 1 or 0 }}
15{{ 0 or 1 }}
16{{ 0 or 0 }}
17{{ 0 or 1 and 0 }}
18{{ 1 or 0 and 1 }}
19{{ "foo" ~ "bar" }}
20{{ foo ~ "bar" }}
21{{ "foo" ~ bar }}
22{{ foo ~ bar }}
23{{ 20 // 7 }}
24--DATA--
25return array('foo' => 'bar', 'bar' => 'foo')
26--EXPECT--
272
281
294
301
311
321
33
34
35
361
371
381
39
40
411
42foobar
43barbar
44foofoo
45barfoo
462
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/bitwise.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/bitwise.test
new file mode 100644
index 00000000..7b56b761
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/bitwise.test
@@ -0,0 +1,14 @@
1--TEST--
2Twig supports bitwise operations
3--TEMPLATE--
4{{ 1 b-and 5 }}
5{{ 1 b-or 5 }}
6{{ 1 b-xor 5 }}
7{{ (1 and 0 b-or 0) is sameas(1 and (0 b-or 0)) ? 'ok' : 'ko' }}
8--DATA--
9return array()
10--EXPECT--
111
125
134
14ok
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/comparison.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/comparison.test
new file mode 100644
index 00000000..726b8507
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/comparison.test
@@ -0,0 +1,14 @@
1--TEST--
2Twig supports comparison operators (==, !=, <, >, >=, <=)
3--TEMPLATE--
4{{ 1 > 2 }}/{{ 1 > 1 }}/{{ 1 >= 2 }}/{{ 1 >= 1 }}
5{{ 1 < 2 }}/{{ 1 < 1 }}/{{ 1 <= 2 }}/{{ 1 <= 1 }}
6{{ 1 == 1 }}/{{ 1 == 2 }}
7{{ 1 != 1 }}/{{ 1 != 2 }}
8--DATA--
9return array()
10--EXPECT--
11///1
121//1/1
131/
14/1
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/dotdot.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/dotdot.test
new file mode 100644
index 00000000..9cd0676c
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/dotdot.test
@@ -0,0 +1,20 @@
1--TEST--
2Twig supports the .. operator
3--TEMPLATE--
4{% for i in 0..10 %}{{ i }} {% endfor %}
5
6{% for letter in 'a'..'z' %}{{ letter }} {% endfor %}
7
8{% for letter in 'a'|upper..'z'|upper %}{{ letter }} {% endfor %}
9
10{% for i in foo[0]..foo[1] %}{{ i }} {% endfor %}
11
12{% for i in 0 + 1 .. 10 - 1 %}{{ i }} {% endfor %}
13--DATA--
14return array('foo' => array(1, 10))
15--EXPECT--
160 1 2 3 4 5 6 7 8 9 10
17a b c d e f g h i j k l m n o p q r s t u v w x y z
18A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
191 2 3 4 5 6 7 8 9 10
201 2 3 4 5 6 7 8 9
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/grouping.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/grouping.test
new file mode 100644
index 00000000..79f8e0b0
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/grouping.test
@@ -0,0 +1,8 @@
1--TEST--
2Twig supports grouping of expressions
3--TEMPLATE--
4{{ (2 + 2) / 2 }}
5--DATA--
6return array()
7--EXPECT--
82
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/literals.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/literals.test
new file mode 100644
index 00000000..7ae3bae9
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/literals.test
@@ -0,0 +1,22 @@
1--TEST--
2Twig supports literals
3--TEMPLATE--
41 {{ true }}
52 {{ TRUE }}
63 {{ false }}
74 {{ FALSE }}
85 {{ none }}
96 {{ NONE }}
107 {{ null }}
118 {{ NULL }}
12--DATA--
13return array()
14--EXPECT--
151 1
162 1
173
184
195
206
217
228
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/magic_call.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/magic_call.test
new file mode 100644
index 00000000..159db96f
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/magic_call.test
@@ -0,0 +1,27 @@
1--TEST--
2Twig supports __call() for attributes
3--TEMPLATE--
4{{ foo.foo }}
5{{ foo.bar }}
6--DATA--
7class TestClassForMagicCallAttributes
8{
9 public function getBar()
10 {
11 return 'bar_from_getbar';
12 }
13
14 public function __call($method, $arguments)
15 {
16 if ('foo' === $method)
17 {
18 return 'foo_from_call';
19 }
20
21 return false;
22 }
23}
24return array('foo' => new TestClassForMagicCallAttributes())
25--EXPECT--
26foo_from_call
27bar_from_getbar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/method_call.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/method_call.test
new file mode 100644
index 00000000..5f801e63
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/method_call.test
@@ -0,0 +1,28 @@
1--TEST--
2Twig supports method calls
3--TEMPLATE--
4{{ items.foo.foo }}
5{{ items.foo.getFoo() }}
6{{ items.foo.bar }}
7{{ items.foo['bar'] }}
8{{ items.foo.bar('a', 43) }}
9{{ items.foo.bar(foo) }}
10{{ items.foo.self.foo() }}
11{{ items.foo.is }}
12{{ items.foo.in }}
13{{ items.foo.not }}
14--DATA--
15return array('foo' => 'bar', 'items' => array('foo' => new TwigTestFoo(), 'bar' => 'foo'))
16--CONFIG--
17return array('strict_variables' => false)
18--EXPECT--
19foo
20foo
21bar
22
23bar_a-43
24bar_bar
25foo
26is
27in
28not
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/postfix.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/postfix.test
new file mode 100644
index 00000000..542c3504
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/postfix.test
@@ -0,0 +1,22 @@
1--TEST--
2Twig parses postfix expressions
3--TEMPLATE--
4{% import _self as macros %}
5
6{% macro foo() %}foo{% endmacro %}
7
8{{ 'a' }}
9{{ 'a'|upper }}
10{{ ('a')|upper }}
11{{ -1|upper }}
12{{ macros.foo() }}
13{{ (macros).foo() }}
14--DATA--
15return array();
16--EXPECT--
17a
18A
19A
20-1
21foo
22foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/strings.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/strings.test
new file mode 100644
index 00000000..a9116613
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/strings.test
@@ -0,0 +1,10 @@
1--TEST--
2Twig supports string interpolation
3--TEMPLATE--
4{{ "foo #{"foo #{bar} baz"} baz" }}
5{{ "foo #{bar}#{bar} baz" }}
6--DATA--
7return array('bar' => 'BAR');
8--EXPECT--
9foo foo BAR baz baz
10foo BARBAR baz
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator.test
new file mode 100644
index 00000000..0e6fa96e
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator.test
@@ -0,0 +1,18 @@
1--TEST--
2Twig supports the ternary operator
3--TEMPLATE--
4{{ 1 ? 'YES' : 'NO' }}
5{{ 0 ? 'YES' : 'NO' }}
6{{ 0 ? 'YES' : (1 ? 'YES1' : 'NO1') }}
7{{ 0 ? 'YES' : (0 ? 'YES1' : 'NO1') }}
8{{ 1 == 1 ? 'foo<br />':'' }}
9{{ foo ~ (bar ? ('-' ~ bar) : '') }}
10--DATA--
11return array('foo' => 'foo', 'bar' => 'bar')
12--EXPECT--
13YES
14NO
15YES1
16NO1
17foo<br />
18foo-bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_noelse.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_noelse.test
new file mode 100644
index 00000000..fdc660fc
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_noelse.test
@@ -0,0 +1,10 @@
1--TEST--
2Twig supports the ternary operator
3--TEMPLATE--
4{{ 1 ? 'YES' }}
5{{ 0 ? 'YES' }}
6--DATA--
7return array()
8--EXPECT--
9YES
10
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_nothen.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_nothen.test
new file mode 100644
index 00000000..9057e837
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_nothen.test
@@ -0,0 +1,10 @@
1--TEST--
2Twig supports the ternary operator
3--TEMPLATE--
4{{ 'YES' ?: 'NO' }}
5{{ 0 ?: 'NO' }}
6--DATA--
7return array()
8--EXPECT--
9YES
10NO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary.test
new file mode 100644
index 00000000..b79219a2
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary.test
@@ -0,0 +1,12 @@
1--TEST--
2Twig supports unary operators (not, -, +)
3--TEMPLATE--
4{{ not 1 }}/{{ not 0 }}
5{{ +1 + 1 }}/{{ -1 - 1 }}
6{{ not (false or true) }}
7--DATA--
8return array()
9--EXPECT--
10/1
112/-2
12
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_precedence.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_precedence.test
new file mode 100644
index 00000000..cc6eef8d
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_precedence.test
@@ -0,0 +1,14 @@
1--TEST--
2Twig unary operators precedence
3--TEMPLATE--
4{{ -1 - 1 }}
5{{ -1 - -1 }}
6{{ -1 * -1 }}
7{{ 4 / -1 * 5 }}
8--DATA--
9return array()
10--EXPECT--
11-2
120
131
14-20
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/abs.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/abs.test
new file mode 100644
index 00000000..27e93fd6
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/abs.test
@@ -0,0 +1,30 @@
1--TEST--
2"abs" filter
3--TEMPLATE--
4{{ (-5.5)|abs }}
5{{ (-5)|abs }}
6{{ (-0)|abs }}
7{{ 0|abs }}
8{{ 5|abs }}
9{{ 5.5|abs }}
10{{ number1|abs }}
11{{ number2|abs }}
12{{ number3|abs }}
13{{ number4|abs }}
14{{ number5|abs }}
15{{ number6|abs }}
16--DATA--
17return array('number1' => -5.5, 'number2' => -5, 'number3' => -0, 'number4' => 0, 'number5' => 5, 'number6' => 5.5)
18--EXPECT--
195.5
205
210
220
235
245.5
255.5
265
270
280
295
305.5
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch.test
new file mode 100644
index 00000000..cb6de7f9
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch.test
@@ -0,0 +1,31 @@
1--TEST--
2"batch" filter
3--TEMPLATE--
4{% for row in items|batch(3) %}
5 <div class=row>
6 {% for column in row %}
7 <div class=item>{{ column }}</div>
8 {% endfor %}
9 </div>
10{% endfor %}
11--DATA--
12return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'))
13--EXPECT--
14<div class=row>
15 <div class=item>a</div>
16 <div class=item>b</div>
17 <div class=item>c</div>
18 </div>
19 <div class=row>
20 <div class=item>d</div>
21 <div class=item>e</div>
22 <div class=item>f</div>
23 </div>
24 <div class=row>
25 <div class=item>g</div>
26 <div class=item>h</div>
27 <div class=item>i</div>
28 </div>
29 <div class=row>
30 <div class=item>j</div>
31 </div>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_float.php b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_float.php
new file mode 100644
index 00000000..52de39cb
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_float.php
@@ -0,0 +1,31 @@
1--TEST--
2"batch" filter
3--TEMPLATE--
4{% for row in items|batch(3.1) %}
5 <div class=row>
6 {% for column in row %}
7 <div class=item>{{ column }}</div>
8 {% endfor %}
9 </div>
10{% endfor %}
11--DATA--
12return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'))
13--EXPECT--
14<div class=row>
15 <div class=item>a</div>
16 <div class=item>b</div>
17 <div class=item>c</div>
18 </div>
19 <div class=row>
20 <div class=item>d</div>
21 <div class=item>e</div>
22 <div class=item>f</div>
23 </div>
24 <div class=row>
25 <div class=item>g</div>
26 <div class=item>h</div>
27 <div class=item>i</div>
28 </div>
29 <div class=row>
30 <div class=item>j</div>
31 </div>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_empty_fill.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_empty_fill.test
new file mode 100644
index 00000000..af996f24
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_empty_fill.test
@@ -0,0 +1,37 @@
1--TEST--
2"batch" filter
3--TEMPLATE--
4<table>
5{% for row in items|batch(3, '') %}
6 <tr>
7 {% for column in row %}
8 <td>{{ column }}</td>
9 {% endfor %}
10 </tr>
11{% endfor %}
12</table>
13--DATA--
14return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'))
15--EXPECT--
16<table>
17 <tr>
18 <td>a</td>
19 <td>b</td>
20 <td>c</td>
21 </tr>
22 <tr>
23 <td>d</td>
24 <td>e</td>
25 <td>f</td>
26 </tr>
27 <tr>
28 <td>g</td>
29 <td>h</td>
30 <td>i</td>
31 </tr>
32 <tr>
33 <td>j</td>
34 <td></td>
35 <td></td>
36 </tr>
37</table>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_fill.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_fill.test
new file mode 100644
index 00000000..746295f1
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_fill.test
@@ -0,0 +1,37 @@
1--TEST--
2"batch" filter
3--TEMPLATE--
4<table>
5{% for row in items|batch(3, 'fill') %}
6 <tr>
7 {% for column in row %}
8 <td>{{ column }}</td>
9 {% endfor %}
10 </tr>
11{% endfor %}
12</table>
13--DATA--
14return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'))
15--EXPECT--
16<table>
17 <tr>
18 <td>a</td>
19 <td>b</td>
20 <td>c</td>
21 </tr>
22 <tr>
23 <td>d</td>
24 <td>e</td>
25 <td>f</td>
26 </tr>
27 <tr>
28 <td>g</td>
29 <td>h</td>
30 <td>i</td>
31 </tr>
32 <tr>
33 <td>j</td>
34 <td>fill</td>
35 <td>fill</td>
36 </tr>
37</table>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/convert_encoding.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/convert_encoding.test
new file mode 100644
index 00000000..380b04bb
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/convert_encoding.test
@@ -0,0 +1,10 @@
1--TEST--
2"convert_encoding" filter
3--CONDITION--
4function_exists('iconv') || function_exists('mb_convert_encoding')
5--TEMPLATE--
6{{ "愛していますか?"|convert_encoding('ISO-2022-JP', 'UTF-8')|convert_encoding('UTF-8', 'ISO-2022-JP') }}
7--DATA--
8return array()
9--EXPECT--
10愛していますか?
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date.test
new file mode 100644
index 00000000..d40bb04a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date.test
@@ -0,0 +1,76 @@
1--TEST--
2"date" filter
3--TEMPLATE--
4{{ date1|date }}
5{{ date1|date('d/m/Y') }}
6{{ date1|date('d/m/Y H:i:s', 'Asia/Hong_Kong') }}
7{{ date1|date('d/m/Y H:i:s P', 'Asia/Hong_Kong') }}
8{{ date1|date('d/m/Y H:i:s P', 'America/Chicago') }}
9{{ date1|date('e') }}
10{{ date1|date('d/m/Y H:i:s') }}
11
12{{ date2|date }}
13{{ date2|date('d/m/Y') }}
14{{ date2|date('d/m/Y H:i:s', 'Asia/Hong_Kong') }}
15{{ date2|date('d/m/Y H:i:s', timezone1) }}
16{{ date2|date('d/m/Y H:i:s') }}
17
18{{ date3|date }}
19{{ date3|date('d/m/Y') }}
20
21{{ date4|date }}
22{{ date4|date('d/m/Y') }}
23
24{{ date5|date }}
25{{ date5|date('d/m/Y') }}
26
27{{ date6|date('d/m/Y H:i:s P', 'Europe/Paris') }}
28{{ date6|date('d/m/Y H:i:s P', 'Asia/Hong_Kong') }}
29{{ date6|date('d/m/Y H:i:s P', false) }}
30{{ date6|date('e', 'Europe/Paris') }}
31{{ date6|date('e', false) }}
32
33{{ date7|date }}
34--DATA--
35date_default_timezone_set('Europe/Paris');
36return array(
37 'date1' => mktime(13, 45, 0, 10, 4, 2010),
38 'date2' => new DateTime('2010-10-04 13:45'),
39 'date3' => '2010-10-04 13:45',
40 'date4' => 1286199900, // DateTime::createFromFormat('Y-m-d H:i', '2010-10-04 13:45', new DateTimeZone('UTC'))->getTimestamp() -- A unixtimestamp is always GMT
41 'date5' => -189291360, // DateTime::createFromFormat('Y-m-d H:i', '1964-01-02 03:04', new DateTimeZone('UTC'))->getTimestamp(),
42 'date6' => new DateTime('2010-10-04 13:45', new DateTimeZone('America/New_York')),
43 'date7' => '2010-01-28T15:00:00+05:00',
44 'timezone1' => new DateTimeZone('America/New_York'),
45)
46--EXPECT--
47October 4, 2010 13:45
4804/10/2010
4904/10/2010 19:45:00
5004/10/2010 19:45:00 +08:00
5104/10/2010 06:45:00 -05:00
52Europe/Paris
5304/10/2010 13:45:00
54
55October 4, 2010 13:45
5604/10/2010
5704/10/2010 19:45:00
5804/10/2010 07:45:00
5904/10/2010 13:45:00
60
61October 4, 2010 13:45
6204/10/2010
63
64October 4, 2010 15:45
6504/10/2010
66
67January 2, 1964 04:04
6802/01/1964
69
7004/10/2010 19:45:00 +02:00
7105/10/2010 01:45:00 +08:00
7204/10/2010 13:45:00 -04:00
73Europe/Paris
74America/New_York
75
76January 28, 2010 11:00
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format.test
new file mode 100644
index 00000000..11a1ef4b
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format.test
@@ -0,0 +1,14 @@
1--TEST--
2"date" filter
3--TEMPLATE--
4{{ date1|date }}
5{{ date1|date('d/m/Y') }}
6--DATA--
7date_default_timezone_set('UTC');
8$twig->getExtension('core')->setDateFormat('Y-m-d', '%d days %h hours');
9return array(
10 'date1' => mktime(13, 45, 0, 10, 4, 2010),
11)
12--EXPECT--
132010-10-04
1404/10/2010
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format_interval.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format_interval.test
new file mode 100644
index 00000000..e6d3707d
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format_interval.test
@@ -0,0 +1,16 @@
1--TEST--
2"date" filter (interval support as of PHP 5.3)
3--CONDITION--
4version_compare(phpversion(), '5.3.0', '>=')
5--TEMPLATE--
6{{ date2|date }}
7{{ date2|date('%d days') }}
8--DATA--
9date_default_timezone_set('UTC');
10$twig->getExtension('core')->setDateFormat('Y-m-d', '%d days %h hours');
11return array(
12 'date2' => new DateInterval('P2D'),
13)
14--EXPECT--
152 days 0 hours
162 days
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_interval.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_interval.test
new file mode 100644
index 00000000..0c8c6f1a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_interval.test
@@ -0,0 +1,19 @@
1--TEST--
2"date" filter (interval support as of PHP 5.3)
3--CONDITION--
4version_compare(phpversion(), '5.3.0', '>=')
5--TEMPLATE--
6{{ date1|date }}
7{{ date1|date('%d days %h hours') }}
8{{ date1|date('%d days %h hours', timezone1) }}
9--DATA--
10date_default_timezone_set('UTC');
11return array(
12 'date1' => new DateInterval('P2D'),
13 // This should have no effect on DateInterval formatting
14 'timezone1' => new DateTimeZone('America/New_York'),
15)
16--EXPECT--
172 days
182 days 0 hours
192 days 0 hours
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_modify.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_modify.test
new file mode 100644
index 00000000..53d3a69c
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_modify.test
@@ -0,0 +1,14 @@
1--TEST--
2"date_modify" filter
3--TEMPLATE--
4{{ date1|date_modify('-1day')|date('Y-m-d H:i:s') }}
5{{ date2|date_modify('-1day')|date('Y-m-d H:i:s') }}
6--DATA--
7date_default_timezone_set('UTC');
8return array(
9 'date1' => '2010-10-04 13:45',
10 'date2' => new DateTime('2010-10-04 13:45'),
11)
12--EXPECT--
132010-10-03 13:45:00
142010-10-03 13:45:00
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_namedargs.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_namedargs.test
new file mode 100644
index 00000000..4ecde8a1
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_namedargs.test
@@ -0,0 +1,13 @@
1--TEST--
2"date" filter
3--TEMPLATE--
4{{ date|date(format='d/m/Y H:i:s P', timezone='America/Chicago') }}
5{{ date|date(timezone='America/Chicago', format='d/m/Y H:i:s P') }}
6{{ date|date('d/m/Y H:i:s P', timezone='America/Chicago') }}
7--DATA--
8date_default_timezone_set('UTC');
9return array('date' => mktime(13, 45, 0, 10, 4, 2010))
10--EXPECT--
1104/10/2010 08:45:00 -05:00
1204/10/2010 08:45:00 -05:00
1304/10/2010 08:45:00 -05:00
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/default.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/default.test
new file mode 100644
index 00000000..0e4404b1
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/default.test
@@ -0,0 +1,150 @@
1--TEST--
2"default" filter
3--TEMPLATE--
4Variable:
5{{ definedVar |default('default') is sameas('default') ? 'ko' : 'ok' }}
6{{ zeroVar |default('default') is sameas('default') ? 'ko' : 'ok' }}
7{{ emptyVar |default('default') is sameas('default') ? 'ok' : 'ko' }}
8{{ nullVar |default('default') is sameas('default') ? 'ok' : 'ko' }}
9{{ undefinedVar |default('default') is sameas('default') ? 'ok' : 'ko' }}
10Array access:
11{{ nested.definedVar |default('default') is sameas('default') ? 'ko' : 'ok' }}
12{{ nested['definedVar'] |default('default') is sameas('default') ? 'ko' : 'ok' }}
13{{ nested.zeroVar |default('default') is sameas('default') ? 'ko' : 'ok' }}
14{{ nested.emptyVar |default('default') is sameas('default') ? 'ok' : 'ko' }}
15{{ nested.nullVar |default('default') is sameas('default') ? 'ok' : 'ko' }}
16{{ nested.undefinedVar |default('default') is sameas('default') ? 'ok' : 'ko' }}
17{{ nested['undefinedVar'] |default('default') is sameas('default') ? 'ok' : 'ko' }}
18{{ undefinedVar.foo |default('default') is sameas('default') ? 'ok' : 'ko' }}
19Plain values:
20{{ 'defined' |default('default') is sameas('default') ? 'ko' : 'ok' }}
21{{ 0 |default('default') is sameas('default') ? 'ko' : 'ok' }}
22{{ '' |default('default') is sameas('default') ? 'ok' : 'ko' }}
23{{ null |default('default') is sameas('default') ? 'ok' : 'ko' }}
24Precedence:
25{{ 'o' ~ nullVar |default('k') }}
26{{ 'o' ~ nested.nullVar |default('k') }}
27Object methods:
28{{ object.foo |default('default') is sameas('default') ? 'ko' : 'ok' }}
29{{ object.undefinedMethod |default('default') is sameas('default') ? 'ok' : 'ko' }}
30{{ object.getFoo() |default('default') is sameas('default') ? 'ko' : 'ok' }}
31{{ object.getFoo('a') |default('default') is sameas('default') ? 'ko' : 'ok' }}
32{{ object.undefinedMethod() |default('default') is sameas('default') ? 'ok' : 'ko' }}
33{{ object.undefinedMethod('a') |default('default') is sameas('default') ? 'ok' : 'ko' }}
34Deep nested:
35{{ nested.undefinedVar.foo.bar |default('default') is sameas('default') ? 'ok' : 'ko' }}
36{{ nested.definedArray.0 |default('default') is sameas('default') ? 'ko' : 'ok' }}
37{{ nested['definedArray'][0] |default('default') is sameas('default') ? 'ko' : 'ok' }}
38{{ object.self.foo |default('default') is sameas('default') ? 'ko' : 'ok' }}
39{{ object.self.undefinedMethod |default('default') is sameas('default') ? 'ok' : 'ko' }}
40{{ object.undefinedMethod.self |default('default') is sameas('default') ? 'ok' : 'ko' }}
41--DATA--
42return array(
43 'definedVar' => 'defined',
44 'zeroVar' => 0,
45 'emptyVar' => '',
46 'nullVar' => null,
47 'nested' => array(
48 'definedVar' => 'defined',
49 'zeroVar' => 0,
50 'emptyVar' => '',
51 'nullVar' => null,
52 'definedArray' => array(0),
53 ),
54 'object' => new TwigTestFoo(),
55)
56--CONFIG--
57return array('strict_variables' => false)
58--EXPECT--
59Variable:
60ok
61ok
62ok
63ok
64ok
65Array access:
66ok
67ok
68ok
69ok
70ok
71ok
72ok
73ok
74Plain values:
75ok
76ok
77ok
78ok
79Precedence:
80ok
81ok
82Object methods:
83ok
84ok
85ok
86ok
87ok
88ok
89Deep nested:
90ok
91ok
92ok
93ok
94ok
95ok
96--DATA--
97return array(
98 'definedVar' => 'defined',
99 'zeroVar' => 0,
100 'emptyVar' => '',
101 'nullVar' => null,
102 'nested' => array(
103 'definedVar' => 'defined',
104 'zeroVar' => 0,
105 'emptyVar' => '',
106 'nullVar' => null,
107 'definedArray' => array(0),
108 ),
109 'object' => new TwigTestFoo(),
110)
111--CONFIG--
112return array('strict_variables' => true)
113--EXPECT--
114Variable:
115ok
116ok
117ok
118ok
119ok
120Array access:
121ok
122ok
123ok
124ok
125ok
126ok
127ok
128ok
129Plain values:
130ok
131ok
132ok
133ok
134Precedence:
135ok
136ok
137Object methods:
138ok
139ok
140ok
141ok
142ok
143ok
144Deep nested:
145ok
146ok
147ok
148ok
149ok
150ok
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/dynamic_filter.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/dynamic_filter.test
new file mode 100644
index 00000000..93c5913f
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/dynamic_filter.test
@@ -0,0 +1,10 @@
1--TEST--
2dynamic filter
3--TEMPLATE--
4{{ 'bar'|foo_path }}
5{{ 'bar'|a_foo_b_bar }}
6--DATA--
7return array()
8--EXPECT--
9foo/bar
10a/b/bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape.test
new file mode 100644
index 00000000..a606c106
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape.test
@@ -0,0 +1,8 @@
1--TEST--
2"escape" filter
3--TEMPLATE--
4{{ "foo <br />"|e }}
5--DATA--
6return array()
7--EXPECT--
8foo &lt;br /&gt;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_non_supported_charset.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_non_supported_charset.test
new file mode 100644
index 00000000..bba26a0d
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_non_supported_charset.test
@@ -0,0 +1,8 @@
1--TEST--
2"escape" filter
3--TEMPLATE--
4{{ "愛していますか? <br />"|e }}
5--DATA--
6return array()
7--EXPECT--
8愛していますか? &lt;br /&gt;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/first.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/first.test
new file mode 100644
index 00000000..853465b6
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/first.test
@@ -0,0 +1,14 @@
1--TEST--
2"first" filter
3--TEMPLATE--
4{{ [1, 2, 3, 4]|first }}
5{{ {a: 1, b: 2, c: 3, d: 4}|first }}
6{{ '1234'|first }}
7{{ arr|first }}
8--DATA--
9return array('arr' => new ArrayObject(array(1, 2, 3, 4)))
10--EXPECT--
111
121
131
141
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/force_escape.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/force_escape.test
new file mode 100644
index 00000000..85a9b717
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/force_escape.test
@@ -0,0 +1,18 @@
1--TEST--
2"escape" filter
3--TEMPLATE--
4{% set foo %}
5 foo<br />
6{% endset %}
7
8{{ foo|e('html') -}}
9{{ foo|e('js') }}
10{% autoescape true %}
11 {{ foo }}
12{% endautoescape %}
13--DATA--
14return array()
15--EXPECT--
16 foo&lt;br /&gt;
17\x20\x20\x20\x20foo\x3Cbr\x20\x2F\x3E\x0A
18 foo<br />
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/format.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/format.test
new file mode 100644
index 00000000..97221ff8
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/format.test
@@ -0,0 +1,8 @@
1--TEST--
2"format" filter
3--TEMPLATE--
4{{ string|format(foo, 3) }}
5--DATA--
6return array('string' => '%s/%d', 'foo' => 'bar')
7--EXPECT--
8bar/3
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/join.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/join.test
new file mode 100644
index 00000000..b342c174
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/join.test
@@ -0,0 +1,12 @@
1--TEST--
2"join" filter
3--TEMPLATE--
4{{ ["foo", "bar"]|join(', ') }}
5{{ foo|join(', ') }}
6{{ bar|join(', ') }}
7--DATA--
8return array('foo' => new TwigTestFoo(), 'bar' => new ArrayObject(array(3, 4)))
9--EXPECT--
10foo, bar
111, 2
123, 4
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/json_encode.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/json_encode.test
new file mode 100644
index 00000000..1738d40c
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/json_encode.test
@@ -0,0 +1,12 @@
1--TEST--
2"json_encode" filter
3--TEMPLATE--
4{{ "foo"|json_encode|raw }}
5{{ foo|json_encode|raw }}
6{{ [foo, "foo"]|json_encode|raw }}
7--DATA--
8return array('foo' => new Twig_Markup('foo', 'UTF-8'))
9--EXPECT--
10"foo"
11"foo"
12["foo","foo"]
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/last.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/last.test
new file mode 100644
index 00000000..ca3ac0cf
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/last.test
@@ -0,0 +1,14 @@
1--TEST--
2"last" filter
3--TEMPLATE--
4{{ [1, 2, 3, 4]|last }}
5{{ {a: 1, b: 2, c: 3, d: 4}|last }}
6{{ '1234'|last }}
7{{ arr|last }}
8--DATA--
9return array('arr' => new ArrayObject(array(1, 2, 3, 4)))
10--EXPECT--
114
124
134
144
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length.test
new file mode 100644
index 00000000..3347474d
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length.test
@@ -0,0 +1,14 @@
1--TEST--
2"length" filter
3--TEMPLATE--
4{{ array|length }}
5{{ string|length }}
6{{ number|length }}
7{{ markup|length }}
8--DATA--
9return array('array' => array(1, 4), 'string' => 'foo', 'number' => 1000, 'markup' => new Twig_Markup('foo', 'UTF-8'))
10--EXPECT--
112
123
134
143
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length_utf8.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length_utf8.test
new file mode 100644
index 00000000..5d5e2436
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length_utf8.test
@@ -0,0 +1,12 @@
1--TEST--
2"length" filter
3--CONDITION--
4function_exists('mb_get_info')
5--TEMPLATE--
6{{ string|length }}
7{{ markup|length }}
8--DATA--
9return array('string' => 'été', 'markup' => new Twig_Markup('foo', 'UTF-8'))
10--EXPECT--
113
123
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/merge.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/merge.test
new file mode 100644
index 00000000..2bd3d4c0
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/merge.test
@@ -0,0 +1,16 @@
1--TEST--
2"merge" filter
3--TEMPLATE--
4{{ items|merge({'bar': 'foo'})|join }}
5{{ items|merge({'bar': 'foo'})|keys|join }}
6{{ {'bar': 'foo'}|merge(items)|join }}
7{{ {'bar': 'foo'}|merge(items)|keys|join }}
8{{ numerics|merge([4, 5, 6])|join }}
9--DATA--
10return array('items' => array('foo' => 'bar'), 'numerics' => array(1, 2, 3))
11--EXPECT--
12barfoo
13foobar
14foobar
15barfoo
16123456
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/nl2br.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/nl2br.test
new file mode 100644
index 00000000..6545a9bb
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/nl2br.test
@@ -0,0 +1,14 @@
1--TEST--
2"nl2br" filter
3--TEMPLATE--
4{{ "I like Twig.\nYou will like it too.\n\nEverybody like it!"|nl2br }}
5{{ text|nl2br }}
6--DATA--
7return array('text' => "If you have some <strong>HTML</strong>\nit will be escaped.")
8--EXPECT--
9I like Twig.<br />
10You will like it too.<br />
11<br />
12Everybody like it!
13If you have some &lt;strong&gt;HTML&lt;/strong&gt;<br />
14it will be escaped.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format.test
new file mode 100644
index 00000000..639a8659
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format.test
@@ -0,0 +1,18 @@
1--TEST--
2"number_format" filter
3--TEMPLATE--
4{{ 20|number_format }}
5{{ 20.25|number_format }}
6{{ 20.25|number_format(2) }}
7{{ 20.25|number_format(2, ',') }}
8{{ 1020.25|number_format(2, ',') }}
9{{ 1020.25|number_format(2, ',', '.') }}
10--DATA--
11return array();
12--EXPECT--
1320
1420
1520.25
1620,25
171,020,25
181.020,25
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format_default.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format_default.test
new file mode 100644
index 00000000..c6903cc7
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format_default.test
@@ -0,0 +1,21 @@
1--TEST--
2"number_format" filter with defaults.
3--TEMPLATE--
4{{ 20|number_format }}
5{{ 20.25|number_format }}
6{{ 20.25|number_format(1) }}
7{{ 20.25|number_format(2, ',') }}
8{{ 1020.25|number_format }}
9{{ 1020.25|number_format(2, ',') }}
10{{ 1020.25|number_format(2, ',', '.') }}
11--DATA--
12$twig->getExtension('core')->setNumberFormat(2, '!', '=');
13return array();
14--EXPECT--
1520!00
1620!25
1720!3
1820,25
191=020!25
201=020,25
211.020,25
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace.test
new file mode 100644
index 00000000..4021660b
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace.test
@@ -0,0 +1,8 @@
1--TEST--
2"replace" filter
3--TEMPLATE--
4{{ "I like %this% and %that%."|replace({'%this%': "foo", '%that%': "bar"}) }}
5--DATA--
6return array()
7--EXPECT--
8I like foo and bar.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reverse.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reverse.test
new file mode 100644
index 00000000..7948ac45
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reverse.test
@@ -0,0 +1,18 @@
1--TEST--
2"reverse" filter
3--TEMPLATE--
4{{ [1, 2, 3, 4]|reverse|join('') }}
5{{ '1234évènement'|reverse }}
6{{ arr|reverse|join('') }}
7{{ {'a': 'c', 'b': 'a'}|reverse()|join(',') }}
8{{ {'a': 'c', 'b': 'a'}|reverse(preserveKeys=true)|join(glue=',') }}
9{{ {'a': 'c', 'b': 'a'}|reverse(preserve_keys=true)|join(glue=',') }}
10--DATA--
11return array('arr' => new ArrayObject(array(1, 2, 3, 4)))
12--EXPECT--
134321
14tnemenèvé4321
154321
16a,c
17a,c
18a,c
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/slice.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/slice.test
new file mode 100644
index 00000000..b37ad651
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/slice.test
@@ -0,0 +1,42 @@
1--TEST--
2"slice" filter
3--TEMPLATE--
4{{ [1, 2, 3, 4][1:2]|join('') }}
5{{ {a: 1, b: 2, c: 3, d: 4}[1:2]|join('') }}
6{{ [1, 2, 3, 4][start:length]|join('') }}
7{{ [1, 2, 3, 4]|slice(1, 2)|join('') }}
8{{ [1, 2, 3, 4]|slice(1, 2)|keys|join('') }}
9{{ [1, 2, 3, 4]|slice(1, 2, true)|keys|join('') }}
10{{ {a: 1, b: 2, c: 3, d: 4}|slice(1, 2)|join('') }}
11{{ {a: 1, b: 2, c: 3, d: 4}|slice(1, 2)|keys|join('') }}
12{{ '1234'|slice(1, 2) }}
13{{ '1234'[1:2] }}
14{{ arr|slice(1, 2)|join('') }}
15{{ arr[1:2]|join('') }}
16
17{{ [1, 2, 3, 4]|slice(1)|join('') }}
18{{ [1, 2, 3, 4][1:]|join('') }}
19{{ '1234'|slice(1) }}
20{{ '1234'[1:] }}
21{{ '1234'[:1] }}
22--DATA--
23return array('start' => 1, 'length' => 2, 'arr' => new ArrayObject(array(1, 2, 3, 4)))
24--EXPECT--
2523
2623
2723
2823
2901
3012
3123
32bc
3323
3423
3523
3623
37
38234
39234
40234
41234
421
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/sort.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/sort.test
new file mode 100644
index 00000000..21d575f1
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/sort.test
@@ -0,0 +1,10 @@
1--TEST--
2"sort" filter
3--TEMPLATE--
4{{ array1|sort|join }}
5{{ array2|sort|join }}
6--DATA--
7return array('array1' => array(4, 1), 'array2' => array('foo', 'bar'))
8--EXPECT--
914
10barfoo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/special_chars.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/special_chars.test
new file mode 100644
index 00000000..dbaf7dc9
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/special_chars.test
@@ -0,0 +1,8 @@
1--TEST--
2"§" custom filter
3--TEMPLATE--
4{{ 'foo'|§ }}
5--DATA--
6return array()
7--EXPECT--
8§foo§
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split.test
new file mode 100644
index 00000000..ce8ec9ce
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split.test
@@ -0,0 +1,18 @@
1--TEST--
2"split" filter
3--TEMPLATE--
4{{ "one,two,three,four,five"|split(',')|join('-') }}
5{{ foo|split(',')|join('-') }}
6{{ foo|split(',', 3)|join('-') }}
7{{ baz|split('')|join('-') }}
8{{ baz|split('', 2)|join('-') }}
9{{ foo|split(',', -2)|join('-') }}
10--DATA--
11return array('foo' => "one,two,three,four,five", 'baz' => '12345',)
12--EXPECT--
13one-two-three-four-five
14one-two-three-four-five
15one-two-three,four,five
161-2-3-4-5
1712-34-5
18one-two-three \ No newline at end of file
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/trim.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/trim.test
new file mode 100644
index 00000000..31920625
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/trim.test
@@ -0,0 +1,12 @@
1--TEST--
2"trim" filter
3--TEMPLATE--
4{{ " I like Twig. "|trim }}
5{{ text|trim }}
6{{ " foo/"|trim("/") }}
7--DATA--
8return array('text' => " If you have some <strong>HTML</strong> it will be escaped. ")
9--EXPECT--
10I like Twig.
11If you have some &lt;strong&gt;HTML&lt;/strong&gt; it will be escaped.
12 foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode.test
new file mode 100644
index 00000000..de956e7a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode.test
@@ -0,0 +1,12 @@
1--TEST--
2"url_encode" filter
3--TEMPLATE--
4{{ {foo: "bar", number: 3, "spéßi%l": "e%c0d@d", "spa ce": ""}|url_encode }}
5{{ {foo: "bar", number: 3, "spéßi%l": "e%c0d@d", "spa ce": ""}|url_encode|raw }}
6{{ {}|url_encode|default("default") }}
7--DATA--
8return array()
9--EXPECT--
10foo=bar&amp;number=3&amp;sp%C3%A9%C3%9Fi%25l=e%25c0d%40d&amp;spa+ce=
11foo=bar&number=3&sp%C3%A9%C3%9Fi%25l=e%25c0d%40d&spa+ce=
12default
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/attribute.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/attribute.test
new file mode 100644
index 00000000..16ae1e8b
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/attribute.test
@@ -0,0 +1,12 @@
1--TEST--
2"attribute" function
3--TEMPLATE--
4{{ attribute(obj, method) }}
5{{ attribute(array, item) }}
6{{ attribute(obj, "bar", ["a", "b"]) }}
7--DATA--
8return array('obj' => new TwigTestFoo(), 'method' => 'foo', 'array' => array('foo' => 'bar'), 'item' => 'foo')
9--EXPECT--
10foo
11bar
12bar_a-b
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block.test
new file mode 100644
index 00000000..8e54059a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block.test
@@ -0,0 +1,12 @@
1--TEST--
2"block" function
3--TEMPLATE--
4{% extends 'base.twig' %}
5{% block bar %}BAR{% endblock %}
6--TEMPLATE(base.twig)--
7{% block foo %}{{ block('bar') }}{% endblock %}
8{% block bar %}BAR_BASE{% endblock %}
9--DATA--
10return array()
11--EXPECT--
12BARBAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/constant.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/constant.test
new file mode 100644
index 00000000..63128791
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/constant.test
@@ -0,0 +1,10 @@
1--TEST--
2"constant" function
3--TEMPLATE--
4{{ constant('DATE_W3C') == expect ? 'true' : 'false' }}
5{{ constant('ARRAY_AS_PROPS', object) }}
6--DATA--
7return array('expect' => DATE_W3C, 'object' => new ArrayObject(array('hi')));
8--EXPECT--
9true
102
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/cycle.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/cycle.test
new file mode 100644
index 00000000..522a63b8
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/cycle.test
@@ -0,0 +1,16 @@
1--TEST--
2"cycle" function
3--TEMPLATE--
4{% for i in 0..6 %}
5{{ cycle(array1, i) }}-{{ cycle(array2, i) }}
6{% endfor %}
7--DATA--
8return array('array1' => array('odd', 'even'), 'array2' => array('apple', 'orange', 'citrus'))
9--EXPECT--
10odd-apple
11even-orange
12odd-citrus
13even-apple
14odd-orange
15even-citrus
16odd-apple
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date.test
new file mode 100644
index 00000000..a4c97167
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date.test
@@ -0,0 +1,27 @@
1--TEST--
2"date" function
3--TEMPLATE--
4{{ date() == date('now') ? 'OK' : 'KO' }}
5{{ date() > date('-1day') ? 'OK' : 'KO' }}
6{{ date(date1) == date('2010-10-04 13:45') ? 'OK' : 'KO' }}
7{{ date(date2) == date('2010-10-04 13:45') ? 'OK' : 'KO' }}
8{{ date(date3) == date('2010-10-04 13:45') ? 'OK' : 'KO' }}
9{{ date(date4) == date('2010-10-04 13:45') ? 'OK' : 'KO' }}
10{{ date(date5) == date('1964-01-02 03:04') ? 'OK' : 'KO' }}
11--DATA--
12date_default_timezone_set('UTC');
13return array(
14 'date1' => mktime(13, 45, 0, 10, 4, 2010),
15 'date2' => new DateTime('2010-10-04 13:45'),
16 'date3' => '2010-10-04 13:45',
17 'date4' => 1286199900, // DateTime::createFromFormat('Y-m-d H:i', '2010-10-04 13:45', new DateTimeZone('UTC'))->getTimestamp() -- A unixtimestamp is always GMT
18 'date5' => -189291360, // DateTime::createFromFormat('Y-m-d H:i', '1964-01-02 03:04', new DateTimeZone('UTC'))->getTimestamp(),
19)
20--EXPECT--
21OK
22OK
23OK
24OK
25OK
26OK
27OK
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date_namedargs.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date_namedargs.test
new file mode 100644
index 00000000..b9dd9e38
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date_namedargs.test
@@ -0,0 +1,11 @@
1--TEST--
2"date" function
3--TEMPLATE--
4{{ date(date, "America/New_York")|date('d/m/Y H:i:s P', false) }}
5{{ date(timezone="America/New_York", date=date)|date('d/m/Y H:i:s P', false) }}
6--DATA--
7date_default_timezone_set('UTC');
8return array('date' => mktime(13, 45, 0, 10, 4, 2010))
9--EXPECT--
1004/10/2010 09:45:00 -04:00
1104/10/2010 09:45:00 -04:00
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump.test
new file mode 100644
index 00000000..f4072375
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump.test
@@ -0,0 +1,16 @@
1--TEST--
2"dump" function
3--CONDITION--
4!extension_loaded('xdebug')
5--TEMPLATE--
6{{ dump('foo') }}
7{{ dump('foo', 'bar') }}
8--DATA--
9return array('foo' => 'foo', 'bar' => 'bar')
10--CONFIG--
11return array('debug' => true, 'autoescape' => false);
12--EXPECT--
13string(3) "foo"
14
15string(3) "foo"
16string(3) "bar"
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump_array.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump_array.test
new file mode 100644
index 00000000..889b7a92
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump_array.test
@@ -0,0 +1,19 @@
1--TEST--
2"dump" function, xdebug is not loaded or xdebug <2.2-dev is loaded
3--CONDITION--
4!extension_loaded('xdebug') || (($r = new ReflectionExtension('xdebug')) && version_compare($r->getVersion(), '2.2-dev', '<'))
5--TEMPLATE--
6{{ dump() }}
7--DATA--
8return array('foo' => 'foo', 'bar' => 'bar')
9--CONFIG--
10return array('debug' => true, 'autoescape' => false);
11--EXPECT--
12array(3) {
13 ["foo"]=>
14 string(3) "foo"
15 ["bar"]=>
16 string(3) "bar"
17 ["global"]=>
18 string(6) "global"
19}
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dynamic_function.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dynamic_function.test
new file mode 100644
index 00000000..913fbc99
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dynamic_function.test
@@ -0,0 +1,10 @@
1--TEST--
2dynamic function
3--TEMPLATE--
4{{ foo_path('bar') }}
5{{ a_foo_b_bar('bar') }}
6--DATA--
7return array()
8--EXPECT--
9foo/bar
10a/b/bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/assignment.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/assignment.test
new file mode 100644
index 00000000..b7653b4e
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/assignment.test
@@ -0,0 +1,13 @@
1--TEST--
2"include" function
3--TEMPLATE--
4{% set tmp = include("foo.twig") %}
5
6FOO{{ tmp }}BAR
7--TEMPLATE(foo.twig)--
8FOOBAR
9--DATA--
10return array()
11--EXPECT--
12FOO
13FOOBARBAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/autoescaping.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/autoescaping.test
new file mode 100644
index 00000000..56f8f3b5
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/autoescaping.test
@@ -0,0 +1,10 @@
1--TEST--
2"include" function is safe for auto-escaping
3--TEMPLATE--
4{{ include("foo.twig") }}
5--TEMPLATE(foo.twig)--
6<p>Test</p>
7--DATA--
8return array()
9--EXPECT--
10<p>Test</p>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/basic.test
new file mode 100644
index 00000000..a434182a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/basic.test
@@ -0,0 +1,17 @@
1--TEST--
2"include" function
3--TEMPLATE--
4FOO
5{{ include("foo.twig") }}
6
7BAR
8--TEMPLATE(foo.twig)--
9FOOBAR
10--DATA--
11return array()
12--EXPECT--
13FOO
14
15FOOBAR
16
17BAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/expression.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/expression.test
new file mode 100644
index 00000000..aba30ce3
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/expression.test
@@ -0,0 +1,17 @@
1--TEST--
2"include" function allows expressions for the template to include
3--TEMPLATE--
4FOO
5{{ include(foo) }}
6
7BAR
8--TEMPLATE(foo.twig)--
9FOOBAR
10--DATA--
11return array('foo' => 'foo.twig')
12--EXPECT--
13FOO
14
15FOOBAR
16
17BAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing.test
new file mode 100644
index 00000000..43a2ccc2
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing.test
@@ -0,0 +1,10 @@
1--TEST--
2"include" function
3--TEMPLATE--
4{{ include(["foo.twig", "bar.twig"], ignore_missing = true) }}
5{{ include("foo.twig", ignore_missing = true) }}
6{{ include("foo.twig", ignore_missing = true, variables = {}) }}
7{{ include("foo.twig", ignore_missing = true, variables = {}, with_context = true) }}
8--DATA--
9return array()
10--EXPECT--
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing.test
new file mode 100644
index 00000000..4d2f6cf1
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing.test
@@ -0,0 +1,8 @@
1--TEST--
2"include" function
3--TEMPLATE--
4{{ include("foo.twig") }}
5--DATA--
6return array();
7--EXCEPTION--
8Twig_Error_Loader: Template "foo.twig" is not defined in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing_nested.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing_nested.test
new file mode 100644
index 00000000..78fddc7a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing_nested.test
@@ -0,0 +1,16 @@
1--TEST--
2"include" function
3--TEMPLATE--
4{% extends "base.twig" %}
5
6{% block content %}
7 {{ parent() }}
8{% endblock %}
9--TEMPLATE(base.twig)--
10{% block content %}
11 {{ include("foo.twig") }}
12{% endblock %}
13--DATA--
14return array();
15--EXCEPTION--
16Twig_Error_Loader: Template "foo.twig" is not defined in "base.twig" at line 3.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox.test
new file mode 100644
index 00000000..788a2ab0
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox.test
@@ -0,0 +1,10 @@
1--TEST--
2"include" tag sandboxed
3--TEMPLATE--
4{{ include("foo.twig", sandboxed = true) }}
5--TEMPLATE(foo.twig)--
6{{ foo|e }}
7--DATA--
8return array()
9--EXCEPTION--
10Twig_Sandbox_SecurityError: Filter "e" is not allowed in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/template_instance.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/template_instance.test
new file mode 100644
index 00000000..18d405a0
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/template_instance.test
@@ -0,0 +1,10 @@
1--TEST--
2"include" function accepts Twig_Template instance
3--TEMPLATE--
4{{ include(foo) }} FOO
5--TEMPLATE(foo.twig)--
6BAR
7--DATA--
8return array('foo' => $twig->loadTemplate('foo.twig'))
9--EXPECT--
10BAR FOO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/templates_as_array.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/templates_as_array.test
new file mode 100644
index 00000000..1a810068
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/templates_as_array.test
@@ -0,0 +1,12 @@
1--TEST--
2"include" function
3--TEMPLATE--
4{{ include(["foo.twig", "bar.twig"]) }}
5{{- include(["bar.twig", "foo.twig"]) }}
6--TEMPLATE(foo.twig)--
7foo
8--DATA--
9return array()
10--EXPECT--
11foo
12foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_context.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_context.test
new file mode 100644
index 00000000..35611fbb
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_context.test
@@ -0,0 +1,16 @@
1--TEST--
2"include" function accept variables and with_context
3--TEMPLATE--
4{{ include("foo.twig") }}
5{{- include("foo.twig", with_context = false) }}
6{{- include("foo.twig", {'foo1': 'bar'}) }}
7{{- include("foo.twig", {'foo1': 'bar'}, with_context = false) }}
8--TEMPLATE(foo.twig)--
9{% for k, v in _context %}{{ k }},{% endfor %}
10--DATA--
11return array('foo' => 'bar')
12--EXPECT--
13foo,global,_parent,
14global,_parent,
15foo,global,foo1,_parent,
16foo1,global,_parent,
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_variables.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_variables.test
new file mode 100644
index 00000000..b2ace940
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_variables.test
@@ -0,0 +1,12 @@
1--TEST--
2"include" function accept variables
3--TEMPLATE--
4{{ include("foo.twig", {'foo': 'bar'}) }}
5{{- include("foo.twig", vars) }}
6--TEMPLATE(foo.twig)--
7{{ foo }}
8--DATA--
9return array('vars' => array('foo' => 'bar'))
10--EXPECT--
11bar
12bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/range.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/range.test
new file mode 100644
index 00000000..e0377c8d
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/range.test
@@ -0,0 +1,8 @@
1--TEST--
2"range" function
3--TEMPLATE--
4{{ range(low=0+1, high=10+0, step=2)|join(',') }}
5--DATA--
6return array()
7--EXPECT--
81,3,5,7,9
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/special_chars.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/special_chars.test
new file mode 100644
index 00000000..30c3df51
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/special_chars.test
@@ -0,0 +1,8 @@
1--TEST--
2"§" custom function
3--TEMPLATE--
4{{ §('foo') }}
5--DATA--
6return array()
7--EXPECT--
8§foo§
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/template_from_string.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/template_from_string.test
new file mode 100644
index 00000000..41428da1
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/template_from_string.test
@@ -0,0 +1,11 @@
1--TEST--
2"template_from_string" function
3--TEMPLATE--
4{% include template_from_string(template) %}
5
6{% include template_from_string("Hello {{ name }}") %}
7--DATA--
8return array('name' => 'Fabien', 'template' => "Hello {{ name }}")
9--EXPECT--
10Hello Fabien
11Hello Fabien
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/default_values.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/default_values.test
new file mode 100644
index 00000000..4ccff7b6
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/default_values.test
@@ -0,0 +1,16 @@
1--TEST--
2macro
3--TEMPLATE--
4{% from _self import test %}
5
6{% macro test(a, b = 'bar') -%}
7{{ a }}{{ b }}
8{%- endmacro %}
9
10{{ test('foo') }}
11{{ test('bar', 'foo') }}
12--DATA--
13return array();
14--EXPECT--
15foobar
16barfoo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/nested_calls.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/nested_calls.test
new file mode 100644
index 00000000..cd254281
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/nested_calls.test
@@ -0,0 +1,18 @@
1--TEST--
2macro
3--TEMPLATE--
4{% import _self as macros %}
5
6{% macro foo(data) %}
7 {{ data }}
8{% endmacro %}
9
10{% macro bar() %}
11 <br />
12{% endmacro %}
13
14{{ macros.foo(macros.bar()) }}
15--DATA--
16return array();
17--EXPECT--
18<br />
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/reserved_variables.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/reserved_variables.test
new file mode 100644
index 00000000..cbfb921b
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/reserved_variables.test
@@ -0,0 +1,14 @@
1--TEST--
2macro
3--TEMPLATE--
4{% from _self import test %}
5
6{% macro test(this) -%}
7 {{ this }}
8{%- endmacro %}
9
10{{ test(this) }}
11--DATA--
12return array('this' => 'foo');
13--EXPECT--
14foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/simple.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/simple.test
new file mode 100644
index 00000000..6a366cdf
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/simple.test
@@ -0,0 +1,22 @@
1--TEST--
2macro
3--TEMPLATE--
4{% import _self as test %}
5{% from _self import test %}
6
7{% macro test(a, b) -%}
8 {{ a|default('a') }}<br />
9 {{- b|default('b') }}<br />
10{%- endmacro %}
11
12{{ test.test() }}
13{{ test() }}
14{{ test.test(1, "c") }}
15{{ test(1, "c") }}
16--DATA--
17return array();
18--EXPECT--
19a<br />b<br />
20a<br />b<br />
211<br />c<br />
221<br />c<br />
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/with_filters.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/with_filters.test
new file mode 100644
index 00000000..685626f2
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/with_filters.test
@@ -0,0 +1,14 @@
1--TEST--
2macro with a filter
3--TEMPLATE--
4{% import _self as test %}
5
6{% macro test() %}
7 {% filter escape %}foo<br />{% endfilter %}
8{% endmacro %}
9
10{{ test.test() }}
11--DATA--
12return array();
13--EXPECT--
14foo&lt;br /&gt;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/empty_token.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/empty_token.test
new file mode 100644
index 00000000..65f6cd2b
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/empty_token.test
@@ -0,0 +1,8 @@
1--TEST--
2Twig outputs 0 nodes correctly
3--TEMPLATE--
4{{ foo }}0{{ foo }}
5--DATA--
6return array('foo' => 'foo')
7--EXPECT--
8foo0foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/simple_xml_element.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/simple_xml_element.test
new file mode 100644
index 00000000..110aef82
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/simple_xml_element.test
@@ -0,0 +1,17 @@
1--TEST--
2Twig is able to deal with SimpleXMLElement instances as variables
3--CONDITION--
4version_compare(phpversion(), '5.3.0', '>=')
5--TEMPLATE--
6Hello '{{ images.image.0.group }}'!
7{{ images.children().count() }}
8{% for image in images %}
9 - {{ image.group }}
10{% endfor %}
11--DATA--
12return array('images' => new SimpleXMLElement('<images><image><group>foo</group></image><image><group>bar</group></image></images>'))
13--EXPECT--
14Hello 'foo'!
152
16 - foo
17 - bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/strings_like_numbers.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/strings_like_numbers.test
new file mode 100644
index 00000000..e18e1107
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/strings_like_numbers.test
@@ -0,0 +1,8 @@
1--TEST--
2Twig does not confuse strings with integers in getAttribute()
3--TEMPLATE--
4{{ hash['2e2'] }}
5--DATA--
6return array('hash' => array('2e2' => 'works'))
7--EXPECT--
8works
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/basic.test
new file mode 100644
index 00000000..2f6a3e1a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/basic.test
@@ -0,0 +1,26 @@
1--TEST--
2"autoescape" tag applies escaping on its children
3--TEMPLATE--
4{% autoescape %}
5{{ var }}<br />
6{% endautoescape %}
7{% autoescape 'html' %}
8{{ var }}<br />
9{% endautoescape %}
10{% autoescape false %}
11{{ var }}<br />
12{% endautoescape %}
13{% autoescape true %}
14{{ var }}<br />
15{% endautoescape %}
16{% autoescape false %}
17{{ var }}<br />
18{% endautoescape %}
19--DATA--
20return array('var' => '<br />')
21--EXPECT--
22&lt;br /&gt;<br />
23&lt;br /&gt;<br />
24<br /><br />
25&lt;br /&gt;<br />
26<br /><br />
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/blocks.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/blocks.test
new file mode 100644
index 00000000..05ab83ce
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/blocks.test
@@ -0,0 +1,12 @@
1--TEST--
2"autoescape" tag applies escaping on embedded blocks
3--TEMPLATE--
4{% autoescape 'html' %}
5 {% block foo %}
6 {{ var }}
7 {% endblock %}
8{% endautoescape %}
9--DATA--
10return array('var' => '<br />')
11--EXPECT--
12&lt;br /&gt;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/double_escaping.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/double_escaping.test
new file mode 100644
index 00000000..9c097246
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/double_escaping.test
@@ -0,0 +1,10 @@
1--TEST--
2"autoescape" tag does not double-escape
3--TEMPLATE--
4{% autoescape 'html' %}
5{{ var|escape }}
6{% endautoescape %}
7--DATA--
8return array('var' => '<br />')
9--EXPECT--
10&lt;br /&gt;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/functions.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/functions.test
new file mode 100644
index 00000000..ce7ea789
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/functions.test
@@ -0,0 +1,83 @@
1--TEST--
2"autoescape" tag applies escaping after calling functions
3--TEMPLATE--
4
5autoescape false
6{% autoescape false %}
7
8safe_br
9{{ safe_br() }}
10
11unsafe_br
12{{ unsafe_br() }}
13
14{% endautoescape %}
15
16autoescape 'html'
17{% autoescape 'html' %}
18
19safe_br
20{{ safe_br() }}
21
22unsafe_br
23{{ unsafe_br() }}
24
25unsafe_br()|raw
26{{ (unsafe_br())|raw }}
27
28safe_br()|escape
29{{ (safe_br())|escape }}
30
31safe_br()|raw
32{{ (safe_br())|raw }}
33
34unsafe_br()|escape
35{{ (unsafe_br())|escape }}
36
37{% endautoescape %}
38
39autoescape js
40{% autoescape 'js' %}
41
42safe_br
43{{ safe_br() }}
44
45{% endautoescape %}
46--DATA--
47return array()
48--EXPECT--
49
50autoescape false
51
52safe_br
53<br />
54
55unsafe_br
56<br />
57
58
59autoescape 'html'
60
61safe_br
62<br />
63
64unsafe_br
65&lt;br /&gt;
66
67unsafe_br()|raw
68<br />
69
70safe_br()|escape
71&lt;br /&gt;
72
73safe_br()|raw
74<br />
75
76unsafe_br()|escape
77&lt;br /&gt;
78
79
80autoescape js
81
82safe_br
83\x3Cbr\x20\x2F\x3E
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/literal.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/literal.test
new file mode 100644
index 00000000..e389d4dd
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/literal.test
@@ -0,0 +1,45 @@
1--TEST--
2"autoescape" tag does not apply escaping on literals
3--TEMPLATE--
4{% autoescape 'html' %}
5
61. Simple literal
7{{ "<br />" }}
8
92. Conditional expression with only literals
10{{ true ? "<br />" : "<br>" }}
11
123. Conditional expression with a variable
13{{ true ? "<br />" : someVar }}
14
154. Nested conditionals with only literals
16{{ true ? (true ? "<br />" : "<br>") : "\n" }}
17
185. Nested conditionals with a variable
19{{ true ? (true ? "<br />" : someVar) : "\n" }}
20
216. Nested conditionals with a variable marked safe
22{{ true ? (true ? "<br />" : someVar|raw) : "\n" }}
23
24{% endautoescape %}
25--DATA--
26return array()
27--EXPECT--
28
291. Simple literal
30<br />
31
322. Conditional expression with only literals
33<br />
34
353. Conditional expression with a variable
36&lt;br /&gt;
37
384. Nested conditionals with only literals
39<br />
40
415. Nested conditionals with a variable
42&lt;br /&gt;
43
446. Nested conditionals with a variable marked safe
45<br />
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/nested.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/nested.test
new file mode 100644
index 00000000..798e6fea
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/nested.test
@@ -0,0 +1,26 @@
1--TEST--
2"autoescape" tags can be nested at will
3--TEMPLATE--
4{{ var }}
5{% autoescape 'html' %}
6 {{ var }}
7 {% autoescape false %}
8 {{ var }}
9 {% autoescape 'html' %}
10 {{ var }}
11 {% endautoescape %}
12 {{ var }}
13 {% endautoescape %}
14 {{ var }}
15{% endautoescape %}
16{{ var }}
17--DATA--
18return array('var' => '<br />')
19--EXPECT--
20&lt;br /&gt;
21 &lt;br /&gt;
22 <br />
23 &lt;br /&gt;
24 <br />
25 &lt;br /&gt;
26&lt;br /&gt;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/objects.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/objects.test
new file mode 100644
index 00000000..e896aa41
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/objects.test
@@ -0,0 +1,26 @@
1--TEST--
2"autoescape" tag applies escaping to object method calls
3--TEMPLATE--
4{% autoescape 'html' %}
5{{ user.name }}
6{{ user.name|lower }}
7{{ user }}
8{% endautoescape %}
9--DATA--
10class UserForAutoEscapeTest
11{
12 public function getName()
13 {
14 return 'Fabien<br />';
15 }
16
17 public function __toString()
18 {
19 return 'Fabien<br />';
20 }
21}
22return array('user' => new UserForAutoEscapeTest())
23--EXPECT--
24Fabien&lt;br /&gt;
25fabien&lt;br /&gt;
26Fabien&lt;br /&gt;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/raw.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/raw.test
new file mode 100644
index 00000000..9f1cedd3
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/raw.test
@@ -0,0 +1,10 @@
1--TEST--
2"autoescape" tag does not escape when raw is used as a filter
3--TEMPLATE--
4{% autoescape 'html' %}
5{{ var|raw }}
6{% endautoescape %}
7--DATA--
8return array('var' => '<br />')
9--EXPECT--
10<br />
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.test
new file mode 100644
index 00000000..cf8cceef
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.test
@@ -0,0 +1,17 @@
1--TEST--
2"autoescape" tag accepts an escaping strategy
3--TEMPLATE--
4{% autoescape true js %}{{ var }}{% endautoescape %}
5
6{% autoescape true html %}{{ var }}{% endautoescape %}
7
8{% autoescape 'js' %}{{ var }}{% endautoescape %}
9
10{% autoescape 'html' %}{{ var }}{% endautoescape %}
11--DATA--
12return array('var' => '<br />"')
13--EXPECT--
14\x3Cbr\x20\x2F\x3E\x22
15&lt;br /&gt;&quot;
16\x3Cbr\x20\x2F\x3E\x22
17&lt;br /&gt;&quot;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/type.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/type.test
new file mode 100644
index 00000000..4f415201
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/type.test
@@ -0,0 +1,69 @@
1--TEST--
2escape types
3--TEMPLATE--
4
51. autoescape 'html' |escape('js')
6
7{% autoescape 'html' %}
8<a onclick="alert(&quot;{{ msg|escape('js') }}&quot;)"></a>
9{% endautoescape %}
10
112. autoescape 'html' |escape('js')
12
13{% autoescape 'html' %}
14<a onclick="alert(&quot;{{ msg|escape('js') }}&quot;)"></a>
15{% endautoescape %}
16
173. autoescape 'js' |escape('js')
18
19{% autoescape 'js' %}
20<a onclick="alert(&quot;{{ msg|escape('js') }}&quot;)"></a>
21{% endautoescape %}
22
234. no escape
24
25{% autoescape false %}
26<a onclick="alert(&quot;{{ msg }}&quot;)"></a>
27{% endautoescape %}
28
295. |escape('js')|escape('html')
30
31{% autoescape false %}
32<a onclick="alert(&quot;{{ msg|escape('js')|escape('html') }}&quot;)"></a>
33{% endautoescape %}
34
356. autoescape 'html' |escape('js')|escape('html')
36
37{% autoescape 'html' %}
38<a onclick="alert(&quot;{{ msg|escape('js')|escape('html') }}&quot;)"></a>
39{% endautoescape %}
40
41--DATA--
42return array('msg' => "<>\n'\"")
43--EXPECT--
44
451. autoescape 'html' |escape('js')
46
47<a onclick="alert(&quot;\x3C\x3E\x0A\x27\x22&quot;)"></a>
48
492. autoescape 'html' |escape('js')
50
51<a onclick="alert(&quot;\x3C\x3E\x0A\x27\x22&quot;)"></a>
52
533. autoescape 'js' |escape('js')
54
55<a onclick="alert(&quot;\x3C\x3E\x0A\x27\x22&quot;)"></a>
56
574. no escape
58
59<a onclick="alert(&quot;<>
60'"&quot;)"></a>
61
625. |escape('js')|escape('html')
63
64<a onclick="alert(&quot;\x3C\x3E\x0A\x27\x22&quot;)"></a>
65
666. autoescape 'html' |escape('js')|escape('html')
67
68<a onclick="alert(&quot;\x3C\x3E\x0A\x27\x22&quot;)"></a>
69
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters.test
new file mode 100644
index 00000000..7821a9aa
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters.test
@@ -0,0 +1,131 @@
1--TEST--
2"autoescape" tag applies escaping after calling filters
3--TEMPLATE--
4{% autoescape 'html' %}
5
6(escape_and_nl2br is an escaper filter)
7
81. Don't escape escaper filter output
9( var is escaped by |escape_and_nl2br, line-breaks are added,
10 the output is not escaped )
11{{ var|escape_and_nl2br }}
12
132. Don't escape escaper filter output
14( var is escaped by |escape_and_nl2br, line-breaks are added,
15 the output is not escaped, |raw is redundant )
16{{ var|escape_and_nl2br|raw }}
17
183. Explicit escape
19( var is escaped by |escape_and_nl2br, line-breaks are added,
20 the output is explicitly escaped by |escape )
21{{ var|escape_and_nl2br|escape }}
22
234. Escape non-escaper filter output
24( var is upper-cased by |upper,
25 the output is auto-escaped )
26{{ var|upper }}
27
285. Escape if last filter is not an escaper
29( var is escaped by |escape_and_nl2br, line-breaks are added,
30 the output is upper-cased by |upper,
31 the output is auto-escaped as |upper is not an escaper )
32{{ var|escape_and_nl2br|upper }}
33
346. Don't escape escaper filter output
35( var is upper cased by upper,
36 the output is escaped by |escape_and_nl2br, line-breaks are added,
37 the output is not escaped as |escape_and_nl2br is an escaper )
38{{ var|upper|escape_and_nl2br }}
39
407. Escape if last filter is not an escaper
41( the output of |format is "<b>" ~ var ~ "</b>",
42 the output is auto-escaped )
43{{ "<b>%s</b>"|format(var) }}
44
458. Escape if last filter is not an escaper
46( the output of |format is "<b>" ~ var ~ "</b>",
47 |raw is redundant,
48 the output is auto-escaped )
49{{ "<b>%s</b>"|raw|format(var) }}
50
519. Don't escape escaper filter output
52( the output of |format is "<b>" ~ var ~ "</b>",
53 the output is not escaped due to |raw filter at the end )
54{{ "<b>%s</b>"|format(var)|raw }}
55
5610. Don't escape escaper filter output
57( the output of |format is "<b>" ~ var ~ "</b>",
58 the output is not escaped due to |raw filter at the end,
59 the |raw filter on var is redundant )
60{{ "<b>%s</b>"|format(var|raw)|raw }}
61
62{% endautoescape %}
63--DATA--
64return array('var' => "<Fabien>\nTwig")
65--EXPECT--
66
67(escape_and_nl2br is an escaper filter)
68
691. Don't escape escaper filter output
70( var is escaped by |escape_and_nl2br, line-breaks are added,
71 the output is not escaped )
72&lt;Fabien&gt;<br />
73Twig
74
752. Don't escape escaper filter output
76( var is escaped by |escape_and_nl2br, line-breaks are added,
77 the output is not escaped, |raw is redundant )
78&lt;Fabien&gt;<br />
79Twig
80
813. Explicit escape
82( var is escaped by |escape_and_nl2br, line-breaks are added,
83 the output is explicitly escaped by |escape )
84&amp;lt;Fabien&amp;gt;&lt;br /&gt;
85Twig
86
874. Escape non-escaper filter output
88( var is upper-cased by |upper,
89 the output is auto-escaped )
90&lt;FABIEN&gt;
91TWIG
92
935. Escape if last filter is not an escaper
94( var is escaped by |escape_and_nl2br, line-breaks are added,
95 the output is upper-cased by |upper,
96 the output is auto-escaped as |upper is not an escaper )
97&amp;LT;FABIEN&amp;GT;&lt;BR /&gt;
98TWIG
99
1006. Don't escape escaper filter output
101( var is upper cased by upper,
102 the output is escaped by |escape_and_nl2br, line-breaks are added,
103 the output is not escaped as |escape_and_nl2br is an escaper )
104&lt;FABIEN&gt;<br />
105TWIG
106
1077. Escape if last filter is not an escaper
108( the output of |format is "<b>" ~ var ~ "</b>",
109 the output is auto-escaped )
110&lt;b&gt;&lt;Fabien&gt;
111Twig&lt;/b&gt;
112
1138. Escape if last filter is not an escaper
114( the output of |format is "<b>" ~ var ~ "</b>",
115 |raw is redundant,
116 the output is auto-escaped )
117&lt;b&gt;&lt;Fabien&gt;
118Twig&lt;/b&gt;
119
1209. Don't escape escaper filter output
121( the output of |format is "<b>" ~ var ~ "</b>",
122 the output is not escaped due to |raw filter at the end )
123<b><Fabien>
124Twig</b>
125
12610. Don't escape escaper filter output
127( the output of |format is "<b>" ~ var ~ "</b>",
128 the output is not escaped due to |raw filter at the end,
129 the |raw filter on var is redundant )
130<b><Fabien>
131Twig</b>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters_arguments.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters_arguments.test
new file mode 100644
index 00000000..f58a1e09
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters_arguments.test
@@ -0,0 +1,23 @@
1--TEST--
2"autoescape" tag do not applies escaping on filter arguments
3--TEMPLATE--
4{% autoescape 'html' %}
5{{ var|nl2br("<br />") }}
6{{ var|nl2br("<br />"|escape) }}
7{{ var|nl2br(sep) }}
8{{ var|nl2br(sep|raw) }}
9{{ var|nl2br(sep|escape) }}
10{% endautoescape %}
11--DATA--
12return array('var' => "<Fabien>\nTwig", 'sep' => '<br />')
13--EXPECT--
14&lt;Fabien&gt;<br />
15Twig
16&lt;Fabien&gt;&lt;br /&gt;
17Twig
18&lt;Fabien&gt;<br />
19Twig
20&lt;Fabien&gt;<br />
21Twig
22&lt;Fabien&gt;&lt;br /&gt;
23Twig
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_pre_escape_filters.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_pre_escape_filters.test
new file mode 100644
index 00000000..134c77ea
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_pre_escape_filters.test
@@ -0,0 +1,68 @@
1--TEST--
2"autoescape" tag applies escaping after calling filters, and before calling pre_escape filters
3--TEMPLATE--
4{% autoescape 'html' %}
5
6(nl2br is pre_escaped for "html" and declared safe for "html")
7
81. Pre-escape and don't post-escape
9( var|escape|nl2br )
10{{ var|nl2br }}
11
122. Don't double-pre-escape
13( var|escape|nl2br )
14{{ var|escape|nl2br }}
15
163. Don't escape safe values
17( var|raw|nl2br )
18{{ var|raw|nl2br }}
19
204. Don't escape safe values
21( var|escape|nl2br|nl2br )
22{{ var|nl2br|nl2br }}
23
245. Re-escape values that are escaped for an other contexts
25( var|escape_something|escape|nl2br )
26{{ var|escape_something|nl2br }}
27
286. Still escape when using filters not declared safe
29( var|escape|nl2br|upper|escape )
30{{ var|nl2br|upper }}
31
32{% endautoescape %}
33--DATA--
34return array('var' => "<Fabien>\nTwig")
35--EXPECT--
36
37(nl2br is pre_escaped for "html" and declared safe for "html")
38
391. Pre-escape and don't post-escape
40( var|escape|nl2br )
41&lt;Fabien&gt;<br />
42Twig
43
442. Don't double-pre-escape
45( var|escape|nl2br )
46&lt;Fabien&gt;<br />
47Twig
48
493. Don't escape safe values
50( var|raw|nl2br )
51<Fabien><br />
52Twig
53
544. Don't escape safe values
55( var|escape|nl2br|nl2br )
56&lt;Fabien&gt;<br /><br />
57Twig
58
595. Re-escape values that are escaped for an other contexts
60( var|escape_something|escape|nl2br )
61&lt;FABIEN&gt;<br />
62TWIG
63
646. Still escape when using filters not declared safe
65( var|escape|nl2br|upper|escape )
66&amp;LT;FABIEN&amp;GT;&lt;BR /&gt;
67TWIG
68
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_preserves_safety_filters.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_preserves_safety_filters.test
new file mode 100644
index 00000000..32d3943b
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_preserves_safety_filters.test
@@ -0,0 +1,50 @@
1--TEST--
2"autoescape" tag handles filters preserving the safety
3--TEMPLATE--
4{% autoescape 'html' %}
5
6(preserves_safety is preserving safety for "html")
7
81. Unsafe values are still unsafe
9( var|preserves_safety|escape )
10{{ var|preserves_safety }}
11
122. Safe values are still safe
13( var|escape|preserves_safety )
14{{ var|escape|preserves_safety }}
15
163. Re-escape values that are escaped for an other contexts
17( var|escape_something|preserves_safety|escape )
18{{ var|escape_something|preserves_safety }}
19
204. Still escape when using filters not declared safe
21( var|escape|preserves_safety|replace({'FABIEN': 'FABPOT'})|escape )
22{{ var|escape|preserves_safety|replace({'FABIEN': 'FABPOT'}) }}
23
24{% endautoescape %}
25--DATA--
26return array('var' => "<Fabien>\nTwig")
27--EXPECT--
28
29(preserves_safety is preserving safety for "html")
30
311. Unsafe values are still unsafe
32( var|preserves_safety|escape )
33&lt;FABIEN&gt;
34TWIG
35
362. Safe values are still safe
37( var|escape|preserves_safety )
38&LT;FABIEN&GT;
39TWIG
40
413. Re-escape values that are escaped for an other contexts
42( var|escape_something|preserves_safety|escape )
43&lt;FABIEN&gt;
44TWIG
45
464. Still escape when using filters not declared safe
47( var|escape|preserves_safety|replace({'FABIEN': 'FABPOT'})|escape )
48&amp;LT;FABPOT&amp;GT;
49TWIG
50
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/basic.test
new file mode 100644
index 00000000..360dcf03
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/basic.test
@@ -0,0 +1,11 @@
1--TEST--
2"block" tag
3--TEMPLATE--
4{% block title1 %}FOO{% endblock %}
5{% block title2 foo|lower %}
6--TEMPLATE(foo.twig)--
7{% block content %}{% endblock %}
8--DATA--
9return array('foo' => 'bar')
10--EXPECT--
11FOObar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/block_unique_name.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/block_unique_name.test
new file mode 100644
index 00000000..5c205c0a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/block_unique_name.test
@@ -0,0 +1,11 @@
1--TEST--
2"block" tag
3--TEMPLATE--
4{% block content %}
5 {% block content %}
6 {% endblock %}
7{% endblock %}
8--DATA--
9return array()
10--EXCEPTION--
11Twig_Error_Syntax: The block 'content' has already been defined line 2 in "index.twig" at line 3
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/special_chars.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/special_chars.test
new file mode 100644
index 00000000..be17fedf
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/special_chars.test
@@ -0,0 +1,10 @@
1--TEST--
2"§" special chars in a block name
3--TEMPLATE--
4{% block § %}
5§
6{% endblock § %}
7--DATA--
8return array()
9--EXPECT--
10§
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/basic.test
new file mode 100644
index 00000000..f44296ea
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/basic.test
@@ -0,0 +1,35 @@
1--TEST--
2"embed" tag
3--TEMPLATE--
4FOO
5{% embed "foo.twig" %}
6 {% block c1 %}
7 {{ parent() }}
8 block1extended
9 {% endblock %}
10{% endembed %}
11
12BAR
13--TEMPLATE(foo.twig)--
14A
15{% block c1 %}
16 block1
17{% endblock %}
18B
19{% block c2 %}
20 block2
21{% endblock %}
22C
23--DATA--
24return array()
25--EXPECT--
26FOO
27
28A
29 block1
30
31 block1extended
32 B
33 block2
34C
35BAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/error_line.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/error_line.test
new file mode 100644
index 00000000..71ab2e01
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/error_line.test
@@ -0,0 +1,16 @@
1--TEST--
2"embed" tag
3--TEMPLATE(index.twig)--
4FOO
5{% embed "foo.twig" %}
6 {% block c1 %}
7 {{ nothing }}
8 {% endblock %}
9{% endembed %}
10BAR
11--TEMPLATE(foo.twig)--
12{% block c1 %}{% endblock %}
13--DATA--
14return array()
15--EXCEPTION--
16Twig_Error_Runtime: Variable "nothing" does not exist in "index.twig" at line 5
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/multiple.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/multiple.test
new file mode 100644
index 00000000..da161e6d
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/multiple.test
@@ -0,0 +1,50 @@
1--TEST--
2"embed" tag
3--TEMPLATE--
4FOO
5{% embed "foo.twig" %}
6 {% block c1 %}
7 {{ parent() }}
8 block1extended
9 {% endblock %}
10{% endembed %}
11
12{% embed "foo.twig" %}
13 {% block c1 %}
14 {{ parent() }}
15 block1extended
16 {% endblock %}
17{% endembed %}
18
19BAR
20--TEMPLATE(foo.twig)--
21A
22{% block c1 %}
23 block1
24{% endblock %}
25B
26{% block c2 %}
27 block2
28{% endblock %}
29C
30--DATA--
31return array()
32--EXPECT--
33FOO
34
35A
36 block1
37
38 block1extended
39 B
40 block2
41C
42
43A
44 block1
45
46 block1extended
47 B
48 block2
49C
50BAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/nested.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/nested.test
new file mode 100644
index 00000000..81563dce
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/nested.test
@@ -0,0 +1,42 @@
1--TEST--
2"embed" tag
3--TEMPLATE--
4{% embed "foo.twig" %}
5 {% block c1 %}
6 {{ parent() }}
7 {% embed "foo.twig" %}
8 {% block c1 %}
9 {{ parent() }}
10 block1extended
11 {% endblock %}
12 {% endembed %}
13
14 {% endblock %}
15{% endembed %}
16--TEMPLATE(foo.twig)--
17A
18{% block c1 %}
19 block1
20{% endblock %}
21B
22{% block c2 %}
23 block2
24{% endblock %}
25C
26--DATA--
27return array()
28--EXPECT--
29A
30 block1
31
32
33A
34 block1
35
36 block1extended
37 B
38 block2
39C
40 B
41 block2
42C
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/with_extends.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/with_extends.test
new file mode 100644
index 00000000..cf7953d3
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/with_extends.test
@@ -0,0 +1,57 @@
1--TEST--
2"embed" tag
3--TEMPLATE--
4{% extends "base.twig" %}
5
6{% block c1 %}
7 {{ parent() }}
8 blockc1baseextended
9{% endblock %}
10
11{% block c2 %}
12 {{ parent() }}
13
14 {% embed "foo.twig" %}
15 {% block c1 %}
16 {{ parent() }}
17 block1extended
18 {% endblock %}
19 {% endembed %}
20{% endblock %}
21--TEMPLATE(base.twig)--
22A
23{% block c1 %}
24 blockc1base
25{% endblock %}
26{% block c2 %}
27 blockc2base
28{% endblock %}
29B
30--TEMPLATE(foo.twig)--
31A
32{% block c1 %}
33 block1
34{% endblock %}
35B
36{% block c2 %}
37 block2
38{% endblock %}
39C
40--DATA--
41return array()
42--EXPECT--
43A
44 blockc1base
45
46 blockc1baseextended
47 blockc2base
48
49
50
51A
52 block1
53
54 block1extended
55 B
56 block2
57CB \ No newline at end of file
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/basic.test
new file mode 100644
index 00000000..82094f2f
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/basic.test
@@ -0,0 +1,10 @@
1--TEST--
2"filter" tag applies a filter on its children
3--TEMPLATE--
4{% filter upper %}
5Some text with a {{ var }}
6{% endfilter %}
7--DATA--
8return array('var' => 'var')
9--EXPECT--
10SOME TEXT WITH A VAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/json_encode.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/json_encode.test
new file mode 100644
index 00000000..3e7148bf
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/json_encode.test
@@ -0,0 +1,8 @@
1--TEST--
2"filter" tag applies a filter on its children
3--TEMPLATE--
4{% filter json_encode|raw %}test{% endfilter %}
5--DATA--
6return array()
7--EXPECT--
8"test"
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/multiple.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/multiple.test
new file mode 100644
index 00000000..75512ef9
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/multiple.test
@@ -0,0 +1,10 @@
1--TEST--
2"filter" tags accept multiple chained filters
3--TEMPLATE--
4{% filter lower|title %}
5 {{ var }}
6{% endfilter %}
7--DATA--
8return array('var' => 'VAR')
9--EXPECT--
10 Var
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/nested.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/nested.test
new file mode 100644
index 00000000..7e4e4eb3
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/nested.test
@@ -0,0 +1,16 @@
1--TEST--
2"filter" tags can be nested at will
3--TEMPLATE--
4{% filter lower|title %}
5 {{ var }}
6 {% filter upper %}
7 {{ var }}
8 {% endfilter %}
9 {{ var }}
10{% endfilter %}
11--DATA--
12return array('var' => 'var')
13--EXPECT--
14 Var
15 Var
16 Var
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_for_tag.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_for_tag.test
new file mode 100644
index 00000000..22745ead
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_for_tag.test
@@ -0,0 +1,13 @@
1--TEST--
2"filter" tag applies the filter on "for" tags
3--TEMPLATE--
4{% filter upper %}
5{% for item in items %}
6{{ item }}
7{% endfor %}
8{% endfilter %}
9--DATA--
10return array('items' => array('a', 'b'))
11--EXPECT--
12A
13B
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_if_tag.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_if_tag.test
new file mode 100644
index 00000000..afd95b29
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_if_tag.test
@@ -0,0 +1,29 @@
1--TEST--
2"filter" tag applies the filter on "if" tags
3--TEMPLATE--
4{% filter upper %}
5{% if items %}
6{{ items|join(', ') }}
7{% endif %}
8
9{% if items.3 is defined %}
10FOO
11{% else %}
12{{ items.1 }}
13{% endif %}
14
15{% if items.3 is defined %}
16FOO
17{% elseif items.1 %}
18{{ items.0 }}
19{% endif %}
20
21{% endfilter %}
22--DATA--
23return array('items' => array('a', 'b'))
24--EXPECT--
25A, B
26
27B
28
29A
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.test
new file mode 100644
index 00000000..380531f7
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.test
@@ -0,0 +1,14 @@
1--TEST--
2"for" tag takes a condition
3--TEMPLATE--
4{% for i in 1..5 if i is odd -%}
5 {{ loop.index }}.{{ i }}{{ foo.bar }}
6{% endfor %}
7--DATA--
8return array('foo' => array('bar' => 'X'))
9--CONFIG--
10return array('strict_variables' => false)
11--EXPECT--
121.1X
132.3X
143.5X
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/context.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/context.test
new file mode 100644
index 00000000..ddc69307
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/context.test
@@ -0,0 +1,18 @@
1--TEST--
2"for" tag keeps the context safe
3--TEMPLATE--
4{% for item in items %}
5 {% for item in items %}
6 * {{ item }}
7 {% endfor %}
8 * {{ item }}
9{% endfor %}
10--DATA--
11return array('items' => array('a', 'b'))
12--EXPECT--
13 * a
14 * b
15 * a
16 * a
17 * b
18 * b
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/else.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/else.test
new file mode 100644
index 00000000..20ccc880
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/else.test
@@ -0,0 +1,23 @@
1--TEST--
2"for" tag can use an "else" clause
3--TEMPLATE--
4{% for item in items %}
5 * {{ item }}
6{% else %}
7 no item
8{% endfor %}
9--DATA--
10return array('items' => array('a', 'b'))
11--EXPECT--
12 * a
13 * b
14--DATA--
15return array('items' => array())
16--EXPECT--
17 no item
18--DATA--
19return array()
20--CONFIG--
21return array('strict_variables' => false)
22--EXPECT--
23 no item
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/inner_variables.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/inner_variables.test
new file mode 100644
index 00000000..49fb9ca6
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/inner_variables.test
@@ -0,0 +1,17 @@
1--TEST--
2"for" tag does not reset inner variables
3--TEMPLATE--
4{% for i in 1..2 %}
5 {% for j in 0..2 %}
6 {{k}}{% set k = k+1 %} {{ loop.parent.loop.index }}
7 {% endfor %}
8{% endfor %}
9--DATA--
10return array('k' => 0)
11--EXPECT--
12 0 1
13 1 1
14 2 1
15 3 2
16 4 2
17 5 2
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys.test
new file mode 100644
index 00000000..4e22cb47
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys.test
@@ -0,0 +1,11 @@
1--TEST--
2"for" tag can iterate over keys
3--TEMPLATE--
4{% for key in items|keys %}
5 * {{ key }}
6{% endfor %}
7--DATA--
8return array('items' => array('a', 'b'))
9--EXPECT--
10 * 0
11 * 1
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys_and_values.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys_and_values.test
new file mode 100644
index 00000000..4c211689
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys_and_values.test
@@ -0,0 +1,11 @@
1--TEST--
2"for" tag can iterate over keys and values
3--TEMPLATE--
4{% for key, item in items %}
5 * {{ key }}/{{ item }}
6{% endfor %}
7--DATA--
8return array('items' => array('a', 'b'))
9--EXPECT--
10 * 0/a
11 * 1/b
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context.test
new file mode 100644
index 00000000..93bc76a1
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context.test
@@ -0,0 +1,19 @@
1--TEST--
2"for" tag adds a loop variable to the context
3--TEMPLATE--
4{% for item in items %}
5 * {{ loop.index }}/{{ loop.index0 }}
6 * {{ loop.revindex }}/{{ loop.revindex0 }}
7 * {{ loop.first }}/{{ loop.last }}/{{ loop.length }}
8
9{% endfor %}
10--DATA--
11return array('items' => array('a', 'b'))
12--EXPECT--
13 * 1/0
14 * 2/1
15 * 1//2
16
17 * 2/1
18 * 1/0
19 * /1/2
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context_local.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context_local.test
new file mode 100644
index 00000000..58af2c32
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context_local.test
@@ -0,0 +1,10 @@
1--TEST--
2"for" tag adds a loop variable to the context locally
3--TEMPLATE--
4{% for item in items %}
5{% endfor %}
6{% if loop is not defined %}WORKS{% endif %}
7--DATA--
8return array('items' => array())
9--EXPECT--
10WORKS
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined.test
new file mode 100644
index 00000000..4301ef2f
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined.test
@@ -0,0 +1,10 @@
1--TEST--
2"for" tag
3--TEMPLATE--
4{% for i, item in items if i > 0 %}
5 {{ loop.last }}
6{% endfor %}
7--DATA--
8return array('items' => array('a', 'b'))
9--EXCEPTION--
10Twig_Error_Syntax: The "loop.last" variable is not defined when looping with a condition in "index.twig" at line 3
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined_cond.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined_cond.test
new file mode 100644
index 00000000..c7e723a5
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined_cond.test
@@ -0,0 +1,9 @@
1--TEST--
2"for" tag
3--TEMPLATE--
4{% for i, item in items if loop.last > 0 %}
5{% endfor %}
6--DATA--
7return array('items' => array('a', 'b'))
8--EXCEPTION--
9Twig_Error_Syntax: The "loop" variable cannot be used in a looping condition in "index.twig" at line 2
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/nested_else.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/nested_else.test
new file mode 100644
index 00000000..f8b9f6bc
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/nested_else.test
@@ -0,0 +1,17 @@
1--TEST--
2"for" tag can use an "else" clause
3--TEMPLATE--
4{% for item in items %}
5 {% for item in items1 %}
6 * {{ item }}
7 {% else %}
8 no {{ item }}
9 {% endfor %}
10{% else %}
11 no item1
12{% endfor %}
13--DATA--
14return array('items' => array('a', 'b'), 'items1' => array())
15--EXPECT--
16no a
17 no b
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects.test
new file mode 100644
index 00000000..50344379
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects.test
@@ -0,0 +1,43 @@
1--TEST--
2"for" tag iterates over iterable objects
3--TEMPLATE--
4{% for item in items %}
5 * {{ item }}
6 * {{ loop.index }}/{{ loop.index0 }}
7 * {{ loop.first }}
8
9{% endfor %}
10
11{% for key, value in items %}
12 * {{ key }}/{{ value }}
13{% endfor %}
14
15{% for key in items|keys %}
16 * {{ key }}
17{% endfor %}
18--DATA--
19class ItemsIterator implements Iterator
20{
21 protected $values = array('foo' => 'bar', 'bar' => 'foo');
22 public function current() { return current($this->values); }
23 public function key() { return key($this->values); }
24 public function next() { return next($this->values); }
25 public function rewind() { return reset($this->values); }
26 public function valid() { return false !== current($this->values); }
27}
28return array('items' => new ItemsIterator())
29--EXPECT--
30 * bar
31 * 1/0
32 * 1
33
34 * foo
35 * 2/1
36 *
37
38
39 * foo/bar
40 * bar/foo
41
42 * foo
43 * bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects_countable.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects_countable.test
new file mode 100644
index 00000000..4a1ff611
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects_countable.test
@@ -0,0 +1,47 @@
1--TEST--
2"for" tag iterates over iterable and countable objects
3--TEMPLATE--
4{% for item in items %}
5 * {{ item }}
6 * {{ loop.index }}/{{ loop.index0 }}
7 * {{ loop.revindex }}/{{ loop.revindex0 }}
8 * {{ loop.first }}/{{ loop.last }}/{{ loop.length }}
9
10{% endfor %}
11
12{% for key, value in items %}
13 * {{ key }}/{{ value }}
14{% endfor %}
15
16{% for key in items|keys %}
17 * {{ key }}
18{% endfor %}
19--DATA--
20class ItemsIteratorCountable implements Iterator, Countable
21{
22 protected $values = array('foo' => 'bar', 'bar' => 'foo');
23 public function current() { return current($this->values); }
24 public function key() { return key($this->values); }
25 public function next() { return next($this->values); }
26 public function rewind() { return reset($this->values); }
27 public function valid() { return false !== current($this->values); }
28 public function count() { return count($this->values); }
29}
30return array('items' => new ItemsIteratorCountable())
31--EXPECT--
32 * bar
33 * 1/0
34 * 2/1
35 * 1//2
36
37 * foo
38 * 2/1
39 * 1/0
40 * /1/2
41
42
43 * foo/bar
44 * bar/foo
45
46 * foo
47 * bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/recursive.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/recursive.test
new file mode 100644
index 00000000..17b2e222
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/recursive.test
@@ -0,0 +1,18 @@
1--TEST--
2"for" tags can be nested
3--TEMPLATE--
4{% for key, item in items %}
5* {{ key }} ({{ loop.length }}):
6{% for value in item %}
7 * {{ value }} ({{ loop.length }})
8{% endfor %}
9{% endfor %}
10--DATA--
11return array('items' => array('a' => array('a1', 'a2', 'a3'), 'b' => array('b1')))
12--EXPECT--
13* a (2):
14 * a1 (3)
15 * a2 (3)
16 * a3 (3)
17* b (2):
18 * b1 (1)
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/values.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/values.test
new file mode 100644
index 00000000..82f2ae8a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/values.test
@@ -0,0 +1,11 @@
1--TEST--
2"for" tag iterates over item values
3--TEMPLATE--
4{% for item in items %}
5 * {{ item }}
6{% endfor %}
7--DATA--
8return array('items' => array('a', 'b'))
9--EXPECT--
10 * a
11 * b
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/from.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/from.test
new file mode 100644
index 00000000..5f5da0ec
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/from.test
@@ -0,0 +1,14 @@
1--TEST--
2global variables
3--TEMPLATE--
4{% include "included.twig" %}
5{% from "included.twig" import foobar %}
6{{ foobar() }}
7--TEMPLATE(included.twig)--
8{% macro foobar() %}
9called foobar
10{% endmacro %}
11--DATA--
12return array();
13--EXPECT--
14called foobar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/basic.test
new file mode 100644
index 00000000..c1c3d276
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/basic.test
@@ -0,0 +1,22 @@
1--TEST--
2"if" creates a condition
3--TEMPLATE--
4{% if a is defined %}
5 {{ a }}
6{% elseif b is defined %}
7 {{ b }}
8{% else %}
9 NOTHING
10{% endif %}
11--DATA--
12return array('a' => 'a')
13--EXPECT--
14 a
15--DATA--
16return array('b' => 'b')
17--EXPECT--
18 b
19--DATA--
20return array()
21--EXPECT--
22 NOTHING
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/expression.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/expression.test
new file mode 100644
index 00000000..edfb73df
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/expression.test
@@ -0,0 +1,22 @@
1--TEST--
2"if" takes an expression as a test
3--TEMPLATE--
4{% if a < 2 %}
5 A1
6{% elseif a > 10 %}
7 A2
8{% else %}
9 A3
10{% endif %}
11--DATA--
12return array('a' => 1)
13--EXPECT--
14 A1
15--DATA--
16return array('a' => 12)
17--EXPECT--
18 A2
19--DATA--
20return array('a' => 7)
21--EXPECT--
22 A3
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/basic.test
new file mode 100644
index 00000000..8fe1a6c1
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/basic.test
@@ -0,0 +1,16 @@
1--TEST--
2"include" tag
3--TEMPLATE--
4FOO
5{% include "foo.twig" %}
6
7BAR
8--TEMPLATE(foo.twig)--
9FOOBAR
10--DATA--
11return array()
12--EXPECT--
13FOO
14
15FOOBAR
16BAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/expression.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/expression.test
new file mode 100644
index 00000000..eaeeb112
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/expression.test
@@ -0,0 +1,16 @@
1--TEST--
2"include" tag allows expressions for the template to include
3--TEMPLATE--
4FOO
5{% include foo %}
6
7BAR
8--TEMPLATE(foo.twig)--
9FOOBAR
10--DATA--
11return array('foo' => 'foo.twig')
12--EXPECT--
13FOO
14
15FOOBAR
16BAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/ignore_missing.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/ignore_missing.test
new file mode 100644
index 00000000..24aed06d
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/ignore_missing.test
@@ -0,0 +1,10 @@
1--TEST--
2"include" tag
3--TEMPLATE--
4{% include ["foo.twig", "bar.twig"] ignore missing %}
5{% include "foo.twig" ignore missing %}
6{% include "foo.twig" ignore missing with {} %}
7{% include "foo.twig" ignore missing with {} only %}
8--DATA--
9return array()
10--EXPECT--
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing.test
new file mode 100644
index 00000000..f25e8715
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing.test
@@ -0,0 +1,8 @@
1--TEST--
2"include" tag
3--TEMPLATE--
4{% include "foo.twig" %}
5--DATA--
6return array();
7--EXCEPTION--
8Twig_Error_Loader: Template "foo.twig" is not defined in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing_nested.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing_nested.test
new file mode 100644
index 00000000..86c18644
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing_nested.test
@@ -0,0 +1,16 @@
1--TEST--
2"include" tag
3--TEMPLATE--
4{% extends "base.twig" %}
5
6{% block content %}
7 {{ parent() }}
8{% endblock %}
9--TEMPLATE(base.twig)--
10{% block content %}
11 {% include "foo.twig" %}
12{% endblock %}
13--DATA--
14return array();
15--EXCEPTION--
16Twig_Error_Loader: Template "foo.twig" is not defined in "base.twig" at line 3.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/only.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/only.test
new file mode 100644
index 00000000..77760a09
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/only.test
@@ -0,0 +1,16 @@
1--TEST--
2"include" tag accept variables and only
3--TEMPLATE--
4{% include "foo.twig" %}
5{% include "foo.twig" only %}
6{% include "foo.twig" with {'foo1': 'bar'} %}
7{% include "foo.twig" with {'foo1': 'bar'} only %}
8--TEMPLATE(foo.twig)--
9{% for k, v in _context %}{{ k }},{% endfor %}
10--DATA--
11return array('foo' => 'bar')
12--EXPECT--
13foo,global,_parent,
14global,_parent,
15foo,global,foo1,_parent,
16foo1,global,_parent,
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/template_instance.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/template_instance.test
new file mode 100644
index 00000000..6ba064a3
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/template_instance.test
@@ -0,0 +1,10 @@
1--TEST--
2"include" tag accepts Twig_Template instance
3--TEMPLATE--
4{% include foo %} FOO
5--TEMPLATE(foo.twig)--
6BAR
7--DATA--
8return array('foo' => $twig->loadTemplate('foo.twig'))
9--EXPECT--
10BAR FOO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/templates_as_array.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/templates_as_array.test
new file mode 100644
index 00000000..ab670ee0
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/templates_as_array.test
@@ -0,0 +1,12 @@
1--TEST--
2"include" tag
3--TEMPLATE--
4{% include ["foo.twig", "bar.twig"] %}
5{% include ["bar.twig", "foo.twig"] %}
6--TEMPLATE(foo.twig)--
7foo
8--DATA--
9return array()
10--EXPECT--
11foo
12foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/with_variables.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/with_variables.test
new file mode 100644
index 00000000..41384ac7
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/with_variables.test
@@ -0,0 +1,12 @@
1--TEST--
2"include" tag accept variables
3--TEMPLATE--
4{% include "foo.twig" with {'foo': 'bar'} %}
5{% include "foo.twig" with vars %}
6--TEMPLATE(foo.twig)--
7{{ foo }}
8--DATA--
9return array('vars' => array('foo' => 'bar'))
10--EXPECT--
11bar
12bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/basic.test
new file mode 100644
index 00000000..0778a4b4
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/basic.test
@@ -0,0 +1,14 @@
1--TEST--
2"extends" tag
3--TEMPLATE--
4{% extends "foo.twig" %}
5
6{% block content %}
7FOO
8{% endblock %}
9--TEMPLATE(foo.twig)--
10{% block content %}{% endblock %}
11--DATA--
12return array()
13--EXPECT--
14FOO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/conditional.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/conditional.test
new file mode 100644
index 00000000..8576e773
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/conditional.test
@@ -0,0 +1,14 @@
1--TEST--
2"extends" tag
3--TEMPLATE--
4{% extends standalone ? foo : 'bar.twig' %}
5
6{% block content %}{{ parent() }}FOO{% endblock %}
7--TEMPLATE(foo.twig)--
8{% block content %}FOO{% endblock %}
9--TEMPLATE(bar.twig)--
10{% block content %}BAR{% endblock %}
11--DATA--
12return array('foo' => 'foo.twig', 'standalone' => true)
13--EXPECT--
14FOOFOO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/dynamic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/dynamic.test
new file mode 100644
index 00000000..ee06ddce
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/dynamic.test
@@ -0,0 +1,14 @@
1--TEST--
2"extends" tag
3--TEMPLATE--
4{% extends foo %}
5
6{% block content %}
7FOO
8{% endblock %}
9--TEMPLATE(foo.twig)--
10{% block content %}{% endblock %}
11--DATA--
12return array('foo' => 'foo.twig')
13--EXPECT--
14FOO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/empty.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/empty.test
new file mode 100644
index 00000000..784f3571
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/empty.test
@@ -0,0 +1,10 @@
1--TEST--
2"extends" tag
3--TEMPLATE--
4{% extends "foo.twig" %}
5--TEMPLATE(foo.twig)--
6{% block content %}FOO{% endblock %}
7--DATA--
8return array()
9--EXPECT--
10FOO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array.test
new file mode 100644
index 00000000..a1cb1ce8
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array.test
@@ -0,0 +1,12 @@
1--TEST--
2"extends" tag
3--TEMPLATE--
4{% extends ["foo.twig", "bar.twig"] %}
5--TEMPLATE(bar.twig)--
6{% block content %}
7foo
8{% endblock %}
9--DATA--
10return array()
11--EXPECT--
12foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple.test
new file mode 100644
index 00000000..dfc2b6c4
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple.test
@@ -0,0 +1,12 @@
1--TEST--
2"extends" tag
3--TEMPLATE--
4{% extends "layout.twig" %}{% block content %}{{ parent() }}index {% endblock %}
5--TEMPLATE(layout.twig)--
6{% extends "base.twig" %}{% block content %}{{ parent() }}layout {% endblock %}
7--TEMPLATE(base.twig)--
8{% block content %}base {% endblock %}
9--DATA--
10return array()
11--EXPECT--
12base layout index
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks.test
new file mode 100644
index 00000000..faca9259
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks.test
@@ -0,0 +1,22 @@
1--TEST--
2"block" tag
3--TEMPLATE--
4{% extends "foo.twig" %}
5
6{% block content %}
7 {% block subcontent %}
8 {% block subsubcontent %}
9 SUBSUBCONTENT
10 {% endblock %}
11 {% endblock %}
12{% endblock %}
13--TEMPLATE(foo.twig)--
14{% block content %}
15 {% block subcontent %}
16 SUBCONTENT
17 {% endblock %}
18{% endblock %}
19--DATA--
20return array()
21--EXPECT--
22SUBSUBCONTENT
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks_parent_only.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks_parent_only.test
new file mode 100644
index 00000000..0ad11d0c
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks_parent_only.test
@@ -0,0 +1,15 @@
1--TEST--
2"block" tag
3--TEMPLATE--
4{% block content %}
5 CONTENT
6 {%- block subcontent -%}
7 SUBCONTENT
8 {%- endblock -%}
9 ENDCONTENT
10{% endblock %}
11--TEMPLATE(foo.twig)--
12--DATA--
13return array()
14--EXPECT--
15CONTENTSUBCONTENTENDCONTENT
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_inheritance.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_inheritance.test
new file mode 100644
index 00000000..71e3cdfd
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_inheritance.test
@@ -0,0 +1,16 @@
1--TEST--
2"extends" tag
3--TEMPLATE--
4{% extends "layout.twig" %}
5{% block inside %}INSIDE{% endblock inside %}
6--TEMPLATE(layout.twig)--
7{% extends "base.twig" %}
8{% block body %}
9 {% block inside '' %}
10{% endblock body %}
11--TEMPLATE(base.twig)--
12{% block body '' %}
13--DATA--
14return array()
15--EXPECT--
16INSIDE
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent.test
new file mode 100644
index 00000000..4f975db8
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent.test
@@ -0,0 +1,12 @@
1--TEST--
2"extends" tag
3--TEMPLATE--
4{% extends "foo.twig" %}
5
6{% block content %}{{ parent() }}FOO{{ parent() }}{% endblock %}
7--TEMPLATE(foo.twig)--
8{% block content %}BAR{% endblock %}
9--DATA--
10return array()
11--EXPECT--
12BARFOOBAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_change.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_change.test
new file mode 100644
index 00000000..a8bc90ce
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_change.test
@@ -0,0 +1,16 @@
1--TEST--
2"extends" tag
3--TEMPLATE--
4{% extends foo ? 'foo.twig' : 'bar.twig' %}
5--TEMPLATE(foo.twig)--
6FOO
7--TEMPLATE(bar.twig)--
8BAR
9--DATA--
10return array('foo' => true)
11--EXPECT--
12FOO
13--DATA--
14return array('foo' => false)
15--EXPECT--
16BAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_in_a_block.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_in_a_block.test
new file mode 100644
index 00000000..c9e86b1a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_in_a_block.test
@@ -0,0 +1,8 @@
1--TEST--
2"extends" tag
3--TEMPLATE--
4{% block content %}
5 {% extends "foo.twig" %}
6{% endblock %}
7--EXCEPTION--
8Twig_Error_Syntax: Cannot extend from a block in "index.twig" at line 3
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_isolation.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_isolation.test
new file mode 100644
index 00000000..62816713
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_isolation.test
@@ -0,0 +1,20 @@
1--TEST--
2"extends" tag
3--TEMPLATE--
4{% extends "base.twig" %}
5{% block content %}{% include "included.twig" %}{% endblock %}
6
7{% block footer %}Footer{% endblock %}
8--TEMPLATE(included.twig)--
9{% extends "base.twig" %}
10{% block content %}Included Content{% endblock %}
11--TEMPLATE(base.twig)--
12{% block content %}Default Content{% endblock %}
13
14{% block footer %}Default Footer{% endblock %}
15--DATA--
16return array()
17--EXPECT--
18Included Content
19Default Footer
20Footer
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_nested.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_nested.test
new file mode 100644
index 00000000..71e7c208
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_nested.test
@@ -0,0 +1,28 @@
1--TEST--
2"extends" tag
3--TEMPLATE--
4{% extends "foo.twig" %}
5
6{% block content %}
7 {% block inside %}
8 INSIDE OVERRIDDEN
9 {% endblock %}
10
11 BEFORE
12 {{ parent() }}
13 AFTER
14{% endblock %}
15--TEMPLATE(foo.twig)--
16{% block content %}
17 BAR
18{% endblock %}
19--DATA--
20return array()
21--EXPECT--
22
23INSIDE OVERRIDDEN
24
25 BEFORE
26 BAR
27
28 AFTER
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends.test
new file mode 100644
index 00000000..a9eaa4c1
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends.test
@@ -0,0 +1,8 @@
1--TEST--
2"parent" tag
3--TEMPLATE--
4{% block content %}
5 {{ parent() }}
6{% endblock %}
7--EXCEPTION--
8Twig_Error_Syntax: Calling "parent" on a template that does not extend nor "use" another template is forbidden in "index.twig" at line 3
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends_but_traits.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends_but_traits.test
new file mode 100644
index 00000000..63c73055
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends_but_traits.test
@@ -0,0 +1,14 @@
1--TEST--
2"parent" tag
3--TEMPLATE--
4{% use 'foo.twig' %}
5
6{% block content %}
7 {{ parent() }}
8{% endblock %}
9--TEMPLATE(foo.twig)--
10{% block content %}BAR{% endblock %}
11--DATA--
12return array()
13--EXPECT--
14BAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/template_instance.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/template_instance.test
new file mode 100644
index 00000000..d1876a52
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/template_instance.test
@@ -0,0 +1,14 @@
1--TEST--
2"extends" tag accepts Twig_Template instance
3--TEMPLATE--
4{% extends foo %}
5
6{% block content %}
7{{ parent() }}FOO
8{% endblock %}
9--TEMPLATE(foo.twig)--
10{% block content %}BAR{% endblock %}
11--DATA--
12return array('foo' => $twig->loadTemplate('foo.twig'))
13--EXPECT--
14BARFOO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/use.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/use.test
new file mode 100644
index 00000000..8f9ece7c
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/use.test
@@ -0,0 +1,44 @@
1--TEST--
2"parent" function
3--TEMPLATE--
4{% extends "parent.twig" %}
5
6{% use "use1.twig" %}
7{% use "use2.twig" %}
8
9{% block content_parent %}
10 {{ parent() }}
11{% endblock %}
12
13{% block content_use1 %}
14 {{ parent() }}
15{% endblock %}
16
17{% block content_use2 %}
18 {{ parent() }}
19{% endblock %}
20
21{% block content %}
22 {{ block('content_use1_only') }}
23 {{ block('content_use2_only') }}
24{% endblock %}
25--TEMPLATE(parent.twig)--
26{% block content_parent 'content_parent' %}
27{% block content_use1 'content_parent' %}
28{% block content_use2 'content_parent' %}
29{% block content '' %}
30--TEMPLATE(use1.twig)--
31{% block content_use1 'content_use1' %}
32{% block content_use2 'content_use1' %}
33{% block content_use1_only 'content_use1_only' %}
34--TEMPLATE(use2.twig)--
35{% block content_use2 'content_use2' %}
36{% block content_use2_only 'content_use2_only' %}
37--DATA--
38return array()
39--EXPECT--
40 content_parent
41 content_use1
42 content_use2
43 content_use1_only
44 content_use2_only
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/basic.test
new file mode 100644
index 00000000..eef0c10d
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/basic.test
@@ -0,0 +1,17 @@
1--TEST--
2"macro" tag
3--TEMPLATE--
4{% import _self as macros %}
5
6{{ macros.input('username') }}
7{{ macros.input('password', null, 'password', 1) }}
8
9{% macro input(name, value, type, size) %}
10 <input type="{{ type|default("text") }}" name="{{ name }}" value="{{ value|e|default('') }}" size="{{ size|default(20) }}">
11{% endmacro %}
12--DATA--
13return array()
14--EXPECT--
15 <input type="text" name="username" value="" size="20">
16
17 <input type="password" name="password" value="" size="1">
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/endmacro_name.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/endmacro_name.test
new file mode 100644
index 00000000..ae6203bb
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/endmacro_name.test
@@ -0,0 +1,16 @@
1--TEST--
2"macro" tag supports name for endmacro
3--TEMPLATE--
4{% import _self as macros %}
5
6{{ macros.foo() }}
7{{ macros.bar() }}
8
9{% macro foo() %}foo{% endmacro %}
10{% macro bar() %}bar{% endmacro bar %}
11--DATA--
12return array()
13--EXPECT--
14foo
15bar
16
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/external.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/external.test
new file mode 100644
index 00000000..5cd3dae6
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/external.test
@@ -0,0 +1,17 @@
1--TEST--
2"macro" tag
3--TEMPLATE--
4{% import 'forms.twig' as forms %}
5
6{{ forms.input('username') }}
7{{ forms.input('password', null, 'password', 1) }}
8--TEMPLATE(forms.twig)--
9{% macro input(name, value, type, size) %}
10 <input type="{{ type|default("text") }}" name="{{ name }}" value="{{ value|e|default('') }}" size="{{ size|default(20) }}">
11{% endmacro %}
12--DATA--
13return array()
14--EXPECT--
15 <input type="text" name="username" value="" size="20">
16
17 <input type="password" name="password" value="" size="1">
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from.test
new file mode 100644
index 00000000..205f5918
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from.test
@@ -0,0 +1,18 @@
1--TEST--
2"macro" tag
3--TEMPLATE--
4{% from 'forms.twig' import foo %}
5{% from 'forms.twig' import foo as foobar, bar %}
6
7{{ foo('foo') }}
8{{ foobar('foo') }}
9{{ bar('foo') }}
10--TEMPLATE(forms.twig)--
11{% macro foo(name) %}foo{{ name }}{% endmacro %}
12{% macro bar(name) %}bar{{ name }}{% endmacro %}
13--DATA--
14return array()
15--EXPECT--
16foofoo
17foofoo
18barfoo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/global.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/global.test
new file mode 100644
index 00000000..6b371768
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/global.test
@@ -0,0 +1,14 @@
1--TEST--
2"macro" tag
3--TEMPLATE--
4{% from 'forms.twig' import foo %}
5
6{{ foo('foo') }}
7{{ foo() }}
8--TEMPLATE(forms.twig)--
9{% macro foo(name) %}{{ name|default('foo') }}{{ global }}{% endmacro %}
10--DATA--
11return array()
12--EXPECT--
13fooglobal
14fooglobal
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/self_import.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/self_import.test
new file mode 100644
index 00000000..17756cb6
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/self_import.test
@@ -0,0 +1,17 @@
1--TEST--
2"macro" tag
3--TEMPLATE--
4{% import _self as forms %}
5
6{{ forms.input('username') }}
7{{ forms.input('password', null, 'password', 1) }}
8
9{% macro input(name, value, type, size) %}
10 <input type="{{ type|default("text") }}" name="{{ name }}" value="{{ value|e|default('') }}" size="{{ size|default(20) }}">
11{% endmacro %}
12--DATA--
13return array()
14--EXPECT--
15 <input type="text" name="username" value="" size="20">
16
17 <input type="password" name="password" value="" size="1">
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/special_chars.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/special_chars.test
new file mode 100644
index 00000000..37217707
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/special_chars.test
@@ -0,0 +1,14 @@
1--TEST--
2"§" as a macro name
3--TEMPLATE--
4{% import _self as macros %}
5
6{{ macros.§('foo') }}
7
8{% macro §(foo) %}
9 §{{ foo }}§
10{% endmacro %}
11--DATA--
12return array()
13--EXPECT--
14§foo§
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/basic.test
new file mode 100644
index 00000000..0445e853
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/basic.test
@@ -0,0 +1,10 @@
1--TEST--
2"raw" tag
3--TEMPLATE--
4{% raw %}
5{{ foo }}
6{% endraw %}
7--DATA--
8return array()
9--EXPECT--
10{{ foo }}
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/mixed_usage_with_raw.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/mixed_usage_with_raw.test
new file mode 100644
index 00000000..2fd9fb26
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/mixed_usage_with_raw.test
@@ -0,0 +1,10 @@
1--TEST--
2"raw" tag
3--TEMPLATE--
4{% raw %}
5{{ foo }}
6{% endverbatim %}
7--DATA--
8return array()
9--EXCEPTION--
10Twig_Error_Syntax: Unexpected end of file: Unclosed "raw" block in "index.twig" at line 2
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/whitespace_control.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/whitespace_control.test
new file mode 100644
index 00000000..352bb187
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/whitespace_control.test
@@ -0,0 +1,56 @@
1--TEST--
2"raw" tag
3--TEMPLATE--
41***
5
6{%- raw %}
7 {{ 'bla' }}
8{% endraw %}
9
101***
112***
12
13{%- raw -%}
14 {{ 'bla' }}
15{% endraw %}
16
172***
183***
19
20{%- raw -%}
21 {{ 'bla' }}
22{% endraw -%}
23
243***
254***
26
27{%- raw -%}
28 {{ 'bla' }}
29{%- endraw %}
30
314***
325***
33
34{%- raw -%}
35 {{ 'bla' }}
36{%- endraw -%}
37
385***
39--DATA--
40return array()
41--EXPECT--
421***
43 {{ 'bla' }}
44
45
461***
472***{{ 'bla' }}
48
49
502***
513***{{ 'bla' }}
523***
534***{{ 'bla' }}
54
554***
565***{{ 'bla' }}5***
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid1.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid1.test
new file mode 100644
index 00000000..683c59a0
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid1.test
@@ -0,0 +1,11 @@
1--TEST--
2sandbox tag
3--TEMPLATE--
4{%- sandbox %}
5 {%- include "foo.twig" %}
6 a
7{%- endsandbox %}
8--TEMPLATE(foo.twig)--
9foo
10--EXCEPTION--
11Twig_Error_Syntax: Only "include" tags are allowed within a "sandbox" section in "index.twig" at line 4
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid2.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid2.test
new file mode 100644
index 00000000..3dcfa88c
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid2.test
@@ -0,0 +1,14 @@
1--TEST--
2sandbox tag
3--TEMPLATE--
4{%- sandbox %}
5 {%- include "foo.twig" %}
6
7 {% if 1 %}
8 {%- include "foo.twig" %}
9 {% endif %}
10{%- endsandbox %}
11--TEMPLATE(foo.twig)--
12foo
13--EXCEPTION--
14Twig_Error_Syntax: Only "include" tags are allowed within a "sandbox" section in "index.twig" at line 5
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/simple.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/simple.test
new file mode 100644
index 00000000..de20f3db
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/simple.test
@@ -0,0 +1,22 @@
1--TEST--
2sandbox tag
3--TEMPLATE--
4{%- sandbox %}
5 {%- include "foo.twig" %}
6{%- endsandbox %}
7
8{%- sandbox %}
9 {%- include "foo.twig" %}
10 {%- include "foo.twig" %}
11{%- endsandbox %}
12
13{%- sandbox %}{% include "foo.twig" %}{% endsandbox %}
14--TEMPLATE(foo.twig)--
15foo
16--DATA--
17return array()
18--EXPECT--
19foo
20foo
21foo
22foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/basic.test
new file mode 100644
index 00000000..a5a9f830
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/basic.test
@@ -0,0 +1,20 @@
1--TEST--
2"set" tag
3--TEMPLATE--
4{% set foo = 'foo' %}
5{% set bar = 'foo<br />' %}
6
7{{ foo }}
8{{ bar }}
9
10{% set foo, bar = 'foo', 'bar' %}
11
12{{ foo }}{{ bar }}
13--DATA--
14return array()
15--EXPECT--
16foo
17foo&lt;br /&gt;
18
19
20foobar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture-empty.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture-empty.test
new file mode 100644
index 00000000..ec657f00
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture-empty.test
@@ -0,0 +1,9 @@
1--TEST--
2"set" tag block empty capture
3--TEMPLATE--
4{% set foo %}{% endset %}
5
6{% if foo %}FAIL{% endif %}
7--DATA--
8return array()
9--EXPECT--
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture.test
new file mode 100644
index 00000000..f156a1a7
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture.test
@@ -0,0 +1,10 @@
1--TEST--
2"set" tag block capture
3--TEMPLATE--
4{% set foo %}f<br />o<br />o{% endset %}
5
6{{ foo }}
7--DATA--
8return array()
9--EXPECT--
10f<br />o<br />o
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/expression.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/expression.test
new file mode 100644
index 00000000..8ff434a0
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/expression.test
@@ -0,0 +1,12 @@
1--TEST--
2"set" tag
3--TEMPLATE--
4{% set foo, bar = 'foo' ~ 'bar', 'bar' ~ 'foo' %}
5
6{{ foo }}
7{{ bar }}
8--DATA--
9return array()
10--EXPECT--
11foobar
12barfoo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/spaceless/simple.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/spaceless/simple.test
new file mode 100644
index 00000000..dd06dec2
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/spaceless/simple.test
@@ -0,0 +1,12 @@
1--TEST--
2"spaceless" tag removes whites between HTML tags
3--TEMPLATE--
4{% spaceless %}
5
6 <div> <div> foo </div> </div>
7
8{% endspaceless %}
9--DATA--
10return array()
11--EXPECT--
12<div><div> foo </div></div>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/special_chars.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/special_chars.test
new file mode 100644
index 00000000..789b4ba8
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/special_chars.test
@@ -0,0 +1,8 @@
1--TEST--
2"§" custom tag
3--TEMPLATE--
4{% § %}
5--DATA--
6return array()
7--EXPECT--
8§
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/trim_block.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/trim_block.test
new file mode 100644
index 00000000..1d2273f8
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/trim_block.test
@@ -0,0 +1,74 @@
1--TEST--
2Whitespace trimming on tags.
3--TEMPLATE--
4{{ 5 * '{#-'|length }}
5{{ '{{-'|length * 5 + '{%-'|length }}
6
7Trim on control tag:
8{% for i in range(1, 9) -%}
9 {{ i }}
10{%- endfor %}
11
12
13Trim on output tag:
14{% for i in range(1, 9) %}
15 {{- i -}}
16{% endfor %}
17
18
19Trim comments:
20
21{#- Invisible -#}
22
23After the comment.
24
25Trim leading space:
26{% if leading %}
27
28 {{- leading }}
29{% endif %}
30
31{%- if leading %}
32 {{- leading }}
33
34{%- endif %}
35
36
37Trim trailing space:
38{% if trailing -%}
39 {{ trailing -}}
40
41{% endif -%}
42
43Combined:
44
45{%- if both -%}
46<ul>
47 <li> {{- both -}} </li>
48</ul>
49
50{%- endif -%}
51
52end
53--DATA--
54return array('leading' => 'leading space', 'trailing' => 'trailing space', 'both' => 'both')
55--EXPECT--
5615
5718
58
59Trim on control tag:
60123456789
61
62Trim on output tag:
63123456789
64
65Trim comments:After the comment.
66
67Trim leading space:
68leading space
69leading space
70
71Trim trailing space:
72trailing spaceCombined:<ul>
73 <li>both</li>
74</ul>end
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/aliases.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/aliases.test
new file mode 100644
index 00000000..f887006f
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/aliases.test
@@ -0,0 +1,12 @@
1--TEST--
2"use" tag
3--TEMPLATE--
4{% use "blocks.twig" with content as foo %}
5
6{{ block('foo') }}
7--TEMPLATE(blocks.twig)--
8{% block content 'foo' %}
9--DATA--
10return array()
11--EXPECT--
12foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/basic.test
new file mode 100644
index 00000000..7364d76d
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/basic.test
@@ -0,0 +1,12 @@
1--TEST--
2"use" tag
3--TEMPLATE--
4{% use "blocks.twig" %}
5
6{{ block('content') }}
7--TEMPLATE(blocks.twig)--
8{% block content 'foo' %}
9--DATA--
10return array()
11--EXPECT--
12foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep.test
new file mode 100644
index 00000000..b551a1e6
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep.test
@@ -0,0 +1,22 @@
1--TEST--
2"use" tag
3--TEMPLATE--
4{% use "foo.twig" %}
5
6{{ block('content') }}
7{{ block('foo') }}
8{{ block('bar') }}
9--TEMPLATE(foo.twig)--
10{% use "bar.twig" %}
11
12{% block content 'foo' %}
13{% block foo 'foo' %}
14--TEMPLATE(bar.twig)--
15{% block content 'bar' %}
16{% block bar 'bar' %}
17--DATA--
18return array()
19--EXPECT--
20foo
21foo
22bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep_empty.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep_empty.test
new file mode 100644
index 00000000..05cca682
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep_empty.test
@@ -0,0 +1,10 @@
1--TEST--
2"use" tag
3--TEMPLATE--
4{% use "foo.twig" %}
5--TEMPLATE(foo.twig)--
6{% use "bar.twig" %}
7--TEMPLATE(bar.twig)--
8--DATA--
9return array()
10--EXPECT--
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple.test
new file mode 100644
index 00000000..198be0c5
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple.test
@@ -0,0 +1,21 @@
1--TEST--
2"use" tag
3--TEMPLATE--
4{% use "foo.twig" %}
5{% use "bar.twig" %}
6
7{{ block('content') }}
8{{ block('foo') }}
9{{ block('bar') }}
10--TEMPLATE(foo.twig)--
11{% block content 'foo' %}
12{% block foo 'foo' %}
13--TEMPLATE(bar.twig)--
14{% block content 'bar' %}
15{% block bar 'bar' %}
16--DATA--
17return array()
18--EXPECT--
19bar
20foo
21bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple_aliases.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple_aliases.test
new file mode 100644
index 00000000..8de871a8
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple_aliases.test
@@ -0,0 +1,23 @@
1--TEST--
2"use" tag
3--TEMPLATE--
4{% use "foo.twig" with content as foo_content %}
5{% use "bar.twig" %}
6
7{{ block('content') }}
8{{ block('foo') }}
9{{ block('bar') }}
10{{ block('foo_content') }}
11--TEMPLATE(foo.twig)--
12{% block content 'foo' %}
13{% block foo 'foo' %}
14--TEMPLATE(bar.twig)--
15{% block content 'bar' %}
16{% block bar 'bar' %}
17--DATA--
18return array()
19--EXPECT--
20bar
21foo
22bar
23foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/basic.test
new file mode 100644
index 00000000..a95be557
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/basic.test
@@ -0,0 +1,10 @@
1--TEST--
2"verbatim" tag
3--TEMPLATE--
4{% verbatim %}
5{{ foo }}
6{% endverbatim %}
7--DATA--
8return array()
9--EXPECT--
10{{ foo }}
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/mixed_usage_with_raw.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/mixed_usage_with_raw.test
new file mode 100644
index 00000000..941dddcc
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/mixed_usage_with_raw.test
@@ -0,0 +1,10 @@
1--TEST--
2"verbatim" tag
3--TEMPLATE--
4{% verbatim %}
5{{ foo }}
6{% endraw %}
7--DATA--
8return array()
9--EXCEPTION--
10Twig_Error_Syntax: Unexpected end of file: Unclosed "verbatim" block in "index.twig" at line 2
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/whitespace_control.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/whitespace_control.test
new file mode 100644
index 00000000..eb610444
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/whitespace_control.test
@@ -0,0 +1,56 @@
1--TEST--
2"verbatim" tag
3--TEMPLATE--
41***
5
6{%- verbatim %}
7 {{ 'bla' }}
8{% endverbatim %}
9
101***
112***
12
13{%- verbatim -%}
14 {{ 'bla' }}
15{% endverbatim %}
16
172***
183***
19
20{%- verbatim -%}
21 {{ 'bla' }}
22{% endverbatim -%}
23
243***
254***
26
27{%- verbatim -%}
28 {{ 'bla' }}
29{%- endverbatim %}
30
314***
325***
33
34{%- verbatim -%}
35 {{ 'bla' }}
36{%- endverbatim -%}
37
385***
39--DATA--
40return array()
41--EXPECT--
421***
43 {{ 'bla' }}
44
45
461***
472***{{ 'bla' }}
48
49
502***
513***{{ 'bla' }}
523***
534***{{ 'bla' }}
54
554***
565***{{ 'bla' }}5***
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/array.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/array.test
new file mode 100644
index 00000000..1429d375
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/array.test
@@ -0,0 +1,24 @@
1--TEST--
2array index test
3--TEMPLATE--
4{% for key, value in days %}
5{{ key }}
6{% endfor %}
7--DATA--
8return array('days' => array(
9 1 => array('money' => 9),
10 2 => array('money' => 21),
11 3 => array('money' => 38),
12 4 => array('money' => 6),
13 18 => array('money' => 6),
14 19 => array('money' => 3),
15 31 => array('money' => 11),
16));
17--EXPECT--
181
192
203
214
2218
2319
2431
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/constant.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/constant.test
new file mode 100644
index 00000000..60218ac0
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/constant.test
@@ -0,0 +1,14 @@
1--TEST--
2"const" test
3--TEMPLATE--
4{{ 8 is constant('E_NOTICE') ? 'ok' : 'no' }}
5{{ 'bar' is constant('TwigTestFoo::BAR_NAME') ? 'ok' : 'no' }}
6{{ value is constant('TwigTestFoo::BAR_NAME') ? 'ok' : 'no' }}
7{{ 2 is constant('ARRAY_AS_PROPS', object) ? 'ok' : 'no' }}
8--DATA--
9return array('value' => 'bar', 'object' => new ArrayObject(array('hi')));
10--EXPECT--
11ok
12ok
13ok
14ok \ No newline at end of file
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined.test
new file mode 100644
index 00000000..cbfe03de
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined.test
@@ -0,0 +1,108 @@
1--TEST--
2"defined" test
3--TEMPLATE--
4{{ definedVar is defined ? 'ok' : 'ko' }}
5{{ definedVar is not defined ? 'ko' : 'ok' }}
6{{ undefinedVar is defined ? 'ko' : 'ok' }}
7{{ undefinedVar is not defined ? 'ok' : 'ko' }}
8{{ zeroVar is defined ? 'ok' : 'ko' }}
9{{ nullVar is defined ? 'ok' : 'ko' }}
10{{ nested.definedVar is defined ? 'ok' : 'ko' }}
11{{ nested['definedVar'] is defined ? 'ok' : 'ko' }}
12{{ nested.definedVar is not defined ? 'ko' : 'ok' }}
13{{ nested.undefinedVar is defined ? 'ko' : 'ok' }}
14{{ nested['undefinedVar'] is defined ? 'ko' : 'ok' }}
15{{ nested.undefinedVar is not defined ? 'ok' : 'ko' }}
16{{ nested.zeroVar is defined ? 'ok' : 'ko' }}
17{{ nested.nullVar is defined ? 'ok' : 'ko' }}
18{{ nested.definedArray.0 is defined ? 'ok' : 'ko' }}
19{{ nested['definedArray'][0] is defined ? 'ok' : 'ko' }}
20{{ object.foo is defined ? 'ok' : 'ko' }}
21{{ object.undefinedMethod is defined ? 'ko' : 'ok' }}
22{{ object.getFoo() is defined ? 'ok' : 'ko' }}
23{{ object.getFoo('a') is defined ? 'ok' : 'ko' }}
24{{ object.undefinedMethod() is defined ? 'ko' : 'ok' }}
25{{ object.undefinedMethod('a') is defined ? 'ko' : 'ok' }}
26{{ object.self.foo is defined ? 'ok' : 'ko' }}
27{{ object.self.undefinedMethod is defined ? 'ko' : 'ok' }}
28{{ object.undefinedMethod.self is defined ? 'ko' : 'ok' }}
29--DATA--
30return array(
31 'definedVar' => 'defined',
32 'zeroVar' => 0,
33 'nullVar' => null,
34 'nested' => array(
35 'definedVar' => 'defined',
36 'zeroVar' => 0,
37 'nullVar' => null,
38 'definedArray' => array(0),
39 ),
40 'object' => new TwigTestFoo(),
41);
42--EXPECT--
43ok
44ok
45ok
46ok
47ok
48ok
49ok
50ok
51ok
52ok
53ok
54ok
55ok
56ok
57ok
58ok
59ok
60ok
61ok
62ok
63ok
64ok
65ok
66ok
67ok
68--DATA--
69return array(
70 'definedVar' => 'defined',
71 'zeroVar' => 0,
72 'nullVar' => null,
73 'nested' => array(
74 'definedVar' => 'defined',
75 'zeroVar' => 0,
76 'nullVar' => null,
77 'definedArray' => array(0),
78 ),
79 'object' => new TwigTestFoo(),
80);
81--CONFIG--
82return array('strict_variables' => false)
83--EXPECT--
84ok
85ok
86ok
87ok
88ok
89ok
90ok
91ok
92ok
93ok
94ok
95ok
96ok
97ok
98ok
99ok
100ok
101ok
102ok
103ok
104ok
105ok
106ok
107ok
108ok
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/empty.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/empty.test
new file mode 100644
index 00000000..a776d032
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/empty.test
@@ -0,0 +1,45 @@
1--TEST--
2"empty" test
3--TEMPLATE--
4{{ foo is empty ? 'ok' : 'ko' }}
5{{ bar is empty ? 'ok' : 'ko' }}
6{{ foobar is empty ? 'ok' : 'ko' }}
7{{ array is empty ? 'ok' : 'ko' }}
8{{ zero is empty ? 'ok' : 'ko' }}
9{{ string is empty ? 'ok' : 'ko' }}
10{{ countable_empty is empty ? 'ok' : 'ko' }}
11{{ countable_not_empty is empty ? 'ok' : 'ko' }}
12{{ markup_empty is empty ? 'ok' : 'ko' }}
13{{ markup_not_empty is empty ? 'ok' : 'ko' }}
14--DATA--
15
16class CountableStub implements Countable
17{
18 private $items;
19
20 public function __construct(array $items)
21 {
22 $this->items = $items;
23 }
24
25 public function count()
26 {
27 return count($this->items);
28 }
29}
30return array(
31 'foo' => '', 'bar' => null, 'foobar' => false, 'array' => array(), 'zero' => 0, 'string' => '0',
32 'countable_empty' => new CountableStub(array()), 'countable_not_empty' => new CountableStub(array(1, 2)),
33 'markup_empty' => new Twig_Markup('', 'UTF-8'), 'markup_not_empty' => new Twig_Markup('test', 'UTF-8'),
34);
35--EXPECT--
36ok
37ok
38ok
39ok
40ko
41ko
42ok
43ko
44ok
45ko
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/even.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/even.test
new file mode 100644
index 00000000..695b4c2f
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/even.test
@@ -0,0 +1,14 @@
1--TEST--
2"even" test
3--TEMPLATE--
4{{ 1 is even ? 'ko' : 'ok' }}
5{{ 2 is even ? 'ok' : 'ko' }}
6{{ 1 is not even ? 'ok' : 'ko' }}
7{{ 2 is not even ? 'ko' : 'ok' }}
8--DATA--
9return array()
10--EXPECT--
11ok
12ok
13ok
14ok
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in.test
new file mode 100644
index 00000000..45c72fd2
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in.test
@@ -0,0 +1,48 @@
1--TEST--
2Twig supports the in operator
3--TEMPLATE--
4{% if bar in foo %}
5TRUE
6{% endif %}
7{% if not (bar in foo) %}
8{% else %}
9TRUE
10{% endif %}
11{% if bar not in foo %}
12{% else %}
13TRUE
14{% endif %}
15{% if 'a' in bar %}
16TRUE
17{% endif %}
18{% if 'c' not in bar %}
19TRUE
20{% endif %}
21{% if '' not in bar %}
22TRUE
23{% endif %}
24{% if '' in '' %}
25TRUE
26{% endif %}
27{% if '0' not in '' %}
28TRUE
29{% endif %}
30{% if 'a' not in '0' %}
31TRUE
32{% endif %}
33{% if '0' in '0' %}
34TRUE
35{% endif %}
36--DATA--
37return array('bar' => 'bar', 'foo' => array('bar' => 'bar'))
38--EXPECT--
39TRUE
40TRUE
41TRUE
42TRUE
43TRUE
44TRUE
45TRUE
46TRUE
47TRUE
48TRUE
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in_with_objects.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in_with_objects.test
new file mode 100644
index 00000000..8e08061b
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in_with_objects.test
@@ -0,0 +1,19 @@
1--TEST--
2Twig supports the in operator when using objects
3--TEMPLATE--
4{% if object in object_list %}
5TRUE
6{% endif %}
7--DATA--
8$foo = new TwigTestFoo();
9$foo1 = new TwigTestFoo();
10
11$foo->position = $foo1;
12$foo1->position = $foo;
13
14return array(
15 'object' => $foo,
16 'object_list' => array($foo1, $foo),
17);
18--EXPECT--
19TRUE
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/iterable.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/iterable.test
new file mode 100644
index 00000000..ec525501
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/iterable.test
@@ -0,0 +1,19 @@
1--TEST--
2"iterable" test
3--TEMPLATE--
4{{ foo is iterable ? 'ok' : 'ko' }}
5{{ traversable is iterable ? 'ok' : 'ko' }}
6{{ obj is iterable ? 'ok' : 'ko' }}
7{{ val is iterable ? 'ok' : 'ko' }}
8--DATA--
9return array(
10 'foo' => array(),
11 'traversable' => new ArrayIterator(array()),
12 'obj' => new stdClass(),
13 'val' => 'test',
14);
15--EXPECT--
16ok
17ok
18ko
19ko \ No newline at end of file
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/odd.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/odd.test
new file mode 100644
index 00000000..1b8311e3
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/odd.test
@@ -0,0 +1,10 @@
1--TEST--
2"odd" test
3--TEMPLATE--
4{{ 1 is odd ? 'ok' : 'ko' }}
5{{ 2 is odd ? 'ko' : 'ok' }}
6--DATA--
7return array()
8--EXPECT--
9ok
10ok \ No newline at end of file
diff --git a/vendor/twig/twig/test/Twig/Tests/IntegrationTest.php b/vendor/twig/twig/test/Twig/Tests/IntegrationTest.php
new file mode 100644
index 00000000..5feb8f4e
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/IntegrationTest.php
@@ -0,0 +1,217 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12// This function is defined to check that escaping strategies
13// like html works even if a function with the same name is defined.
14function html()
15{
16 return 'foo';
17}
18
19class Twig_Tests_IntegrationTest extends Twig_Test_IntegrationTestCase
20{
21 public function getExtensions()
22 {
23 $policy = new Twig_Sandbox_SecurityPolicy(array(), array(), array(), array(), array());
24
25 return array(
26 new Twig_Extension_Debug(),
27 new Twig_Extension_Sandbox($policy, false),
28 new Twig_Extension_StringLoader(),
29 new TwigTestExtension(),
30 );
31 }
32
33 public function getFixturesDir()
34 {
35 return dirname(__FILE__).'/Fixtures/';
36 }
37}
38
39function test_foo($value = 'foo')
40{
41 return $value;
42}
43
44class TwigTestFoo implements Iterator
45{
46 const BAR_NAME = 'bar';
47
48 public $position = 0;
49 public $array = array(1, 2);
50
51 public function bar($param1 = null, $param2 = null)
52 {
53 return 'bar'.($param1 ? '_'.$param1 : '').($param2 ? '-'.$param2 : '');
54 }
55
56 public function getFoo()
57 {
58 return 'foo';
59 }
60
61 public function getSelf()
62 {
63 return $this;
64 }
65
66 public function is()
67 {
68 return 'is';
69 }
70
71 public function in()
72 {
73 return 'in';
74 }
75
76 public function not()
77 {
78 return 'not';
79 }
80
81 public function strToLower($value)
82 {
83 return strtolower($value);
84 }
85
86 public function rewind()
87 {
88 $this->position = 0;
89 }
90
91 public function current()
92 {
93 return $this->array[$this->position];
94 }
95
96 public function key()
97 {
98 return 'a';
99 }
100
101 public function next()
102 {
103 ++$this->position;
104 }
105
106 public function valid()
107 {
108 return isset($this->array[$this->position]);
109 }
110}
111
112class TwigTestTokenParser_§ extends Twig_TokenParser
113{
114 public function parse(Twig_Token $token)
115 {
116 $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
117
118 return new Twig_Node_Print(new Twig_Node_Expression_Constant('§', -1), -1);
119 }
120
121 public function getTag()
122 {
123 return '§';
124 }
125}
126
127class TwigTestExtension extends Twig_Extension
128{
129 public function getTokenParsers()
130 {
131 return array(
132 new TwigTestTokenParser_§(),
133 );
134 }
135
136 public function getFilters()
137 {
138 return array(
139 '§' => new Twig_Filter_Method($this, '§Filter'),
140 'escape_and_nl2br' => new Twig_Filter_Method($this, 'escape_and_nl2br', array('needs_environment' => true, 'is_safe' => array('html'))),
141 'nl2br' => new Twig_Filter_Method($this, 'nl2br', array('pre_escape' => 'html', 'is_safe' => array('html'))),
142 'escape_something' => new Twig_Filter_Method($this, 'escape_something', array('is_safe' => array('something'))),
143 'preserves_safety' => new Twig_Filter_Method($this, 'preserves_safety', array('preserves_safety' => array('html'))),
144 '*_path' => new Twig_Filter_Method($this, 'dynamic_path'),
145 '*_foo_*_bar' => new Twig_Filter_Method($this, 'dynamic_foo'),
146 );
147 }
148
149 public function getFunctions()
150 {
151 return array(
152 '§' => new Twig_Function_Method($this, '§Function'),
153 'safe_br' => new Twig_Function_Method($this, 'br', array('is_safe' => array('html'))),
154 'unsafe_br' => new Twig_Function_Method($this, 'br'),
155 '*_path' => new Twig_Function_Method($this, 'dynamic_path'),
156 '*_foo_*_bar' => new Twig_Function_Method($this, 'dynamic_foo'),
157 );
158 }
159
160 public function §Filter($value)
161 {
162 return "§{$value}§";
163 }
164
165 public function §Function($value)
166 {
167 return "§{$value}§";
168 }
169
170 /**
171 * nl2br which also escapes, for testing escaper filters
172 */
173 public function escape_and_nl2br($env, $value, $sep = '<br />')
174 {
175 return $this->nl2br(twig_escape_filter($env, $value, 'html'), $sep);
176 }
177
178 /**
179 * nl2br only, for testing filters with pre_escape
180 */
181 public function nl2br($value, $sep = '<br />')
182 {
183 // not secure if $value contains html tags (not only entities)
184 // don't use
185 return str_replace("\n", "$sep\n", $value);
186 }
187
188 public function dynamic_path($element, $item)
189 {
190 return $element.'/'.$item;
191 }
192
193 public function dynamic_foo($foo, $bar, $item)
194 {
195 return $foo.'/'.$bar.'/'.$item;
196 }
197
198 public function escape_something($value)
199 {
200 return strtoupper($value);
201 }
202
203 public function preserves_safety($value)
204 {
205 return strtoupper($value);
206 }
207
208 public function br()
209 {
210 return '<br />';
211 }
212
213 public function getName()
214 {
215 return 'integration_test';
216 }
217}
diff --git a/vendor/twig/twig/test/Twig/Tests/LexerTest.php b/vendor/twig/twig/test/Twig/Tests/LexerTest.php
new file mode 100644
index 00000000..9f3c7510
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/LexerTest.php
@@ -0,0 +1,301 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11class Twig_Tests_LexerTest extends PHPUnit_Framework_TestCase
12{
13 public function testNameLabelForTag()
14 {
15 $template = '{% § %}';
16
17 $lexer = new Twig_Lexer(new Twig_Environment());
18 $stream = $lexer->tokenize($template);
19
20 $stream->expect(Twig_Token::BLOCK_START_TYPE);
21 $this->assertSame('§', $stream->expect(Twig_Token::NAME_TYPE)->getValue());
22 }
23
24 public function testNameLabelForFunction()
25 {
26 $template = '{{ §() }}';
27
28 $lexer = new Twig_Lexer(new Twig_Environment());
29 $stream = $lexer->tokenize($template);
30
31 $stream->expect(Twig_Token::VAR_START_TYPE);
32 $this->assertSame('§', $stream->expect(Twig_Token::NAME_TYPE)->getValue());
33 }
34
35 public function testBracketsNesting()
36 {
37 $template = '{{ {"a":{"b":"c"}} }}';
38
39 $this->assertEquals(2, $this->countToken($template, Twig_Token::PUNCTUATION_TYPE, '{'));
40 $this->assertEquals(2, $this->countToken($template, Twig_Token::PUNCTUATION_TYPE, '}'));
41 }
42
43 protected function countToken($template, $type, $value = null)
44 {
45 $lexer = new Twig_Lexer(new Twig_Environment());
46 $stream = $lexer->tokenize($template);
47
48 $count = 0;
49 $tokens = array();
50 while (!$stream->isEOF()) {
51 $token = $stream->next();
52 if ($type === $token->getType()) {
53 if (null === $value || $value === $token->getValue()) {
54 ++$count;
55 }
56 }
57 }
58
59 return $count;
60 }
61
62 public function testLineDirective()
63 {
64 $template = "foo\n"
65 . "bar\n"
66 . "{% line 10 %}\n"
67 . "{{\n"
68 . "baz\n"
69 . "}}\n";
70
71 $lexer = new Twig_Lexer(new Twig_Environment());
72 $stream = $lexer->tokenize($template);
73
74 // foo\nbar\n
75 $this->assertSame(1, $stream->expect(Twig_Token::TEXT_TYPE)->getLine());
76 // \n (after {% line %})
77 $this->assertSame(10, $stream->expect(Twig_Token::TEXT_TYPE)->getLine());
78 // {{
79 $this->assertSame(11, $stream->expect(Twig_Token::VAR_START_TYPE)->getLine());
80 // baz
81 $this->assertSame(12, $stream->expect(Twig_Token::NAME_TYPE)->getLine());
82 }
83
84 public function testLineDirectiveInline()
85 {
86 $template = "foo\n"
87 . "bar{% line 10 %}{{\n"
88 . "baz\n"
89 . "}}\n";
90
91 $lexer = new Twig_Lexer(new Twig_Environment());
92 $stream = $lexer->tokenize($template);
93
94 // foo\nbar
95 $this->assertSame(1, $stream->expect(Twig_Token::TEXT_TYPE)->getLine());
96 // {{
97 $this->assertSame(10, $stream->expect(Twig_Token::VAR_START_TYPE)->getLine());
98 // baz
99 $this->assertSame(11, $stream->expect(Twig_Token::NAME_TYPE)->getLine());
100 }
101
102 public function testLongComments()
103 {
104 $template = '{# '.str_repeat('*', 100000).' #}';
105
106 $lexer = new Twig_Lexer(new Twig_Environment());
107 $lexer->tokenize($template);
108
109 // should not throw an exception
110 }
111
112 public function testLongRaw()
113 {
114 $template = '{% raw %}'.str_repeat('*', 100000).'{% endraw %}';
115
116 $lexer = new Twig_Lexer(new Twig_Environment());
117 $stream = $lexer->tokenize($template);
118
119 // should not throw an exception
120 }
121
122 public function testLongVar()
123 {
124 $template = '{{ '.str_repeat('x', 100000).' }}';
125
126 $lexer = new Twig_Lexer(new Twig_Environment());
127 $stream = $lexer->tokenize($template);
128
129 // should not throw an exception
130 }
131
132 public function testLongBlock()
133 {
134 $template = '{% '.str_repeat('x', 100000).' %}';
135
136 $lexer = new Twig_Lexer(new Twig_Environment());
137 $stream = $lexer->tokenize($template);
138
139 // should not throw an exception
140 }
141
142 public function testBigNumbers()
143 {
144 $template = '{{ 922337203685477580700 }}';
145
146 $lexer = new Twig_Lexer(new Twig_Environment());
147 $stream = $lexer->tokenize($template);
148 $node = $stream->next();
149 $node = $stream->next();
150 $this->assertEquals(922337203685477580700, $node->getValue());
151 }
152
153 public function testStringWithEscapedDelimiter()
154 {
155 $tests = array(
156 "{{ 'foo \' bar' }}" => 'foo \' bar',
157 '{{ "foo \" bar" }}' => "foo \" bar",
158 );
159 $lexer = new Twig_Lexer(new Twig_Environment());
160 foreach ($tests as $template => $expected) {
161 $stream = $lexer->tokenize($template);
162 $stream->expect(Twig_Token::VAR_START_TYPE);
163 $stream->expect(Twig_Token::STRING_TYPE, $expected);
164 }
165 }
166
167 public function testStringWithInterpolation()
168 {
169 $template = 'foo {{ "bar #{ baz + 1 }" }}';
170
171 $lexer = new Twig_Lexer(new Twig_Environment());
172 $stream = $lexer->tokenize($template);
173 $stream->expect(Twig_Token::TEXT_TYPE, 'foo ');
174 $stream->expect(Twig_Token::VAR_START_TYPE);
175 $stream->expect(Twig_Token::STRING_TYPE, 'bar ');
176 $stream->expect(Twig_Token::INTERPOLATION_START_TYPE);
177 $stream->expect(Twig_Token::NAME_TYPE, 'baz');
178 $stream->expect(Twig_Token::OPERATOR_TYPE, '+');
179 $stream->expect(Twig_Token::NUMBER_TYPE, '1');
180 $stream->expect(Twig_Token::INTERPOLATION_END_TYPE);
181 $stream->expect(Twig_Token::VAR_END_TYPE);
182 }
183
184 public function testStringWithEscapedInterpolation()
185 {
186 $template = '{{ "bar \#{baz+1}" }}';
187
188 $lexer = new Twig_Lexer(new Twig_Environment());
189 $stream = $lexer->tokenize($template);
190 $stream->expect(Twig_Token::VAR_START_TYPE);
191 $stream->expect(Twig_Token::STRING_TYPE, 'bar #{baz+1}');
192 $stream->expect(Twig_Token::VAR_END_TYPE);
193 }
194
195 public function testStringWithHash()
196 {
197 $template = '{{ "bar # baz" }}';
198
199 $lexer = new Twig_Lexer(new Twig_Environment());
200 $stream = $lexer->tokenize($template);
201 $stream->expect(Twig_Token::VAR_START_TYPE);
202 $stream->expect(Twig_Token::STRING_TYPE, 'bar # baz');
203 $stream->expect(Twig_Token::VAR_END_TYPE);
204 }
205
206 /**
207 * @expectedException Twig_Error_Syntax
208 * @expectedExceptionMessage Unclosed """
209 */
210 public function testStringWithUnterminatedInterpolation()
211 {
212 $template = '{{ "bar #{x" }}';
213
214 $lexer = new Twig_Lexer(new Twig_Environment());
215 $stream = $lexer->tokenize($template);
216 }
217
218 public function testStringWithNestedInterpolations()
219 {
220 $template = '{{ "bar #{ "foo#{bar}" }" }}';
221
222 $lexer = new Twig_Lexer(new Twig_Environment());
223 $stream = $lexer->tokenize($template);
224 $stream->expect(Twig_Token::VAR_START_TYPE);
225 $stream->expect(Twig_Token::STRING_TYPE, 'bar ');
226 $stream->expect(Twig_Token::INTERPOLATION_START_TYPE);
227 $stream->expect(Twig_Token::STRING_TYPE, 'foo');
228 $stream->expect(Twig_Token::INTERPOLATION_START_TYPE);
229 $stream->expect(Twig_Token::NAME_TYPE, 'bar');
230 $stream->expect(Twig_Token::INTERPOLATION_END_TYPE);
231 $stream->expect(Twig_Token::INTERPOLATION_END_TYPE);
232 $stream->expect(Twig_Token::VAR_END_TYPE);
233 }
234
235 public function testStringWithNestedInterpolationsInBlock()
236 {
237 $template = '{% foo "bar #{ "foo#{bar}" }" %}';
238
239 $lexer = new Twig_Lexer(new Twig_Environment());
240 $stream = $lexer->tokenize($template);
241 $stream->expect(Twig_Token::BLOCK_START_TYPE);
242 $stream->expect(Twig_Token::NAME_TYPE, 'foo');
243 $stream->expect(Twig_Token::STRING_TYPE, 'bar ');
244 $stream->expect(Twig_Token::INTERPOLATION_START_TYPE);
245 $stream->expect(Twig_Token::STRING_TYPE, 'foo');
246 $stream->expect(Twig_Token::INTERPOLATION_START_TYPE);
247 $stream->expect(Twig_Token::NAME_TYPE, 'bar');
248 $stream->expect(Twig_Token::INTERPOLATION_END_TYPE);
249 $stream->expect(Twig_Token::INTERPOLATION_END_TYPE);
250 $stream->expect(Twig_Token::BLOCK_END_TYPE);
251 }
252
253 public function testOperatorEndingWithALetterAtTheEndOfALine()
254 {
255 $template = "{{ 1 and\n0}}";
256
257 $lexer = new Twig_Lexer(new Twig_Environment());
258 $stream = $lexer->tokenize($template);
259 $stream->expect(Twig_Token::VAR_START_TYPE);
260 $stream->expect(Twig_Token::NUMBER_TYPE, 1);
261 $stream->expect(Twig_Token::OPERATOR_TYPE, 'and');
262 }
263
264 /**
265 * @expectedException Twig_Error_Syntax
266 * @expectedExceptionMessage Unclosed "variable" at line 3
267 */
268 public function testUnterminatedVariable()
269 {
270 $template = '
271
272{{
273
274bar
275
276
277';
278
279 $lexer = new Twig_Lexer(new Twig_Environment());
280 $stream = $lexer->tokenize($template);
281 }
282
283 /**
284 * @expectedException Twig_Error_Syntax
285 * @expectedExceptionMessage Unclosed "block" at line 3
286 */
287 public function testUnterminatedBlock()
288 {
289 $template = '
290
291{%
292
293bar
294
295
296';
297
298 $lexer = new Twig_Lexer(new Twig_Environment());
299 $stream = $lexer->tokenize($template);
300 }
301}
diff --git a/vendor/twig/twig/test/Twig/Tests/Loader/ArrayTest.php b/vendor/twig/twig/test/Twig/Tests/Loader/ArrayTest.php
new file mode 100644
index 00000000..1369a6bd
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Loader/ArrayTest.php
@@ -0,0 +1,97 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Loader_ArrayTest extends PHPUnit_Framework_TestCase
13{
14 public function testGetSource()
15 {
16 $loader = new Twig_Loader_Array(array('foo' => 'bar'));
17
18 $this->assertEquals('bar', $loader->getSource('foo'));
19 }
20
21 /**
22 * @expectedException Twig_Error_Loader
23 */
24 public function testGetSourceWhenTemplateDoesNotExist()
25 {
26 $loader = new Twig_Loader_Array(array());
27
28 $loader->getSource('foo');
29 }
30
31 public function testGetCacheKey()
32 {
33 $loader = new Twig_Loader_Array(array('foo' => 'bar'));
34
35 $this->assertEquals('bar', $loader->getCacheKey('foo'));
36 }
37
38 /**
39 * @expectedException Twig_Error_Loader
40 */
41 public function testGetCacheKeyWhenTemplateDoesNotExist()
42 {
43 $loader = new Twig_Loader_Array(array());
44
45 $loader->getCacheKey('foo');
46 }
47
48 public function testSetTemplate()
49 {
50 $loader = new Twig_Loader_Array(array());
51 $loader->setTemplate('foo', 'bar');
52
53 $this->assertEquals('bar', $loader->getSource('foo'));
54 }
55
56 public function testIsFresh()
57 {
58 $loader = new Twig_Loader_Array(array('foo' => 'bar'));
59 $this->assertTrue($loader->isFresh('foo', time()));
60 }
61
62 /**
63 * @expectedException Twig_Error_Loader
64 */
65 public function testIsFreshWhenTemplateDoesNotExist()
66 {
67 $loader = new Twig_Loader_Array(array());
68
69 $loader->isFresh('foo', time());
70 }
71
72 public function testTemplateReference()
73 {
74 $name = new Twig_Test_Loader_TemplateReference('foo');
75 $loader = new Twig_Loader_Array(array('foo' => 'bar'));
76
77 $loader->getCacheKey($name);
78 $loader->getSource($name);
79 $loader->isFresh($name, time());
80 $loader->setTemplate($name, 'foobar');
81 }
82}
83
84class Twig_Test_Loader_TemplateReference
85{
86 private $name;
87
88 public function __construct($name)
89 {
90 $this->name = $name;
91 }
92
93 public function __toString()
94 {
95 return $this->name;
96 }
97}
diff --git a/vendor/twig/twig/test/Twig/Tests/Loader/ChainTest.php b/vendor/twig/twig/test/Twig/Tests/Loader/ChainTest.php
new file mode 100644
index 00000000..4fe0db94
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Loader/ChainTest.php
@@ -0,0 +1,79 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Loader_ChainTest extends PHPUnit_Framework_TestCase
13{
14 public function testGetSource()
15 {
16 $loader = new Twig_Loader_Chain(array(
17 new Twig_Loader_Array(array('foo' => 'bar')),
18 new Twig_Loader_Array(array('foo' => 'foobar', 'bar' => 'foo')),
19 ));
20
21 $this->assertEquals('bar', $loader->getSource('foo'));
22 $this->assertEquals('foo', $loader->getSource('bar'));
23 }
24
25 /**
26 * @expectedException Twig_Error_Loader
27 */
28 public function testGetSourceWhenTemplateDoesNotExist()
29 {
30 $loader = new Twig_Loader_Chain(array());
31
32 $loader->getSource('foo');
33 }
34
35 public function testGetCacheKey()
36 {
37 $loader = new Twig_Loader_Chain(array(
38 new Twig_Loader_Array(array('foo' => 'bar')),
39 new Twig_Loader_Array(array('foo' => 'foobar', 'bar' => 'foo')),
40 ));
41
42 $this->assertEquals('bar', $loader->getCacheKey('foo'));
43 $this->assertEquals('foo', $loader->getCacheKey('bar'));
44 }
45
46 /**
47 * @expectedException Twig_Error_Loader
48 */
49 public function testGetCacheKeyWhenTemplateDoesNotExist()
50 {
51 $loader = new Twig_Loader_Chain(array());
52
53 $loader->getCacheKey('foo');
54 }
55
56 public function testAddLoader()
57 {
58 $loader = new Twig_Loader_Chain();
59 $loader->addLoader(new Twig_Loader_Array(array('foo' => 'bar')));
60
61 $this->assertEquals('bar', $loader->getSource('foo'));
62 }
63
64 public function testExists()
65 {
66 $loader1 = $this->getMock('Twig_Loader_Array', array('exists', 'getSource'), array(), '', false);
67 $loader1->expects($this->once())->method('exists')->will($this->returnValue(false));
68 $loader1->expects($this->never())->method('getSource');
69
70 $loader2 = $this->getMock('Twig_LoaderInterface');
71 $loader2->expects($this->once())->method('getSource')->will($this->returnValue('content'));
72
73 $loader = new Twig_Loader_Chain();
74 $loader->addLoader($loader1);
75 $loader->addLoader($loader2);
76
77 $this->assertTrue($loader->exists('foo'));
78 }
79}
diff --git a/vendor/twig/twig/test/Twig/Tests/Loader/FilesystemTest.php b/vendor/twig/twig/test/Twig/Tests/Loader/FilesystemTest.php
new file mode 100644
index 00000000..4c874b6b
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Loader/FilesystemTest.php
@@ -0,0 +1,97 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Loader_FilesystemTest extends PHPUnit_Framework_TestCase
13{
14 /**
15 * @dataProvider getSecurityTests
16 */
17 public function testSecurity($template)
18 {
19 $loader = new Twig_Loader_Filesystem(array(dirname(__FILE__).'/../Fixtures'));
20
21 try {
22 $loader->getCacheKey($template);
23 $this->fail();
24 } catch (Twig_Error_Loader $e) {
25 $this->assertNotContains('Unable to find template', $e->getMessage());
26 }
27 }
28
29 public function getSecurityTests()
30 {
31 return array(
32 array("AutoloaderTest\0.php"),
33 array('..\\AutoloaderTest.php'),
34 array('..\\\\\\AutoloaderTest.php'),
35 array('../AutoloaderTest.php'),
36 array('..////AutoloaderTest.php'),
37 array('./../AutoloaderTest.php'),
38 array('.\\..\\AutoloaderTest.php'),
39 array('././././././../AutoloaderTest.php'),
40 array('.\\./.\\./.\\./../AutoloaderTest.php'),
41 array('foo/../../AutoloaderTest.php'),
42 array('foo\\..\\..\\AutoloaderTest.php'),
43 array('foo/../bar/../../AutoloaderTest.php'),
44 array('foo/bar/../../../AutoloaderTest.php'),
45 array('filters/../../AutoloaderTest.php'),
46 array('filters//..//..//AutoloaderTest.php'),
47 array('filters\\..\\..\\AutoloaderTest.php'),
48 array('filters\\\\..\\\\..\\\\AutoloaderTest.php'),
49 array('filters\\//../\\/\\..\\AutoloaderTest.php'),
50 array('/../AutoloaderTest.php'),
51 );
52 }
53
54 public function testPaths()
55 {
56 $basePath = dirname(__FILE__).'/Fixtures';
57
58 $loader = new Twig_Loader_Filesystem(array($basePath.'/normal', $basePath.'/normal_bis'));
59 $loader->setPaths(array($basePath.'/named', $basePath.'/named_bis'), 'named');
60 $loader->addPath($basePath.'/named_ter', 'named');
61 $loader->addPath($basePath.'/normal_ter');
62 $loader->prependPath($basePath.'/normal_final');
63 $loader->prependPath($basePath.'/named_final', 'named');
64
65 $this->assertEquals(array(
66 $basePath.'/normal_final',
67 $basePath.'/normal',
68 $basePath.'/normal_bis',
69 $basePath.'/normal_ter',
70 ), $loader->getPaths());
71 $this->assertEquals(array(
72 $basePath.'/named_final',
73 $basePath.'/named',
74 $basePath.'/named_bis',
75 $basePath.'/named_ter',
76 ), $loader->getPaths('named'));
77
78 $this->assertEquals("path (final)\n", $loader->getSource('index.html'));
79 $this->assertEquals("path (final)\n", $loader->getSource('@__main__/index.html'));
80 $this->assertEquals("named path (final)\n", $loader->getSource('@named/index.html'));
81 }
82
83 public function testEmptyConstructor()
84 {
85 $loader = new Twig_Loader_Filesystem();
86 $this->assertEquals(array(), $loader->getPaths());
87 }
88
89 public function testGetNamespaces()
90 {
91 $loader = new Twig_Loader_Filesystem(sys_get_temp_dir());
92 $this->assertEquals(array(Twig_Loader_Filesystem::MAIN_NAMESPACE), $loader->getNamespaces());
93
94 $loader->addPath(sys_get_temp_dir(), 'named');
95 $this->assertEquals(array(Twig_Loader_Filesystem::MAIN_NAMESPACE, 'named'), $loader->getNamespaces());
96 }
97}
diff --git a/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named/index.html b/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named/index.html
new file mode 100644
index 00000000..9e5449c7
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named/index.html
@@ -0,0 +1 @@
named path
diff --git a/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_bis/index.html b/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_bis/index.html
new file mode 100644
index 00000000..d3a272b1
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_bis/index.html
@@ -0,0 +1 @@
named path (bis)
diff --git a/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_final/index.html b/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_final/index.html
new file mode 100644
index 00000000..9f05d150
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_final/index.html
@@ -0,0 +1 @@
named path (final)
diff --git a/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_ter/index.html b/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_ter/index.html
new file mode 100644
index 00000000..24fb68ad
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_ter/index.html
@@ -0,0 +1 @@
named path (ter)
diff --git a/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal/index.html b/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal/index.html
new file mode 100644
index 00000000..e7a8fd4d
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal/index.html
@@ -0,0 +1 @@
path
diff --git a/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_bis/index.html b/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_bis/index.html
new file mode 100644
index 00000000..bfa91604
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_bis/index.html
@@ -0,0 +1 @@
path (bis)
diff --git a/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_final/index.html b/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_final/index.html
new file mode 100644
index 00000000..73a089bb
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_final/index.html
@@ -0,0 +1 @@
path (final)
diff --git a/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_ter/index.html b/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_ter/index.html
new file mode 100644
index 00000000..b7ad97d8
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_ter/index.html
@@ -0,0 +1 @@
path (ter)
diff --git a/vendor/twig/twig/test/Twig/Tests/NativeExtensionTest.php b/vendor/twig/twig/test/Twig/Tests/NativeExtensionTest.php
new file mode 100644
index 00000000..3fafd335
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/NativeExtensionTest.php
@@ -0,0 +1,29 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_NativeExtensionTest extends PHPUnit_Framework_TestCase
13{
14 public function testGetProperties()
15 {
16 $twig = new Twig_Environment(new Twig_Loader_String(), array(
17 'debug' => true,
18 'cache' => false,
19 'autoescape' => false
20 ));
21
22 $d1 = new DateTime();
23 $d2 = new DateTime();
24 $output = $twig->render('{{ d1.date }}{{ d2.date }}', compact('d1', 'd2'));
25
26 // If it fails, PHP will crash.
27 $this->assertEquals($output, $d1->date . $d2->date);
28 }
29}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/AutoEscapeTest.php b/vendor/twig/twig/test/Twig/Tests/Node/AutoEscapeTest.php
new file mode 100644
index 00000000..608446bc
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/AutoEscapeTest.php
@@ -0,0 +1,44 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_AutoEscapeTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_AutoEscape::__construct
16 */
17 public function testConstructor()
18 {
19 $body = new Twig_Node(array(new Twig_Node_Text('foo', 1)));
20 $node = new Twig_Node_AutoEscape(true, $body, 1);
21
22 $this->assertEquals($body, $node->getNode('body'));
23 $this->assertEquals(true, $node->getAttribute('value'));
24 }
25
26 /**
27 * @covers Twig_Node_AutoEscape::compile
28 * @dataProvider getTests
29 */
30 public function testCompile($node, $source, $environment = null)
31 {
32 parent::testCompile($node, $source, $environment);
33 }
34
35 public function getTests()
36 {
37 $body = new Twig_Node(array(new Twig_Node_Text('foo', 1)));
38 $node = new Twig_Node_AutoEscape(true, $body, 1);
39
40 return array(
41 array($node, "// line 1\necho \"foo\";"),
42 );
43 }
44}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/BlockReferenceTest.php b/vendor/twig/twig/test/Twig/Tests/Node/BlockReferenceTest.php
new file mode 100644
index 00000000..96d0e101
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/BlockReferenceTest.php
@@ -0,0 +1,43 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_BlockReferenceTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_BlockReference::__construct
16 */
17 public function testConstructor()
18 {
19 $node = new Twig_Node_BlockReference('foo', 1);
20
21 $this->assertEquals('foo', $node->getAttribute('name'));
22 }
23
24 /**
25 * @covers Twig_Node_BlockReference::compile
26 * @dataProvider getTests
27 */
28 public function testCompile($node, $source, $environment = null)
29 {
30 parent::testCompile($node, $source, $environment);
31 }
32
33 public function getTests()
34 {
35 return array(
36 array(new Twig_Node_BlockReference('foo', 1), <<<EOF
37// line 1
38\$this->displayBlock('foo', \$context, \$blocks);
39EOF
40 ),
41 );
42 }
43}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/BlockTest.php b/vendor/twig/twig/test/Twig/Tests/Node/BlockTest.php
new file mode 100644
index 00000000..024049de
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/BlockTest.php
@@ -0,0 +1,51 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_BlockTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Block::__construct
16 */
17 public function testConstructor()
18 {
19 $body = new Twig_Node_Text('foo', 1);
20 $node = new Twig_Node_Block('foo', $body, 1);
21
22 $this->assertEquals($body, $node->getNode('body'));
23 $this->assertEquals('foo', $node->getAttribute('name'));
24 }
25
26 /**
27 * @covers Twig_Node_Block::compile
28 * @dataProvider getTests
29 */
30 public function testCompile($node, $source, $environment = null)
31 {
32 parent::testCompile($node, $source, $environment);
33 }
34
35 public function getTests()
36 {
37 $body = new Twig_Node_Text('foo', 1);
38 $node = new Twig_Node_Block('foo', $body, 1);
39
40 return array(
41 array($node, <<<EOF
42// line 1
43public function block_foo(\$context, array \$blocks = array())
44{
45 echo "foo";
46}
47EOF
48 ),
49 );
50 }
51}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/DoTest.php b/vendor/twig/twig/test/Twig/Tests/Node/DoTest.php
new file mode 100644
index 00000000..a406e22d
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/DoTest.php
@@ -0,0 +1,44 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_DoTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Do::__construct
16 */
17 public function testConstructor()
18 {
19 $expr = new Twig_Node_Expression_Constant('foo', 1);
20 $node = new Twig_Node_Do($expr, 1);
21
22 $this->assertEquals($expr, $node->getNode('expr'));
23 }
24
25 /**
26 * @covers Twig_Node_Do::compile
27 * @dataProvider getTests
28 */
29 public function testCompile($node, $source, $environment = null)
30 {
31 parent::testCompile($node, $source, $environment);
32 }
33
34 public function getTests()
35 {
36 $tests = array();
37
38 $expr = new Twig_Node_Expression_Constant('foo', 1);
39 $node = new Twig_Node_Do($expr, 1);
40 $tests[] = array($node, "// line 1\n\"foo\";");
41
42 return $tests;
43 }
44}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/ArrayTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/ArrayTest.php
new file mode 100644
index 00000000..c6a9044b
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/ArrayTest.php
@@ -0,0 +1,49 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_ArrayTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Array::__construct
16 */
17 public function testConstructor()
18 {
19 $elements = array(new Twig_Node_Expression_Constant('foo', 1), $foo = new Twig_Node_Expression_Constant('bar', 1));
20 $node = new Twig_Node_Expression_Array($elements, 1);
21
22 $this->assertEquals($foo, $node->getNode(1));
23 }
24
25 /**
26 * @covers Twig_Node_Expression_Array::compile
27 * @dataProvider getTests
28 */
29 public function testCompile($node, $source, $environment = null)
30 {
31 parent::testCompile($node, $source, $environment);
32 }
33
34 public function getTests()
35 {
36 $elements = array(
37 new Twig_Node_Expression_Constant('foo', 1),
38 new Twig_Node_Expression_Constant('bar', 1),
39
40 new Twig_Node_Expression_Constant('bar', 1),
41 new Twig_Node_Expression_Constant('foo', 1),
42 );
43 $node = new Twig_Node_Expression_Array($elements, 1);
44
45 return array(
46 array($node, 'array("foo" => "bar", "bar" => "foo")'),
47 );
48 }
49}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/AssignNameTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/AssignNameTest.php
new file mode 100644
index 00000000..b156dcc0
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/AssignNameTest.php
@@ -0,0 +1,41 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_AssignNameTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_AssignName::__construct
16 */
17 public function testConstructor()
18 {
19 $node = new Twig_Node_Expression_AssignName('foo', 1);
20
21 $this->assertEquals('foo', $node->getAttribute('name'));
22 }
23
24 /**
25 * @covers Twig_Node_Expression_AssignName::compile
26 * @dataProvider getTests
27 */
28 public function testCompile($node, $source, $environment = null)
29 {
30 parent::testCompile($node, $source, $environment);
31 }
32
33 public function getTests()
34 {
35 $node = new Twig_Node_Expression_AssignName('foo', 1);
36
37 return array(
38 array($node, '$context["foo"]'),
39 );
40 }
41}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AddTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AddTest.php
new file mode 100644
index 00000000..a0f49cb3
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AddTest.php
@@ -0,0 +1,47 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_Binary_AddTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Binary_Add::__construct
16 */
17 public function testConstructor()
18 {
19 $left = new Twig_Node_Expression_Constant(1, 1);
20 $right = new Twig_Node_Expression_Constant(2, 1);
21 $node = new Twig_Node_Expression_Binary_Add($left, $right, 1);
22
23 $this->assertEquals($left, $node->getNode('left'));
24 $this->assertEquals($right, $node->getNode('right'));
25 }
26
27 /**
28 * @covers Twig_Node_Expression_Binary_Add::compile
29 * @covers Twig_Node_Expression_Binary_Add::operator
30 * @dataProvider getTests
31 */
32 public function testCompile($node, $source, $environment = null)
33 {
34 parent::testCompile($node, $source, $environment);
35 }
36
37 public function getTests()
38 {
39 $left = new Twig_Node_Expression_Constant(1, 1);
40 $right = new Twig_Node_Expression_Constant(2, 1);
41 $node = new Twig_Node_Expression_Binary_Add($left, $right, 1);
42
43 return array(
44 array($node, '(1 + 2)'),
45 );
46 }
47}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AndTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AndTest.php
new file mode 100644
index 00000000..50e551a7
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AndTest.php
@@ -0,0 +1,47 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_Binary_AndTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Binary_And::__construct
16 */
17 public function testConstructor()
18 {
19 $left = new Twig_Node_Expression_Constant(1, 1);
20 $right = new Twig_Node_Expression_Constant(2, 1);
21 $node = new Twig_Node_Expression_Binary_And($left, $right, 1);
22
23 $this->assertEquals($left, $node->getNode('left'));
24 $this->assertEquals($right, $node->getNode('right'));
25 }
26
27 /**
28 * @covers Twig_Node_Expression_Binary_And::compile
29 * @covers Twig_Node_Expression_Binary_And::operator
30 * @dataProvider getTests
31 */
32 public function testCompile($node, $source, $environment = null)
33 {
34 parent::testCompile($node, $source, $environment);
35 }
36
37 public function getTests()
38 {
39 $left = new Twig_Node_Expression_Constant(1, 1);
40 $right = new Twig_Node_Expression_Constant(2, 1);
41 $node = new Twig_Node_Expression_Binary_And($left, $right, 1);
42
43 return array(
44 array($node, '(1 && 2)'),
45 );
46 }
47}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ConcatTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ConcatTest.php
new file mode 100644
index 00000000..140329fa
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ConcatTest.php
@@ -0,0 +1,47 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_Binary_ConcatTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Binary_Concat::__construct
16 */
17 public function testConstructor()
18 {
19 $left = new Twig_Node_Expression_Constant(1, 1);
20 $right = new Twig_Node_Expression_Constant(2, 1);
21 $node = new Twig_Node_Expression_Binary_Concat($left, $right, 1);
22
23 $this->assertEquals($left, $node->getNode('left'));
24 $this->assertEquals($right, $node->getNode('right'));
25 }
26
27 /**
28 * @covers Twig_Node_Expression_Binary_Concat::compile
29 * @covers Twig_Node_Expression_Binary_Concat::operator
30 * @dataProvider getTests
31 */
32 public function testCompile($node, $source, $environment = null)
33 {
34 parent::testCompile($node, $source, $environment);
35 }
36
37 public function getTests()
38 {
39 $left = new Twig_Node_Expression_Constant(1, 1);
40 $right = new Twig_Node_Expression_Constant(2, 1);
41 $node = new Twig_Node_Expression_Binary_Concat($left, $right, 1);
42
43 return array(
44 array($node, '(1 . 2)'),
45 );
46 }
47}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/DivTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/DivTest.php
new file mode 100644
index 00000000..0c1a3c7f
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/DivTest.php
@@ -0,0 +1,47 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_Binary_DivTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Binary_Div::__construct
16 */
17 public function testConstructor()
18 {
19 $left = new Twig_Node_Expression_Constant(1, 1);
20 $right = new Twig_Node_Expression_Constant(2, 1);
21 $node = new Twig_Node_Expression_Binary_Div($left, $right, 1);
22
23 $this->assertEquals($left, $node->getNode('left'));
24 $this->assertEquals($right, $node->getNode('right'));
25 }
26
27 /**
28 * @covers Twig_Node_Expression_Binary_Div::compile
29 * @covers Twig_Node_Expression_Binary_Div::operator
30 * @dataProvider getTests
31 */
32 public function testCompile($node, $source, $environment = null)
33 {
34 parent::testCompile($node, $source, $environment);
35 }
36
37 public function getTests()
38 {
39 $left = new Twig_Node_Expression_Constant(1, 1);
40 $right = new Twig_Node_Expression_Constant(2, 1);
41 $node = new Twig_Node_Expression_Binary_Div($left, $right, 1);
42
43 return array(
44 array($node, '(1 / 2)'),
45 );
46 }
47}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/FloorDivTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/FloorDivTest.php
new file mode 100644
index 00000000..ead1fde8
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/FloorDivTest.php
@@ -0,0 +1,47 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_Binary_FloorDivTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Binary_FloorDiv::__construct
16 */
17 public function testConstructor()
18 {
19 $left = new Twig_Node_Expression_Constant(1, 1);
20 $right = new Twig_Node_Expression_Constant(2, 1);
21 $node = new Twig_Node_Expression_Binary_FloorDiv($left, $right, 1);
22
23 $this->assertEquals($left, $node->getNode('left'));
24 $this->assertEquals($right, $node->getNode('right'));
25 }
26
27 /**
28 * @covers Twig_Node_Expression_Binary_FloorDiv::compile
29 * @covers Twig_Node_Expression_Binary_FloorDiv::operator
30 * @dataProvider getTests
31 */
32 public function testCompile($node, $source, $environment = null)
33 {
34 parent::testCompile($node, $source, $environment);
35 }
36
37 public function getTests()
38 {
39 $left = new Twig_Node_Expression_Constant(1, 1);
40 $right = new Twig_Node_Expression_Constant(2, 1);
41 $node = new Twig_Node_Expression_Binary_FloorDiv($left, $right, 1);
42
43 return array(
44 array($node, 'intval(floor((1 / 2)))'),
45 );
46 }
47}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ModTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ModTest.php
new file mode 100644
index 00000000..4fe1a1fc
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ModTest.php
@@ -0,0 +1,47 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_Binary_ModTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Binary_Mod::__construct
16 */
17 public function testConstructor()
18 {
19 $left = new Twig_Node_Expression_Constant(1, 1);
20 $right = new Twig_Node_Expression_Constant(2, 1);
21 $node = new Twig_Node_Expression_Binary_Mod($left, $right, 1);
22
23 $this->assertEquals($left, $node->getNode('left'));
24 $this->assertEquals($right, $node->getNode('right'));
25 }
26
27 /**
28 * @covers Twig_Node_Expression_Binary_Mod::compile
29 * @covers Twig_Node_Expression_Binary_Mod::operator
30 * @dataProvider getTests
31 */
32 public function testCompile($node, $source, $environment = null)
33 {
34 parent::testCompile($node, $source, $environment);
35 }
36
37 public function getTests()
38 {
39 $left = new Twig_Node_Expression_Constant(1, 1);
40 $right = new Twig_Node_Expression_Constant(2, 1);
41 $node = new Twig_Node_Expression_Binary_Mod($left, $right, 1);
42
43 return array(
44 array($node, '(1 % 2)'),
45 );
46 }
47}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/MulTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/MulTest.php
new file mode 100644
index 00000000..12bb35c9
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/MulTest.php
@@ -0,0 +1,47 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_Binary_MulTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Binary_Mul::__construct
16 */
17 public function testConstructor()
18 {
19 $left = new Twig_Node_Expression_Constant(1, 1);
20 $right = new Twig_Node_Expression_Constant(2, 1);
21 $node = new Twig_Node_Expression_Binary_Mul($left, $right, 1);
22
23 $this->assertEquals($left, $node->getNode('left'));
24 $this->assertEquals($right, $node->getNode('right'));
25 }
26
27 /**
28 * @covers Twig_Node_Expression_Binary_Mul::compile
29 * @covers Twig_Node_Expression_Binary_Mul::operator
30 * @dataProvider getTests
31 */
32 public function testCompile($node, $source, $environment = null)
33 {
34 parent::testCompile($node, $source, $environment);
35 }
36
37 public function getTests()
38 {
39 $left = new Twig_Node_Expression_Constant(1, 1);
40 $right = new Twig_Node_Expression_Constant(2, 1);
41 $node = new Twig_Node_Expression_Binary_Mul($left, $right, 1);
42
43 return array(
44 array($node, '(1 * 2)'),
45 );
46 }
47}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/OrTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/OrTest.php
new file mode 100644
index 00000000..9534c41c
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/OrTest.php
@@ -0,0 +1,47 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_Binary_OrTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Binary_Or::__construct
16 */
17 public function testConstructor()
18 {
19 $left = new Twig_Node_Expression_Constant(1, 1);
20 $right = new Twig_Node_Expression_Constant(2, 1);
21 $node = new Twig_Node_Expression_Binary_Or($left, $right, 1);
22
23 $this->assertEquals($left, $node->getNode('left'));
24 $this->assertEquals($right, $node->getNode('right'));
25 }
26
27 /**
28 * @covers Twig_Node_Expression_Binary_Or::compile
29 * @covers Twig_Node_Expression_Binary_Or::operator
30 * @dataProvider getTests
31 */
32 public function testCompile($node, $source, $environment = null)
33 {
34 parent::testCompile($node, $source, $environment);
35 }
36
37 public function getTests()
38 {
39 $left = new Twig_Node_Expression_Constant(1, 1);
40 $right = new Twig_Node_Expression_Constant(2, 1);
41 $node = new Twig_Node_Expression_Binary_Or($left, $right, 1);
42
43 return array(
44 array($node, '(1 || 2)'),
45 );
46 }
47}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/SubTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/SubTest.php
new file mode 100644
index 00000000..9074893b
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/SubTest.php
@@ -0,0 +1,47 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_Binary_SubTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Binary_Sub::__construct
16 */
17 public function testConstructor()
18 {
19 $left = new Twig_Node_Expression_Constant(1, 1);
20 $right = new Twig_Node_Expression_Constant(2, 1);
21 $node = new Twig_Node_Expression_Binary_Sub($left, $right, 1);
22
23 $this->assertEquals($left, $node->getNode('left'));
24 $this->assertEquals($right, $node->getNode('right'));
25 }
26
27 /**
28 * @covers Twig_Node_Expression_Binary_Sub::compile
29 * @covers Twig_Node_Expression_Binary_Sub::operator
30 * @dataProvider getTests
31 */
32 public function testCompile($node, $source, $environment = null)
33 {
34 parent::testCompile($node, $source, $environment);
35 }
36
37 public function getTests()
38 {
39 $left = new Twig_Node_Expression_Constant(1, 1);
40 $right = new Twig_Node_Expression_Constant(2, 1);
41 $node = new Twig_Node_Expression_Binary_Sub($left, $right, 1);
42
43 return array(
44 array($node, '(1 - 2)'),
45 );
46 }
47}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/CallTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/CallTest.php
new file mode 100644
index 00000000..53b5e6ee
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/CallTest.php
@@ -0,0 +1,67 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_CallTest extends PHPUnit_Framework_TestCase
13{
14 public function testGetArguments()
15 {
16 $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'date'));
17 $this->assertEquals(array('U'), $node->getArguments('date', array('format' => 'U')));
18 }
19
20 /**
21 * @expectedException Twig_Error_Syntax
22 * @expectedExceptionMessage Positional arguments cannot be used after named arguments for function "date".
23 */
24 public function testGetArgumentsWhenPositionalArgumentsAfterNamedArguments()
25 {
26 $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'date'));
27 $node->getArguments('date', array('timestamp' => 123456, 'Y-m-d'));
28 }
29
30 /**
31 * @expectedException Twig_Error_Syntax
32 * @expectedExceptionMessage Argument "format" is defined twice for function "date".
33 */
34 public function testGetArgumentsWhenArgumentIsDefinedTwice()
35 {
36 $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'date'));
37 $node->getArguments('date', array('Y-m-d', 'format' => 'U'));
38 }
39
40 /**
41 * @expectedException Twig_Error_Syntax
42 * @expectedExceptionMessage Unknown argument "unknown" for function "date".
43 */
44 public function testGetArgumentsWithWrongNamedArgumentName()
45 {
46 $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'date'));
47 $node->getArguments('date', array('Y-m-d', 'unknown' => ''));
48 }
49
50 /**
51 * @expectedException Twig_Error_Syntax
52 * @expectedExceptionMessage Unknown arguments "unknown1", "unknown2" for function "date".
53 */
54 public function testGetArgumentsWithWrongNamedArgumentNames()
55 {
56 $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'date'));
57 $node->getArguments('date', array('Y-m-d', 'unknown1' => '', 'unknown2' => ''));
58 }
59}
60
61class Twig_Tests_Node_Expression_Call extends Twig_Node_Expression_Call
62{
63 public function getArguments($callable, $arguments)
64 {
65 return parent::getArguments($callable, $arguments);
66 }
67}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConditionalTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConditionalTest.php
new file mode 100644
index 00000000..9906d512
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConditionalTest.php
@@ -0,0 +1,50 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_ConditionalTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Conditional::__construct
16 */
17 public function testConstructor()
18 {
19 $expr1 = new Twig_Node_Expression_Constant(1, 1);
20 $expr2 = new Twig_Node_Expression_Constant(2, 1);
21 $expr3 = new Twig_Node_Expression_Constant(3, 1);
22 $node = new Twig_Node_Expression_Conditional($expr1, $expr2, $expr3, 1);
23
24 $this->assertEquals($expr1, $node->getNode('expr1'));
25 $this->assertEquals($expr2, $node->getNode('expr2'));
26 $this->assertEquals($expr3, $node->getNode('expr3'));
27 }
28
29 /**
30 * @covers Twig_Node_Expression_Conditional::compile
31 * @dataProvider getTests
32 */
33 public function testCompile($node, $source, $environment = null)
34 {
35 parent::testCompile($node, $source, $environment);
36 }
37
38 public function getTests()
39 {
40 $tests = array();
41
42 $expr1 = new Twig_Node_Expression_Constant(1, 1);
43 $expr2 = new Twig_Node_Expression_Constant(2, 1);
44 $expr3 = new Twig_Node_Expression_Constant(3, 1);
45 $node = new Twig_Node_Expression_Conditional($expr1, $expr2, $expr3, 1);
46 $tests[] = array($node, '((1) ? (2) : (3))');
47
48 return $tests;
49 }
50}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConstantTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConstantTest.php
new file mode 100644
index 00000000..d0dec531
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConstantTest.php
@@ -0,0 +1,42 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_ConstantTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Constant::__construct
16 */
17 public function testConstructor()
18 {
19 $node = new Twig_Node_Expression_Constant('foo', 1);
20
21 $this->assertEquals('foo', $node->getAttribute('value'));
22 }
23
24 /**
25 * @covers Twig_Node_Expression_Constant::compile
26 * @dataProvider getTests
27 */
28 public function testCompile($node, $source, $environment = null)
29 {
30 parent::testCompile($node, $source, $environment);
31 }
32
33 public function getTests()
34 {
35 $tests = array();
36
37 $node = new Twig_Node_Expression_Constant('foo', 1);
38 $tests[] = array($node, '"foo"');
39
40 return $tests;
41 }
42}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/FilterTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/FilterTest.php
new file mode 100644
index 00000000..8089b9cb
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/FilterTest.php
@@ -0,0 +1,133 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_FilterTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Filter::__construct
16 */
17 public function testConstructor()
18 {
19 $expr = new Twig_Node_Expression_Constant('foo', 1);
20 $name = new Twig_Node_Expression_Constant('upper', 1);
21 $args = new Twig_Node();
22 $node = new Twig_Node_Expression_Filter($expr, $name, $args, 1);
23
24 $this->assertEquals($expr, $node->getNode('node'));
25 $this->assertEquals($name, $node->getNode('filter'));
26 $this->assertEquals($args, $node->getNode('arguments'));
27 }
28
29 /**
30 * @covers Twig_Node_Expression_Filter::compile
31 * @dataProvider getTests
32 */
33 public function testCompile($node, $source, $environment = null)
34 {
35 parent::testCompile($node, $source, $environment);
36 }
37
38 public function getTests()
39 {
40 $tests = array();
41
42 $expr = new Twig_Node_Expression_Constant('foo', 1);
43 $node = $this->createFilter($expr, 'upper');
44 $node = $this->createFilter($node, 'number_format', array(new Twig_Node_Expression_Constant(2, 1), new Twig_Node_Expression_Constant('.', 1), new Twig_Node_Expression_Constant(',', 1)));
45
46 if (function_exists('mb_get_info')) {
47 $tests[] = array($node, 'twig_number_format_filter($this->env, twig_upper_filter($this->env, "foo"), 2, ".", ",")');
48 } else {
49 $tests[] = array($node, 'twig_number_format_filter($this->env, strtoupper("foo"), 2, ".", ",")');
50 }
51
52 // named arguments
53 $date = new Twig_Node_Expression_Constant(0, 1);
54 $node = $this->createFilter($date, 'date', array(
55 'timezone' => new Twig_Node_Expression_Constant('America/Chicago', 1),
56 'format' => new Twig_Node_Expression_Constant('d/m/Y H:i:s P', 1),
57 ));
58 $tests[] = array($node, 'twig_date_format_filter($this->env, 0, "d/m/Y H:i:s P", "America/Chicago")');
59
60 // skip an optional argument
61 $date = new Twig_Node_Expression_Constant(0, 1);
62 $node = $this->createFilter($date, 'date', array(
63 'timezone' => new Twig_Node_Expression_Constant('America/Chicago', 1),
64 ));
65 $tests[] = array($node, 'twig_date_format_filter($this->env, 0, null, "America/Chicago")');
66
67 // underscores vs camelCase for named arguments
68 $string = new Twig_Node_Expression_Constant('abc', 1);
69 $node = $this->createFilter($string, 'reverse', array(
70 'preserve_keys' => new Twig_Node_Expression_Constant(true, 1),
71 ));
72 $tests[] = array($node, 'twig_reverse_filter($this->env, "abc", true)');
73 $node = $this->createFilter($string, 'reverse', array(
74 'preserveKeys' => new Twig_Node_Expression_Constant(true, 1),
75 ));
76 $tests[] = array($node, 'twig_reverse_filter($this->env, "abc", true)');
77
78 // filter as an anonymous function
79 if (version_compare(phpversion(), '5.3.0', '>=')) {
80 $node = $this->createFilter(new Twig_Node_Expression_Constant('foo', 1), 'anonymous');
81 $tests[] = array($node, 'call_user_func_array($this->env->getFilter(\'anonymous\')->getCallable(), array("foo"))');
82 }
83
84 return $tests;
85 }
86
87 /**
88 * @expectedException Twig_Error_Syntax
89 * @expectedExceptionMessage Unknown argument "foobar" for filter "date".
90 */
91 public function testCompileWithWrongNamedArgumentName()
92 {
93 $date = new Twig_Node_Expression_Constant(0, 1);
94 $node = $this->createFilter($date, 'date', array(
95 'foobar' => new Twig_Node_Expression_Constant('America/Chicago', 1),
96 ));
97
98 $compiler = $this->getCompiler();
99 $compiler->compile($node);
100 }
101
102 /**
103 * @expectedException Twig_Error_Syntax
104 * @expectedExceptionMessage Value for argument "from" is required for filter "replace".
105 */
106 public function testCompileWithMissingNamedArgument()
107 {
108 $value = new Twig_Node_Expression_Constant(0, 1);
109 $node = $this->createFilter($value, 'replace', array(
110 'to' => new Twig_Node_Expression_Constant('foo', 1),
111 ));
112
113 $compiler = $this->getCompiler();
114 $compiler->compile($node);
115 }
116
117 protected function createFilter($node, $name, array $arguments = array())
118 {
119 $name = new Twig_Node_Expression_Constant($name, 1);
120 $arguments = new Twig_Node($arguments);
121
122 return new Twig_Node_Expression_Filter($node, $name, $arguments, 1);
123 }
124
125 protected function getEnvironment()
126 {
127 if (version_compare(phpversion(), '5.3.0', '>=')) {
128 return include 'PHP53/FilterInclude.php';
129 }
130
131 return parent::getEnvironment();
132 }
133}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/FunctionTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/FunctionTest.php
new file mode 100644
index 00000000..431dc387
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/FunctionTest.php
@@ -0,0 +1,99 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_FunctionTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Function::__construct
16 */
17 public function testConstructor()
18 {
19 $name = 'function';
20 $args = new Twig_Node();
21 $node = new Twig_Node_Expression_Function($name, $args, 1);
22
23 $this->assertEquals($name, $node->getAttribute('name'));
24 $this->assertEquals($args, $node->getNode('arguments'));
25 }
26
27 /**
28 * @covers Twig_Node_Expression_Function::compile
29 * @dataProvider getTests
30 */
31 public function testCompile($node, $source, $environment = null)
32 {
33 parent::testCompile($node, $source, $environment);
34 }
35
36 public function getTests()
37 {
38 $environment = new Twig_Environment();
39 $environment->addFunction('foo', new Twig_Function_Function('foo', array()));
40 $environment->addFunction('bar', new Twig_Function_Function('bar', array('needs_environment' => true)));
41 $environment->addFunction('foofoo', new Twig_Function_Function('foofoo', array('needs_context' => true)));
42 $environment->addFunction('foobar', new Twig_Function_Function('foobar', array('needs_environment' => true, 'needs_context' => true)));
43
44 $tests = array();
45
46 $node = $this->createFunction('foo');
47 $tests[] = array($node, 'foo()', $environment);
48
49 $node = $this->createFunction('foo', array(new Twig_Node_Expression_Constant('bar', 1), new Twig_Node_Expression_Constant('foobar', 1)));
50 $tests[] = array($node, 'foo("bar", "foobar")', $environment);
51
52 $node = $this->createFunction('bar');
53 $tests[] = array($node, 'bar($this->env)', $environment);
54
55 $node = $this->createFunction('bar', array(new Twig_Node_Expression_Constant('bar', 1)));
56 $tests[] = array($node, 'bar($this->env, "bar")', $environment);
57
58 $node = $this->createFunction('foofoo');
59 $tests[] = array($node, 'foofoo($context)', $environment);
60
61 $node = $this->createFunction('foofoo', array(new Twig_Node_Expression_Constant('bar', 1)));
62 $tests[] = array($node, 'foofoo($context, "bar")', $environment);
63
64 $node = $this->createFunction('foobar');
65 $tests[] = array($node, 'foobar($this->env, $context)', $environment);
66
67 $node = $this->createFunction('foobar', array(new Twig_Node_Expression_Constant('bar', 1)));
68 $tests[] = array($node, 'foobar($this->env, $context, "bar")', $environment);
69
70 // named arguments
71 $node = $this->createFunction('date', array(
72 'timezone' => new Twig_Node_Expression_Constant('America/Chicago', 1),
73 'date' => new Twig_Node_Expression_Constant(0, 1),
74 ));
75 $tests[] = array($node, 'twig_date_converter($this->env, 0, "America/Chicago")');
76
77 // function as an anonymous function
78 if (version_compare(phpversion(), '5.3.0', '>=')) {
79 $node = $this->createFunction('anonymous', array(new Twig_Node_Expression_Constant('foo', 1)));
80 $tests[] = array($node, 'call_user_func_array($this->env->getFunction(\'anonymous\')->getCallable(), array("foo"))');
81 }
82
83 return $tests;
84 }
85
86 protected function createFunction($name, array $arguments = array())
87 {
88 return new Twig_Node_Expression_Function($name, new Twig_Node($arguments), 1);
89 }
90
91 protected function getEnvironment()
92 {
93 if (version_compare(phpversion(), '5.3.0', '>=')) {
94 return include 'PHP53/FunctionInclude.php';
95 }
96
97 return parent::getEnvironment();
98 }
99}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/GetAttrTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/GetAttrTest.php
new file mode 100644
index 00000000..6a63cce6
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/GetAttrTest.php
@@ -0,0 +1,62 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_GetAttrTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_GetAttr::__construct
16 */
17 public function testConstructor()
18 {
19 $expr = new Twig_Node_Expression_Name('foo', 1);
20 $attr = new Twig_Node_Expression_Constant('bar', 1);
21 $args = new Twig_Node_Expression_Array(array(), 1);
22 $args->addElement(new Twig_Node_Expression_Name('foo', 1));
23 $args->addElement(new Twig_Node_Expression_Constant('bar', 1));
24 $node = new Twig_Node_Expression_GetAttr($expr, $attr, $args, Twig_TemplateInterface::ARRAY_CALL, 1);
25
26 $this->assertEquals($expr, $node->getNode('node'));
27 $this->assertEquals($attr, $node->getNode('attribute'));
28 $this->assertEquals($args, $node->getNode('arguments'));
29 $this->assertEquals(Twig_TemplateInterface::ARRAY_CALL, $node->getAttribute('type'));
30 }
31
32 /**
33 * @covers Twig_Node_Expression_GetAttr::compile
34 * @dataProvider getTests
35 */
36 public function testCompile($node, $source, $environment = null)
37 {
38 parent::testCompile($node, $source, $environment);
39 }
40
41 public function getTests()
42 {
43 $tests = array();
44
45 $expr = new Twig_Node_Expression_Name('foo', 1);
46 $attr = new Twig_Node_Expression_Constant('bar', 1);
47 $args = new Twig_Node_Expression_Array(array(), 1);
48 $node = new Twig_Node_Expression_GetAttr($expr, $attr, $args, Twig_TemplateInterface::ANY_CALL, 1);
49 $tests[] = array($node, sprintf('%s%s, "bar")', $this->getAttributeGetter(), $this->getVariableGetter('foo')));
50
51 $node = new Twig_Node_Expression_GetAttr($expr, $attr, $args, Twig_TemplateInterface::ARRAY_CALL, 1);
52 $tests[] = array($node, sprintf('%s%s, "bar", array(), "array")', $this->getAttributeGetter(), $this->getVariableGetter('foo')));
53
54 $args = new Twig_Node_Expression_Array(array(), 1);
55 $args->addElement(new Twig_Node_Expression_Name('foo', 1));
56 $args->addElement(new Twig_Node_Expression_Constant('bar', 1));
57 $node = new Twig_Node_Expression_GetAttr($expr, $attr, $args, Twig_TemplateInterface::METHOD_CALL, 1);
58 $tests[] = array($node, sprintf('%s%s, "bar", array(0 => %s, 1 => "bar"), "method")', $this->getAttributeGetter(), $this->getVariableGetter('foo'), $this->getVariableGetter('foo')));
59
60 return $tests;
61 }
62}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/NameTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/NameTest.php
new file mode 100644
index 00000000..76d109b6
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/NameTest.php
@@ -0,0 +1,49 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_NameTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Name::__construct
16 */
17 public function testConstructor()
18 {
19 $node = new Twig_Node_Expression_Name('foo', 1);
20
21 $this->assertEquals('foo', $node->getAttribute('name'));
22 }
23
24 /**
25 * @covers Twig_Node_Expression_Name::compile
26 * @dataProvider getTests
27 */
28 public function testCompile($node, $source, $environment = null)
29 {
30 parent::testCompile($node, $source, $environment);
31 }
32
33 public function getTests()
34 {
35 $node = new Twig_Node_Expression_Name('foo', 1);
36 $self = new Twig_Node_Expression_Name('_self', 1);
37 $context = new Twig_Node_Expression_Name('_context', 1);
38
39 $env = new Twig_Environment(null, array('strict_variables' => true));
40 $env1 = new Twig_Environment(null, array('strict_variables' => false));
41
42 return array(
43 version_compare(PHP_VERSION, '5.4.0') >= 0 ? array($node, '(isset($context["foo"]) ? $context["foo"] : $this->getContext($context, "foo"))', $env) : array($node, '$this->getContext($context, "foo")', $env),
44 array($node, $this->getVariableGetter('foo'), $env1),
45 array($self, '$this'),
46 array($context, '$context'),
47 );
48 }
49}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FilterInclude.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FilterInclude.php
new file mode 100644
index 00000000..15e3aa96
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FilterInclude.php
@@ -0,0 +1,6 @@
1<?php
2
3$env = new Twig_Environment();
4$env->addFilter(new Twig_SimpleFilter('anonymous', function () {}));
5
6return $env;
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FunctionInclude.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FunctionInclude.php
new file mode 100644
index 00000000..d2170ed2
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FunctionInclude.php
@@ -0,0 +1,6 @@
1<?php
2
3$env = new Twig_Environment();
4$env->addFunction(new Twig_SimpleFunction('anonymous', function () {}));
5
6return $env;
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/TestInclude.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/TestInclude.php
new file mode 100644
index 00000000..63662864
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/TestInclude.php
@@ -0,0 +1,6 @@
1<?php
2
3$env = new Twig_Environment();
4$env->addTest(new Twig_SimpleTest('anonymous', function () {}));
5
6return $env;
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/ParentTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/ParentTest.php
new file mode 100644
index 00000000..4d40419b
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/ParentTest.php
@@ -0,0 +1,40 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_ParentTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Parent::__construct
16 */
17 public function testConstructor()
18 {
19 $node = new Twig_Node_Expression_Parent('foo', 1);
20
21 $this->assertEquals('foo', $node->getAttribute('name'));
22 }
23
24 /**
25 * @covers Twig_Node_Expression_Parent::compile
26 * @dataProvider getTests
27 */
28 public function testCompile($node, $source, $environment = null)
29 {
30 parent::testCompile($node, $source, $environment);
31 }
32
33 public function getTests()
34 {
35 $tests = array();
36 $tests[] = array(new Twig_Node_Expression_Parent('foo', 1), '$this->renderParentBlock("foo", $context, $blocks)');
37
38 return $tests;
39 }
40}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/TestTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/TestTest.php
new file mode 100644
index 00000000..0664150a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/TestTest.php
@@ -0,0 +1,68 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_TestTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Test::__construct
16 */
17 public function testConstructor()
18 {
19 $expr = new Twig_Node_Expression_Constant('foo', 1);
20 $name = new Twig_Node_Expression_Constant('null', 1);
21 $args = new Twig_Node();
22 $node = new Twig_Node_Expression_Test($expr, $name, $args, 1);
23
24 $this->assertEquals($expr, $node->getNode('node'));
25 $this->assertEquals($args, $node->getNode('arguments'));
26 $this->assertEquals($name, $node->getAttribute('name'));
27 }
28
29 /**
30 * @covers Twig_Node_Expression_Test::compile
31 * @dataProvider getTests
32 */
33 public function testCompile($node, $source, $environment = null)
34 {
35 parent::testCompile($node, $source, $environment);
36 }
37
38 public function getTests()
39 {
40 $tests = array();
41
42 $expr = new Twig_Node_Expression_Constant('foo', 1);
43 $node = new Twig_Node_Expression_Test_Null($expr, 'null', new Twig_Node(array()), 1);
44 $tests[] = array($node, '(null === "foo")');
45
46 // test as an anonymous function
47 if (version_compare(phpversion(), '5.3.0', '>=')) {
48 $node = $this->createTest(new Twig_Node_Expression_Constant('foo', 1), 'anonymous', array(new Twig_Node_Expression_Constant('foo', 1)));
49 $tests[] = array($node, 'call_user_func_array($this->env->getTest(\'anonymous\')->getCallable(), array("foo", "foo"))');
50 }
51
52 return $tests;
53 }
54
55 protected function createTest($node, $name, array $arguments = array())
56 {
57 return new Twig_Node_Expression_Test($node, $name, new Twig_Node($arguments), 1);
58 }
59
60 protected function getEnvironment()
61 {
62 if (version_compare(phpversion(), '5.3.0', '>=')) {
63 return include 'PHP53/TestInclude.php';
64 }
65
66 return parent::getEnvironment();
67 }
68}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NegTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NegTest.php
new file mode 100644
index 00000000..d55ab333
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NegTest.php
@@ -0,0 +1,44 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_Unary_NegTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Unary_Neg::__construct
16 */
17 public function testConstructor()
18 {
19 $expr = new Twig_Node_Expression_Constant(1, 1);
20 $node = new Twig_Node_Expression_Unary_Neg($expr, 1);
21
22 $this->assertEquals($expr, $node->getNode('node'));
23 }
24
25 /**
26 * @covers Twig_Node_Expression_Unary_Neg::compile
27 * @covers Twig_Node_Expression_Unary_Neg::operator
28 * @dataProvider getTests
29 */
30 public function testCompile($node, $source, $environment = null)
31 {
32 parent::testCompile($node, $source, $environment);
33 }
34
35 public function getTests()
36 {
37 $node = new Twig_Node_Expression_Constant(1, 1);
38 $node = new Twig_Node_Expression_Unary_Neg($node, 1);
39
40 return array(
41 array($node, '(-1)'),
42 );
43 }
44}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NotTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NotTest.php
new file mode 100644
index 00000000..625c2527
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NotTest.php
@@ -0,0 +1,44 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_Unary_NotTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Unary_Not::__construct
16 */
17 public function testConstructor()
18 {
19 $expr = new Twig_Node_Expression_Constant(1, 1);
20 $node = new Twig_Node_Expression_Unary_Not($expr, 1);
21
22 $this->assertEquals($expr, $node->getNode('node'));
23 }
24
25 /**
26 * @covers Twig_Node_Expression_Unary_Not::compile
27 * @covers Twig_Node_Expression_Unary_Not::operator
28 * @dataProvider getTests
29 */
30 public function testCompile($node, $source, $environment = null)
31 {
32 parent::testCompile($node, $source, $environment);
33 }
34
35 public function getTests()
36 {
37 $node = new Twig_Node_Expression_Constant(1, 1);
38 $node = new Twig_Node_Expression_Unary_Not($node, 1);
39
40 return array(
41 array($node, '(!1)'),
42 );
43 }
44}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/PosTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/PosTest.php
new file mode 100644
index 00000000..047a0977
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/PosTest.php
@@ -0,0 +1,44 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_Expression_Unary_PosTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Expression_Unary_Pos::__construct
16 */
17 public function testConstructor()
18 {
19 $expr = new Twig_Node_Expression_Constant(1, 1);
20 $node = new Twig_Node_Expression_Unary_Pos($expr, 1);
21
22 $this->assertEquals($expr, $node->getNode('node'));
23 }
24
25 /**
26 * @covers Twig_Node_Expression_Unary_Pos::compile
27 * @covers Twig_Node_Expression_Unary_Pos::operator
28 * @dataProvider getTests
29 */
30 public function testCompile($node, $source, $environment = null)
31 {
32 parent::testCompile($node, $source, $environment);
33 }
34
35 public function getTests()
36 {
37 $node = new Twig_Node_Expression_Constant(1, 1);
38 $node = new Twig_Node_Expression_Unary_Pos($node, 1);
39
40 return array(
41 array($node, '(+1)'),
42 );
43 }
44}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/ForTest.php b/vendor/twig/twig/test/Twig/Tests/Node/ForTest.php
new file mode 100644
index 00000000..21cc84e6
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/ForTest.php
@@ -0,0 +1,203 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_ForTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_For::__construct
16 */
17 public function testConstructor()
18 {
19 $keyTarget = new Twig_Node_Expression_AssignName('key', 1);
20 $valueTarget = new Twig_Node_Expression_AssignName('item', 1);
21 $seq = new Twig_Node_Expression_Name('items', 1);
22 $ifexpr = new Twig_Node_Expression_Constant(true, 1);
23 $body = new Twig_Node(array(new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1)), array(), 1);
24 $else = null;
25 $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
26 $node->setAttribute('with_loop', false);
27
28 $this->assertEquals($keyTarget, $node->getNode('key_target'));
29 $this->assertEquals($valueTarget, $node->getNode('value_target'));
30 $this->assertEquals($seq, $node->getNode('seq'));
31 $this->assertTrue($node->getAttribute('ifexpr'));
32 $this->assertEquals('Twig_Node_If', get_class($node->getNode('body')));
33 $this->assertEquals($body, $node->getNode('body')->getNode('tests')->getNode(1)->getNode(0));
34 $this->assertEquals(null, $node->getNode('else'));
35
36 $else = new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1);
37 $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
38 $node->setAttribute('with_loop', false);
39 $this->assertEquals($else, $node->getNode('else'));
40 }
41
42 /**
43 * @covers Twig_Node_For::compile
44 * @dataProvider getTests
45 */
46 public function testCompile($node, $source, $environment = null)
47 {
48 parent::testCompile($node, $source, $environment);
49 }
50
51 public function getTests()
52 {
53 $tests = array();
54
55 $keyTarget = new Twig_Node_Expression_AssignName('key', 1);
56 $valueTarget = new Twig_Node_Expression_AssignName('item', 1);
57 $seq = new Twig_Node_Expression_Name('items', 1);
58 $ifexpr = null;
59 $body = new Twig_Node(array(new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1)), array(), 1);
60 $else = null;
61 $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
62 $node->setAttribute('with_loop', false);
63
64 $tests[] = array($node, <<<EOF
65// line 1
66\$context['_parent'] = (array) \$context;
67\$context['_seq'] = twig_ensure_traversable({$this->getVariableGetter('items')});
68foreach (\$context['_seq'] as \$context["key"] => \$context["item"]) {
69 echo {$this->getVariableGetter('foo')};
70}
71\$_parent = \$context['_parent'];
72unset(\$context['_seq'], \$context['_iterated'], \$context['key'], \$context['item'], \$context['_parent'], \$context['loop']);
73\$context = array_intersect_key(\$context, \$_parent) + \$_parent;
74EOF
75 );
76
77 $keyTarget = new Twig_Node_Expression_AssignName('k', 1);
78 $valueTarget = new Twig_Node_Expression_AssignName('v', 1);
79 $seq = new Twig_Node_Expression_Name('values', 1);
80 $ifexpr = null;
81 $body = new Twig_Node(array(new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1)), array(), 1);
82 $else = null;
83 $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
84 $node->setAttribute('with_loop', true);
85
86 $tests[] = array($node, <<<EOF
87// line 1
88\$context['_parent'] = (array) \$context;
89\$context['_seq'] = twig_ensure_traversable({$this->getVariableGetter('values')});
90\$context['loop'] = array(
91 'parent' => \$context['_parent'],
92 'index0' => 0,
93 'index' => 1,
94 'first' => true,
95);
96if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof Countable)) {
97 \$length = count(\$context['_seq']);
98 \$context['loop']['revindex0'] = \$length - 1;
99 \$context['loop']['revindex'] = \$length;
100 \$context['loop']['length'] = \$length;
101 \$context['loop']['last'] = 1 === \$length;
102}
103foreach (\$context['_seq'] as \$context["k"] => \$context["v"]) {
104 echo {$this->getVariableGetter('foo')};
105 ++\$context['loop']['index0'];
106 ++\$context['loop']['index'];
107 \$context['loop']['first'] = false;
108 if (isset(\$context['loop']['length'])) {
109 --\$context['loop']['revindex0'];
110 --\$context['loop']['revindex'];
111 \$context['loop']['last'] = 0 === \$context['loop']['revindex0'];
112 }
113}
114\$_parent = \$context['_parent'];
115unset(\$context['_seq'], \$context['_iterated'], \$context['k'], \$context['v'], \$context['_parent'], \$context['loop']);
116\$context = array_intersect_key(\$context, \$_parent) + \$_parent;
117EOF
118 );
119
120 $keyTarget = new Twig_Node_Expression_AssignName('k', 1);
121 $valueTarget = new Twig_Node_Expression_AssignName('v', 1);
122 $seq = new Twig_Node_Expression_Name('values', 1);
123 $ifexpr = new Twig_Node_Expression_Constant(true, 1);
124 $body = new Twig_Node(array(new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1)), array(), 1);
125 $else = null;
126 $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
127 $node->setAttribute('with_loop', true);
128
129 $tests[] = array($node, <<<EOF
130// line 1
131\$context['_parent'] = (array) \$context;
132\$context['_seq'] = twig_ensure_traversable({$this->getVariableGetter('values')});
133\$context['loop'] = array(
134 'parent' => \$context['_parent'],
135 'index0' => 0,
136 'index' => 1,
137 'first' => true,
138);
139foreach (\$context['_seq'] as \$context["k"] => \$context["v"]) {
140 if (true) {
141 echo {$this->getVariableGetter('foo')};
142 ++\$context['loop']['index0'];
143 ++\$context['loop']['index'];
144 \$context['loop']['first'] = false;
145 }
146}
147\$_parent = \$context['_parent'];
148unset(\$context['_seq'], \$context['_iterated'], \$context['k'], \$context['v'], \$context['_parent'], \$context['loop']);
149\$context = array_intersect_key(\$context, \$_parent) + \$_parent;
150EOF
151 );
152
153 $keyTarget = new Twig_Node_Expression_AssignName('k', 1);
154 $valueTarget = new Twig_Node_Expression_AssignName('v', 1);
155 $seq = new Twig_Node_Expression_Name('values', 1);
156 $ifexpr = null;
157 $body = new Twig_Node(array(new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1)), array(), 1);
158 $else = new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1);
159 $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
160 $node->setAttribute('with_loop', true);
161
162 $tests[] = array($node, <<<EOF
163// line 1
164\$context['_parent'] = (array) \$context;
165\$context['_seq'] = twig_ensure_traversable({$this->getVariableGetter('values')});
166\$context['_iterated'] = false;
167\$context['loop'] = array(
168 'parent' => \$context['_parent'],
169 'index0' => 0,
170 'index' => 1,
171 'first' => true,
172);
173if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof Countable)) {
174 \$length = count(\$context['_seq']);
175 \$context['loop']['revindex0'] = \$length - 1;
176 \$context['loop']['revindex'] = \$length;
177 \$context['loop']['length'] = \$length;
178 \$context['loop']['last'] = 1 === \$length;
179}
180foreach (\$context['_seq'] as \$context["k"] => \$context["v"]) {
181 echo {$this->getVariableGetter('foo')};
182 \$context['_iterated'] = true;
183 ++\$context['loop']['index0'];
184 ++\$context['loop']['index'];
185 \$context['loop']['first'] = false;
186 if (isset(\$context['loop']['length'])) {
187 --\$context['loop']['revindex0'];
188 --\$context['loop']['revindex'];
189 \$context['loop']['last'] = 0 === \$context['loop']['revindex0'];
190 }
191}
192if (!\$context['_iterated']) {
193 echo {$this->getVariableGetter('foo')};
194}
195\$_parent = \$context['_parent'];
196unset(\$context['_seq'], \$context['_iterated'], \$context['k'], \$context['v'], \$context['_parent'], \$context['loop']);
197\$context = array_intersect_key(\$context, \$_parent) + \$_parent;
198EOF
199 );
200
201 return $tests;
202 }
203}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/IfTest.php b/vendor/twig/twig/test/Twig/Tests/Node/IfTest.php
new file mode 100644
index 00000000..92fc29dc
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/IfTest.php
@@ -0,0 +1,100 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_IfTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_If::__construct
16 */
17 public function testConstructor()
18 {
19 $t = new Twig_Node(array(
20 new Twig_Node_Expression_Constant(true, 1),
21 new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1),
22 ), array(), 1);
23 $else = null;
24 $node = new Twig_Node_If($t, $else, 1);
25
26 $this->assertEquals($t, $node->getNode('tests'));
27 $this->assertEquals(null, $node->getNode('else'));
28
29 $else = new Twig_Node_Print(new Twig_Node_Expression_Name('bar', 1), 1);
30 $node = new Twig_Node_If($t, $else, 1);
31 $this->assertEquals($else, $node->getNode('else'));
32 }
33
34 /**
35 * @covers Twig_Node_If::compile
36 * @dataProvider getTests
37 */
38 public function testCompile($node, $source, $environment = null)
39 {
40 parent::testCompile($node, $source, $environment);
41 }
42
43 public function getTests()
44 {
45 $tests = array();
46
47 $t = new Twig_Node(array(
48 new Twig_Node_Expression_Constant(true, 1),
49 new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1),
50 ), array(), 1);
51 $else = null;
52 $node = new Twig_Node_If($t, $else, 1);
53
54 $tests[] = array($node, <<<EOF
55// line 1
56if (true) {
57 echo {$this->getVariableGetter('foo')};
58}
59EOF
60 );
61
62 $t = new Twig_Node(array(
63 new Twig_Node_Expression_Constant(true, 1),
64 new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1),
65 new Twig_Node_Expression_Constant(false, 1),
66 new Twig_Node_Print(new Twig_Node_Expression_Name('bar', 1), 1),
67 ), array(), 1);
68 $else = null;
69 $node = new Twig_Node_If($t, $else, 1);
70
71 $tests[] = array($node, <<<EOF
72// line 1
73if (true) {
74 echo {$this->getVariableGetter('foo')};
75} elseif (false) {
76 echo {$this->getVariableGetter('bar')};
77}
78EOF
79 );
80
81 $t = new Twig_Node(array(
82 new Twig_Node_Expression_Constant(true, 1),
83 new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1),
84 ), array(), 1);
85 $else = new Twig_Node_Print(new Twig_Node_Expression_Name('bar', 1), 1);
86 $node = new Twig_Node_If($t, $else, 1);
87
88 $tests[] = array($node, <<<EOF
89// line 1
90if (true) {
91 echo {$this->getVariableGetter('foo')};
92} else {
93 echo {$this->getVariableGetter('bar')};
94}
95EOF
96 );
97
98 return $tests;
99 }
100}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/ImportTest.php b/vendor/twig/twig/test/Twig/Tests/Node/ImportTest.php
new file mode 100644
index 00000000..db36581a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/ImportTest.php
@@ -0,0 +1,52 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_ImportTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Import::__construct
16 */
17 public function testConstructor()
18 {
19 $macro = new Twig_Node_Expression_Constant('foo.twig', 1);
20 $var = new Twig_Node_Expression_AssignName('macro', 1);
21 $node = new Twig_Node_Import($macro, $var, 1);
22
23 $this->assertEquals($macro, $node->getNode('expr'));
24 $this->assertEquals($var, $node->getNode('var'));
25 }
26
27 /**
28 * @covers Twig_Node_Import::compile
29 * @dataProvider getTests
30 */
31 public function testCompile($node, $source, $environment = null)
32 {
33 parent::testCompile($node, $source, $environment);
34 }
35
36 public function getTests()
37 {
38 $tests = array();
39
40 $macro = new Twig_Node_Expression_Constant('foo.twig', 1);
41 $var = new Twig_Node_Expression_AssignName('macro', 1);
42 $node = new Twig_Node_Import($macro, $var, 1);
43
44 $tests[] = array($node, <<<EOF
45// line 1
46\$context["macro"] = \$this->env->loadTemplate("foo.twig");
47EOF
48 );
49
50 return $tests;
51 }
52}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/IncludeTest.php b/vendor/twig/twig/test/Twig/Tests/Node/IncludeTest.php
new file mode 100644
index 00000000..3b7da6e0
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/IncludeTest.php
@@ -0,0 +1,96 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_IncludeTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Include::__construct
16 */
17 public function testConstructor()
18 {
19 $expr = new Twig_Node_Expression_Constant('foo.twig', 1);
20 $node = new Twig_Node_Include($expr, null, false, false, 1);
21
22 $this->assertEquals(null, $node->getNode('variables'));
23 $this->assertEquals($expr, $node->getNode('expr'));
24 $this->assertFalse($node->getAttribute('only'));
25
26 $vars = new Twig_Node_Expression_Array(array(new Twig_Node_Expression_Constant('foo', 1), new Twig_Node_Expression_Constant(true, 1)), 1);
27 $node = new Twig_Node_Include($expr, $vars, true, false, 1);
28 $this->assertEquals($vars, $node->getNode('variables'));
29 $this->assertTrue($node->getAttribute('only'));
30 }
31
32 /**
33 * @covers Twig_Node_Include::compile
34 * @dataProvider getTests
35 */
36 public function testCompile($node, $source, $environment = null)
37 {
38 parent::testCompile($node, $source, $environment);
39 }
40
41 public function getTests()
42 {
43 $tests = array();
44
45 $expr = new Twig_Node_Expression_Constant('foo.twig', 1);
46 $node = new Twig_Node_Include($expr, null, false, false, 1);
47 $tests[] = array($node, <<<EOF
48// line 1
49\$this->env->loadTemplate("foo.twig")->display(\$context);
50EOF
51 );
52
53 $expr = new Twig_Node_Expression_Conditional(
54 new Twig_Node_Expression_Constant(true, 1),
55 new Twig_Node_Expression_Constant('foo', 1),
56 new Twig_Node_Expression_Constant('foo', 1),
57 0
58 );
59 $node = new Twig_Node_Include($expr, null, false, false, 1);
60 $tests[] = array($node, <<<EOF
61// line 1
62\$template = \$this->env->resolveTemplate(((true) ? ("foo") : ("foo")));
63\$template->display(\$context);
64EOF
65 );
66
67 $expr = new Twig_Node_Expression_Constant('foo.twig', 1);
68 $vars = new Twig_Node_Expression_Array(array(new Twig_Node_Expression_Constant('foo', 1), new Twig_Node_Expression_Constant(true, 1)), 1);
69 $node = new Twig_Node_Include($expr, $vars, false, false, 1);
70 $tests[] = array($node, <<<EOF
71// line 1
72\$this->env->loadTemplate("foo.twig")->display(array_merge(\$context, array("foo" => true)));
73EOF
74 );
75
76 $node = new Twig_Node_Include($expr, $vars, true, false, 1);
77 $tests[] = array($node, <<<EOF
78// line 1
79\$this->env->loadTemplate("foo.twig")->display(array("foo" => true));
80EOF
81 );
82
83 $node = new Twig_Node_Include($expr, $vars, true, true, 1);
84 $tests[] = array($node, <<<EOF
85// line 1
86try {
87 \$this->env->loadTemplate("foo.twig")->display(array("foo" => true));
88} catch (Twig_Error_Loader \$e) {
89 // ignore missing template
90}
91EOF
92 );
93
94 return $tests;
95 }
96}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/MacroTest.php b/vendor/twig/twig/test/Twig/Tests/Node/MacroTest.php
new file mode 100644
index 00000000..4d2f641b
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/MacroTest.php
@@ -0,0 +1,73 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_MacroTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Macro::__construct
16 */
17 public function testConstructor()
18 {
19 $body = new Twig_Node_Text('foo', 1);
20 $arguments = new Twig_Node(array(new Twig_Node_Expression_Name('foo', 1)), array(), 1);
21 $node = new Twig_Node_Macro('foo', $body, $arguments, 1);
22
23 $this->assertEquals($body, $node->getNode('body'));
24 $this->assertEquals($arguments, $node->getNode('arguments'));
25 $this->assertEquals('foo', $node->getAttribute('name'));
26 }
27
28 /**
29 * @covers Twig_Node_Macro::compile
30 * @dataProvider getTests
31 */
32 public function testCompile($node, $source, $environment = null)
33 {
34 parent::testCompile($node, $source, $environment);
35 }
36
37 public function getTests()
38 {
39 $body = new Twig_Node_Text('foo', 1);
40 $arguments = new Twig_Node(array(
41 'foo' => new Twig_Node_Expression_Constant(null, 1),
42 'bar' => new Twig_Node_Expression_Constant('Foo', 1),
43 ), array(), 1);
44 $node = new Twig_Node_Macro('foo', $body, $arguments, 1);
45
46 return array(
47 array($node, <<<EOF
48// line 1
49public function getfoo(\$_foo = null, \$_bar = "Foo")
50{
51 \$context = \$this->env->mergeGlobals(array(
52 "foo" => \$_foo,
53 "bar" => \$_bar,
54 ));
55
56 \$blocks = array();
57
58 ob_start();
59 try {
60 echo "foo";
61 } catch (Exception \$e) {
62 ob_end_clean();
63
64 throw \$e;
65 }
66
67 return ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset());
68}
69EOF
70 ),
71 );
72 }
73}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/ModuleTest.php b/vendor/twig/twig/test/Twig/Tests/Node/ModuleTest.php
new file mode 100644
index 00000000..9411e99e
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/ModuleTest.php
@@ -0,0 +1,196 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_ModuleTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Module::__construct
16 */
17 public function testConstructor()
18 {
19 $body = new Twig_Node_Text('foo', 1);
20 $parent = new Twig_Node_Expression_Constant('layout.twig', 1);
21 $blocks = new Twig_Node();
22 $macros = new Twig_Node();
23 $traits = new Twig_Node();
24 $filename = 'foo.twig';
25 $node = new Twig_Node_Module($body, $parent, $blocks, $macros, $traits, new Twig_Node(array()), $filename);
26
27 $this->assertEquals($body, $node->getNode('body'));
28 $this->assertEquals($blocks, $node->getNode('blocks'));
29 $this->assertEquals($macros, $node->getNode('macros'));
30 $this->assertEquals($parent, $node->getNode('parent'));
31 $this->assertEquals($filename, $node->getAttribute('filename'));
32 }
33
34 /**
35 * @covers Twig_Node_Module::compile
36 * @covers Twig_Node_Module::compileTemplate
37 * @covers Twig_Node_Module::compileMacros
38 * @covers Twig_Node_Module::compileClassHeader
39 * @covers Twig_Node_Module::compileDisplayHeader
40 * @covers Twig_Node_Module::compileDisplayBody
41 * @covers Twig_Node_Module::compileDisplayFooter
42 * @covers Twig_Node_Module::compileClassFooter
43 * @dataProvider getTests
44 */
45 public function testCompile($node, $source, $environment = null)
46 {
47 parent::testCompile($node, $source, $environment);
48 }
49
50 public function getTests()
51 {
52 $twig = new Twig_Environment(new Twig_Loader_String());
53
54 $tests = array();
55
56 $body = new Twig_Node_Text('foo', 1);
57 $extends = null;
58 $blocks = new Twig_Node();
59 $macros = new Twig_Node();
60 $traits = new Twig_Node();
61 $filename = 'foo.twig';
62
63 $node = new Twig_Node_Module($body, $extends, $blocks, $macros, $traits, new Twig_Node(array()), $filename);
64 $tests[] = array($node, <<<EOF
65<?php
66
67/* foo.twig */
68class __TwigTemplate_be925a7b06dda0dfdbd18a1509f7eb34 extends Twig_Template
69{
70 public function __construct(Twig_Environment \$env)
71 {
72 parent::__construct(\$env);
73
74 \$this->parent = false;
75
76 \$this->blocks = array(
77 );
78 }
79
80 protected function doDisplay(array \$context, array \$blocks = array())
81 {
82 // line 1
83 echo "foo";
84 }
85
86 public function getTemplateName()
87 {
88 return "foo.twig";
89 }
90
91 public function getDebugInfo()
92 {
93 return array ( 19 => 1,);
94 }
95}
96EOF
97 , $twig);
98
99 $import = new Twig_Node_Import(new Twig_Node_Expression_Constant('foo.twig', 1), new Twig_Node_Expression_AssignName('macro', 1), 1);
100
101 $body = new Twig_Node(array($import));
102 $extends = new Twig_Node_Expression_Constant('layout.twig', 1);
103
104 $node = new Twig_Node_Module($body, $extends, $blocks, $macros, $traits, new Twig_Node(array()), $filename);
105 $tests[] = array($node, <<<EOF
106<?php
107
108/* foo.twig */
109class __TwigTemplate_be925a7b06dda0dfdbd18a1509f7eb34 extends Twig_Template
110{
111 public function __construct(Twig_Environment \$env)
112 {
113 parent::__construct(\$env);
114
115 \$this->parent = \$this->env->loadTemplate("layout.twig");
116
117 \$this->blocks = array(
118 );
119 }
120
121 protected function doGetParent(array \$context)
122 {
123 return "layout.twig";
124 }
125
126 protected function doDisplay(array \$context, array \$blocks = array())
127 {
128 // line 1
129 \$context["macro"] = \$this->env->loadTemplate("foo.twig");
130 \$this->parent->display(\$context, array_merge(\$this->blocks, \$blocks));
131 }
132
133 public function getTemplateName()
134 {
135 return "foo.twig";
136 }
137
138 public function isTraitable()
139 {
140 return false;
141 }
142
143 public function getDebugInfo()
144 {
145 return array ( 24 => 1,);
146 }
147}
148EOF
149 , $twig);
150
151 $body = new Twig_Node();
152 $extends = new Twig_Node_Expression_Conditional(
153 new Twig_Node_Expression_Constant(true, 1),
154 new Twig_Node_Expression_Constant('foo', 1),
155 new Twig_Node_Expression_Constant('foo', 1),
156 0
157 );
158
159 $node = new Twig_Node_Module($body, $extends, $blocks, $macros, $traits, new Twig_Node(array()), $filename);
160 $tests[] = array($node, <<<EOF
161<?php
162
163/* foo.twig */
164class __TwigTemplate_be925a7b06dda0dfdbd18a1509f7eb34 extends Twig_Template
165{
166 protected function doGetParent(array \$context)
167 {
168 return \$this->env->resolveTemplate(((true) ? ("foo") : ("foo")));
169 }
170
171 protected function doDisplay(array \$context, array \$blocks = array())
172 {
173 \$this->getParent(\$context)->display(\$context, array_merge(\$this->blocks, \$blocks));
174 }
175
176 public function getTemplateName()
177 {
178 return "foo.twig";
179 }
180
181 public function isTraitable()
182 {
183 return false;
184 }
185
186 public function getDebugInfo()
187 {
188 return array ();
189 }
190}
191EOF
192 , $twig);
193
194 return $tests;
195 }
196}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/PrintTest.php b/vendor/twig/twig/test/Twig/Tests/Node/PrintTest.php
new file mode 100644
index 00000000..6fe43a41
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/PrintTest.php
@@ -0,0 +1,41 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_PrintTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Print::__construct
16 */
17 public function testConstructor()
18 {
19 $expr = new Twig_Node_Expression_Constant('foo', 1);
20 $node = new Twig_Node_Print($expr, 1);
21
22 $this->assertEquals($expr, $node->getNode('expr'));
23 }
24
25 /**
26 * @covers Twig_Node_Print::compile
27 * @dataProvider getTests
28 */
29 public function testCompile($node, $source, $environment = null)
30 {
31 parent::testCompile($node, $source, $environment);
32 }
33
34 public function getTests()
35 {
36 $tests = array();
37 $tests[] = array(new Twig_Node_Print(new Twig_Node_Expression_Constant('foo', 1), 1), "// line 1\necho \"foo\";");
38
39 return $tests;
40 }
41}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/SandboxTest.php b/vendor/twig/twig/test/Twig/Tests/Node/SandboxTest.php
new file mode 100644
index 00000000..db9dbf95
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/SandboxTest.php
@@ -0,0 +1,56 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_SandboxTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Sandbox::__construct
16 */
17 public function testConstructor()
18 {
19 $body = new Twig_Node_Text('foo', 1);
20 $node = new Twig_Node_Sandbox($body, 1);
21
22 $this->assertEquals($body, $node->getNode('body'));
23 }
24
25 /**
26 * @covers Twig_Node_Sandbox::compile
27 * @dataProvider getTests
28 */
29 public function testCompile($node, $source, $environment = null)
30 {
31 parent::testCompile($node, $source, $environment);
32 }
33
34 public function getTests()
35 {
36 $tests = array();
37
38 $body = new Twig_Node_Text('foo', 1);
39 $node = new Twig_Node_Sandbox($body, 1);
40
41 $tests[] = array($node, <<<EOF
42// line 1
43\$sandbox = \$this->env->getExtension('sandbox');
44if (!\$alreadySandboxed = \$sandbox->isSandboxed()) {
45 \$sandbox->enableSandbox();
46}
47echo "foo";
48if (!\$alreadySandboxed) {
49 \$sandbox->disableSandbox();
50}
51EOF
52 );
53
54 return $tests;
55 }
56}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/SandboxedModuleTest.php b/vendor/twig/twig/test/Twig/Tests/Node/SandboxedModuleTest.php
new file mode 100644
index 00000000..217e3408
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/SandboxedModuleTest.php
@@ -0,0 +1,173 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_SandboxedModuleTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_SandboxedModule::__construct
16 */
17 public function testConstructor()
18 {
19 $body = new Twig_Node_Text('foo', 1);
20 $parent = new Twig_Node_Expression_Constant('layout.twig', 1);
21 $blocks = new Twig_Node();
22 $macros = new Twig_Node();
23 $traits = new Twig_Node();
24 $filename = 'foo.twig';
25 $node = new Twig_Node_Module($body, $parent, $blocks, $macros, $traits, new Twig_Node(array()), $filename);
26 $node = new Twig_Node_SandboxedModule($node, array('for'), array('upper'), array('cycle'));
27
28 $this->assertEquals($body, $node->getNode('body'));
29 $this->assertEquals($blocks, $node->getNode('blocks'));
30 $this->assertEquals($macros, $node->getNode('macros'));
31 $this->assertEquals($parent, $node->getNode('parent'));
32 $this->assertEquals($filename, $node->getAttribute('filename'));
33 }
34
35 /**
36 * @covers Twig_Node_SandboxedModule::compile
37 * @covers Twig_Node_SandboxedModule::compileDisplayBody
38 * @covers Twig_Node_SandboxedModule::compileDisplayFooter
39 * @dataProvider getTests
40 */
41 public function testCompile($node, $source, $environment = null)
42 {
43 parent::testCompile($node, $source, $environment);
44 }
45
46 public function getTests()
47 {
48 $twig = new Twig_Environment(new Twig_Loader_String());
49
50 $tests = array();
51
52 $body = new Twig_Node_Text('foo', 1);
53 $extends = null;
54 $blocks = new Twig_Node();
55 $macros = new Twig_Node();
56 $traits = new Twig_Node();
57 $filename = 'foo.twig';
58
59 $node = new Twig_Node_Module($body, $extends, $blocks, $macros, $traits, new Twig_Node(array()), $filename);
60 $node = new Twig_Node_SandboxedModule($node, array('for'), array('upper'), array('cycle'));
61
62 $tests[] = array($node, <<<EOF
63<?php
64
65/* foo.twig */
66class __TwigTemplate_be925a7b06dda0dfdbd18a1509f7eb34 extends Twig_Template
67{
68 public function __construct(Twig_Environment \$env)
69 {
70 parent::__construct(\$env);
71
72 \$this->parent = false;
73
74 \$this->blocks = array(
75 );
76 }
77
78 protected function doDisplay(array \$context, array \$blocks = array())
79 {
80 \$this->checkSecurity();
81 // line 1
82 echo "foo";
83 }
84
85 protected function checkSecurity()
86 {
87 \$this->env->getExtension('sandbox')->checkSecurity(
88 array('upper'),
89 array('for'),
90 array('cycle')
91 );
92 }
93
94 public function getTemplateName()
95 {
96 return "foo.twig";
97 }
98
99 public function getDebugInfo()
100 {
101 return array ( 20 => 1,);
102 }
103}
104EOF
105 , $twig);
106
107 $body = new Twig_Node();
108 $extends = new Twig_Node_Expression_Constant('layout.twig', 1);
109 $blocks = new Twig_Node();
110 $macros = new Twig_Node();
111 $traits = new Twig_Node();
112 $filename = 'foo.twig';
113
114 $node = new Twig_Node_Module($body, $extends, $blocks, $macros, $traits, new Twig_Node(array()), $filename);
115 $node = new Twig_Node_SandboxedModule($node, array('for'), array('upper'), array('cycle'));
116
117 $tests[] = array($node, <<<EOF
118<?php
119
120/* foo.twig */
121class __TwigTemplate_be925a7b06dda0dfdbd18a1509f7eb34 extends Twig_Template
122{
123 public function __construct(Twig_Environment \$env)
124 {
125 parent::__construct(\$env);
126
127 \$this->parent = \$this->env->loadTemplate("layout.twig");
128
129 \$this->blocks = array(
130 );
131 }
132
133 protected function doGetParent(array \$context)
134 {
135 return "layout.twig";
136 }
137
138 protected function doDisplay(array \$context, array \$blocks = array())
139 {
140 \$this->checkSecurity();
141 \$this->parent->display(\$context, array_merge(\$this->blocks, \$blocks));
142 }
143
144 protected function checkSecurity()
145 {
146 \$this->env->getExtension('sandbox')->checkSecurity(
147 array('upper'),
148 array('for'),
149 array('cycle')
150 );
151 }
152
153 public function getTemplateName()
154 {
155 return "foo.twig";
156 }
157
158 public function isTraitable()
159 {
160 return false;
161 }
162
163 public function getDebugInfo()
164 {
165 return array ();
166 }
167}
168EOF
169 , $twig);
170
171 return $tests;
172 }
173}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/SandboxedPrintTest.php b/vendor/twig/twig/test/Twig/Tests/Node/SandboxedPrintTest.php
new file mode 100644
index 00000000..058e02bc
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/SandboxedPrintTest.php
@@ -0,0 +1,45 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_SandboxedPrintTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_SandboxedPrint::__construct
16 */
17 public function testConstructor()
18 {
19 $node = new Twig_Node_SandboxedPrint($expr = new Twig_Node_Expression_Constant('foo', 1), 1);
20
21 $this->assertEquals($expr, $node->getNode('expr'));
22 }
23
24 /**
25 * @covers Twig_Node_SandboxedPrint::compile
26 * @dataProvider getTests
27 */
28 public function testCompile($node, $source, $environment = null)
29 {
30 parent::testCompile($node, $source, $environment);
31 }
32
33 public function getTests()
34 {
35 $tests = array();
36
37 $tests[] = array(new Twig_Node_SandboxedPrint(new Twig_Node_Expression_Constant('foo', 1), 1), <<<EOF
38// line 1
39echo \$this->env->getExtension('sandbox')->ensureToStringAllowed("foo");
40EOF
41 );
42
43 return $tests;
44 }
45}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/SetTest.php b/vendor/twig/twig/test/Twig/Tests/Node/SetTest.php
new file mode 100644
index 00000000..d64d671a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/SetTest.php
@@ -0,0 +1,81 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_SetTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Set::__construct
16 */
17 public function testConstructor()
18 {
19 $names = new Twig_Node(array(new Twig_Node_Expression_AssignName('foo', 1)), array(), 1);
20 $values = new Twig_Node(array(new Twig_Node_Expression_Constant('foo', 1)), array(), 1);
21 $node = new Twig_Node_Set(false, $names, $values, 1);
22
23 $this->assertEquals($names, $node->getNode('names'));
24 $this->assertEquals($values, $node->getNode('values'));
25 $this->assertEquals(false, $node->getAttribute('capture'));
26 }
27
28 /**
29 * @covers Twig_Node_Set::compile
30 * @dataProvider getTests
31 */
32 public function testCompile($node, $source, $environment = null)
33 {
34 parent::testCompile($node, $source, $environment);
35 }
36
37 public function getTests()
38 {
39 $tests = array();
40
41 $names = new Twig_Node(array(new Twig_Node_Expression_AssignName('foo', 1)), array(), 1);
42 $values = new Twig_Node(array(new Twig_Node_Expression_Constant('foo', 1)), array(), 1);
43 $node = new Twig_Node_Set(false, $names, $values, 1);
44 $tests[] = array($node, <<<EOF
45// line 1
46\$context["foo"] = "foo";
47EOF
48 );
49
50 $names = new Twig_Node(array(new Twig_Node_Expression_AssignName('foo', 1)), array(), 1);
51 $values = new Twig_Node(array(new Twig_Node_Print(new Twig_Node_Expression_Constant('foo', 1), 1)), array(), 1);
52 $node = new Twig_Node_Set(true, $names, $values, 1);
53 $tests[] = array($node, <<<EOF
54// line 1
55ob_start();
56echo "foo";
57\$context["foo"] = ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset());
58EOF
59 );
60
61 $names = new Twig_Node(array(new Twig_Node_Expression_AssignName('foo', 1)), array(), 1);
62 $values = new Twig_Node_Text('foo', 1);
63 $node = new Twig_Node_Set(true, $names, $values, 1);
64 $tests[] = array($node, <<<EOF
65// line 1
66\$context["foo"] = ('' === \$tmp = "foo") ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset());
67EOF
68 );
69
70 $names = new Twig_Node(array(new Twig_Node_Expression_AssignName('foo', 1), new Twig_Node_Expression_AssignName('bar', 1)), array(), 1);
71 $values = new Twig_Node(array(new Twig_Node_Expression_Constant('foo', 1), new Twig_Node_Expression_Name('bar', 1)), array(), 1);
72 $node = new Twig_Node_Set(false, $names, $values, 1);
73 $tests[] = array($node, <<<EOF
74// line 1
75list(\$context["foo"], \$context["bar"]) = array("foo", {$this->getVariableGetter('bar')});
76EOF
77 );
78
79 return $tests;
80 }
81}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/SpacelessTest.php b/vendor/twig/twig/test/Twig/Tests/Node/SpacelessTest.php
new file mode 100644
index 00000000..6735dc31
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/SpacelessTest.php
@@ -0,0 +1,49 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_SpacelessTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Spaceless::__construct
16 */
17 public function testConstructor()
18 {
19 $body = new Twig_Node(array(new Twig_Node_Text('<div> <div> foo </div> </div>', 1)));
20 $node = new Twig_Node_Spaceless($body, 1);
21
22 $this->assertEquals($body, $node->getNode('body'));
23 }
24
25 /**
26 * @covers Twig_Node_Spaceless::compile
27 * @dataProvider getTests
28 */
29 public function testCompile($node, $source, $environment = null)
30 {
31 parent::testCompile($node, $source, $environment);
32 }
33
34 public function getTests()
35 {
36 $body = new Twig_Node(array(new Twig_Node_Text('<div> <div> foo </div> </div>', 1)));
37 $node = new Twig_Node_Spaceless($body, 1);
38
39 return array(
40 array($node, <<<EOF
41// line 1
42ob_start();
43echo "<div> <div> foo </div> </div>";
44echo trim(preg_replace('/>\s+</', '><', ob_get_clean()));
45EOF
46 ),
47 );
48 }
49}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/TextTest.php b/vendor/twig/twig/test/Twig/Tests/Node/TextTest.php
new file mode 100644
index 00000000..6f85576e
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/TextTest.php
@@ -0,0 +1,40 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_Node_TextTest extends Twig_Test_NodeTestCase
13{
14 /**
15 * @covers Twig_Node_Text::__construct
16 */
17 public function testConstructor()
18 {
19 $node = new Twig_Node_Text('foo', 1);
20
21 $this->assertEquals('foo', $node->getAttribute('data'));
22 }
23
24 /**
25 * @covers Twig_Node_Text::compile
26 * @dataProvider getTests
27 */
28 public function testCompile($node, $source, $environment = null)
29 {
30 parent::testCompile($node, $source, $environment);
31 }
32
33 public function getTests()
34 {
35 $tests = array();
36 $tests[] = array(new Twig_Node_Text('foo', 1), "// line 1\necho \"foo\";");
37
38 return $tests;
39 }
40}
diff --git a/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php b/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php
new file mode 100644
index 00000000..d35740d5
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php
@@ -0,0 +1,114 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11class Twig_Tests_NodeVisitor_OptimizerTest extends PHPUnit_Framework_TestCase
12{
13 public function testRenderBlockOptimizer()
14 {
15 $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
16
17 $stream = $env->parse($env->tokenize('{{ block("foo") }}', 'index'));
18
19 $node = $stream->getNode('body')->getNode(0);
20
21 $this->assertEquals('Twig_Node_Expression_BlockReference', get_class($node));
22 $this->assertTrue($node->getAttribute('output'));
23 }
24
25 public function testRenderParentBlockOptimizer()
26 {
27 $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
28
29 $stream = $env->parse($env->tokenize('{% extends "foo" %}{% block content %}{{ parent() }}{% endblock %}', 'index'));
30
31 $node = $stream->getNode('blocks')->getNode('content')->getNode(0)->getNode('body');
32
33 $this->assertEquals('Twig_Node_Expression_Parent', get_class($node));
34 $this->assertTrue($node->getAttribute('output'));
35 }
36
37 public function testRenderVariableBlockOptimizer()
38 {
39 if (version_compare(phpversion(), '5.4.0RC1', '>=')) {
40 return;
41 }
42
43 $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false));
44 $stream = $env->parse($env->tokenize('{{ block(name|lower) }}', 'index'));
45
46 $node = $stream->getNode('body')->getNode(0)->getNode(1);
47
48 $this->assertEquals('Twig_Node_Expression_BlockReference', get_class($node));
49 $this->assertTrue($node->getAttribute('output'));
50 }
51
52 /**
53 * @dataProvider getTestsForForOptimizer
54 */
55 public function testForOptimizer($template, $expected)
56 {
57 $env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false));
58
59 $stream = $env->parse($env->tokenize($template, 'index'));
60
61 foreach ($expected as $target => $withLoop) {
62 $this->assertTrue($this->checkForConfiguration($stream, $target, $withLoop), sprintf('variable %s is %soptimized', $target, $withLoop ? 'not ' : ''));
63 }
64 }
65
66 public function getTestsForForOptimizer()
67 {
68 return array(
69 array('{% for i in foo %}{% endfor %}', array('i' => false)),
70
71 array('{% for i in foo %}{{ loop.index }}{% endfor %}', array('i' => true)),
72
73 array('{% for i in foo %}{% for j in foo %}{% endfor %}{% endfor %}', array('i' => false, 'j' => false)),
74
75 array('{% for i in foo %}{% include "foo" %}{% endfor %}', array('i' => true)),
76
77 array('{% for i in foo %}{% include "foo" only %}{% endfor %}', array('i' => false)),
78
79 array('{% for i in foo %}{% include "foo" with { "foo": "bar" } only %}{% endfor %}', array('i' => false)),
80
81 array('{% for i in foo %}{% include "foo" with { "foo": loop.index } only %}{% endfor %}', array('i' => true)),
82
83 array('{% for i in foo %}{% for j in foo %}{{ loop.index }}{% endfor %}{% endfor %}', array('i' => false, 'j' => true)),
84
85 array('{% for i in foo %}{% for j in foo %}{{ loop.parent.loop.index }}{% endfor %}{% endfor %}', array('i' => true, 'j' => true)),
86
87 array('{% for i in foo %}{% set l = loop %}{% for j in foo %}{{ l.index }}{% endfor %}{% endfor %}', array('i' => true, 'j' => false)),
88
89 array('{% for i in foo %}{% for j in foo %}{{ foo.parent.loop.index }}{% endfor %}{% endfor %}', array('i' => false, 'j' => false)),
90
91 array('{% for i in foo %}{% for j in foo %}{{ loop["parent"].loop.index }}{% endfor %}{% endfor %}', array('i' => true, 'j' => true)),
92 );
93 }
94
95 public function checkForConfiguration(Twig_NodeInterface $node = null, $target, $withLoop)
96 {
97 if (null === $node) {
98 return;
99 }
100
101 foreach ($node as $n) {
102 if ($n instanceof Twig_Node_For) {
103 if ($target === $n->getNode('value_target')->getAttribute('name')) {
104 return $withLoop == $n->getAttribute('with_loop');
105 }
106 }
107
108 $ret = $this->checkForConfiguration($n, $target, $withLoop);
109 if (null !== $ret) {
110 return $ret;
111 }
112 }
113 }
114}
diff --git a/vendor/twig/twig/test/Twig/Tests/ParserTest.php b/vendor/twig/twig/test/Twig/Tests/ParserTest.php
new file mode 100644
index 00000000..55eb7fb4
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/ParserTest.php
@@ -0,0 +1,180 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11class Twig_Tests_ParserTest extends PHPUnit_Framework_TestCase
12{
13 /**
14 * @expectedException Twig_Error_Syntax
15 */
16 public function testSetMacroThrowsExceptionOnReservedMethods()
17 {
18 $parser = $this->getParser();
19 $parser->setMacro('display', $this->getMock('Twig_Node_Macro', array(), array(), '', null));
20 }
21
22 /**
23 * @expectedException Twig_Error_Syntax
24 * @expectedExceptionMessage Unknown tag name "foo". Did you mean "for" at line 1
25 */
26 public function testUnknownTag()
27 {
28 $stream = new Twig_TokenStream(array(
29 new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 1),
30 new Twig_Token(Twig_Token::NAME_TYPE, 'foo', 1),
31 new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 1),
32 new Twig_Token(Twig_Token::EOF_TYPE, '', 1),
33 ));
34 $parser = new Twig_Parser(new Twig_Environment());
35 $parser->parse($stream);
36 }
37
38 /**
39 * @dataProvider getFilterBodyNodesData
40 */
41 public function testFilterBodyNodes($input, $expected)
42 {
43 $parser = $this->getParser();
44
45 $this->assertEquals($expected, $parser->filterBodyNodes($input));
46 }
47
48 public function getFilterBodyNodesData()
49 {
50 return array(
51 array(
52 new Twig_Node(array(new Twig_Node_Text(' ', 1))),
53 new Twig_Node(array()),
54 ),
55 array(
56 $input = new Twig_Node(array(new Twig_Node_Set(false, new Twig_Node(), new Twig_Node(), 1))),
57 $input,
58 ),
59 array(
60 $input = new Twig_Node(array(new Twig_Node_Set(true, new Twig_Node(), new Twig_Node(array(new Twig_Node(array(new Twig_Node_Text('foo', 1))))), 1))),
61 $input,
62 ),
63 );
64 }
65
66 /**
67 * @dataProvider getFilterBodyNodesDataThrowsException
68 * @expectedException Twig_Error_Syntax
69 */
70 public function testFilterBodyNodesThrowsException($input)
71 {
72 $parser = $this->getParser();
73
74 $parser->filterBodyNodes($input);
75 }
76
77 public function getFilterBodyNodesDataThrowsException()
78 {
79 return array(
80 array(new Twig_Node_Text('foo', 1)),
81 array(new Twig_Node(array(new Twig_Node(array(new Twig_Node_Text('foo', 1)))))),
82 );
83 }
84
85 /**
86 * @expectedException Twig_Error_Syntax
87 * @expectedExceptionMessage A template that extends another one cannot have a body but a byte order mark (BOM) has been detected; it must be removed at line 1.
88 */
89 public function testFilterBodyNodesWithBOM()
90 {
91 $parser = $this->getParser();
92 $parser->filterBodyNodes(new Twig_Node_Text(chr(0xEF).chr(0xBB).chr(0xBF), 1));
93 }
94
95 public function testParseIsReentrant()
96 {
97 $twig = new Twig_Environment(null, array(
98 'autoescape' => false,
99 'optimizations' => 0,
100 ));
101 $twig->addTokenParser(new TestTokenParser());
102
103 $parser = new Twig_Parser($twig);
104
105 $parser->parse(new Twig_TokenStream(array(
106 new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 1),
107 new Twig_Token(Twig_Token::NAME_TYPE, 'test', 1),
108 new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 1),
109 new Twig_Token(Twig_Token::VAR_START_TYPE, '', 1),
110 new Twig_Token(Twig_Token::NAME_TYPE, 'foo', 1),
111 new Twig_Token(Twig_Token::VAR_END_TYPE, '', 1),
112 new Twig_Token(Twig_Token::EOF_TYPE, '', 1),
113 )));
114
115 $this->assertEquals(null, $parser->getParent());
116 }
117
118 // The getVarName() must not depend on the template loaders,
119 // If this test does not throw any exception, that's good.
120 // see https://github.com/symfony/symfony/issues/4218
121 public function testGetVarName()
122 {
123 $twig = new Twig_Environment(null, array(
124 'autoescape' => false,
125 'optimizations' => 0,
126 ));
127
128 $twig->parse($twig->tokenize(<<<EOF
129{% from _self import foo %}
130
131{% macro foo() %}
132 {{ foo }}
133{% endmacro %}
134EOF
135 ));
136 }
137
138 protected function getParser()
139 {
140 $parser = new TestParser(new Twig_Environment());
141 $parser->setParent(new Twig_Node());
142 $parser->stream = $this->getMockBuilder('Twig_TokenStream')->disableOriginalConstructor()->getMock();
143
144 return $parser;
145 }
146}
147
148class TestParser extends Twig_Parser
149{
150 public $stream;
151
152 public function filterBodyNodes(Twig_NodeInterface $node)
153 {
154 return parent::filterBodyNodes($node);
155 }
156}
157
158class TestTokenParser extends Twig_TokenParser
159{
160 public function parse(Twig_Token $token)
161 {
162 // simulate the parsing of another template right in the middle of the parsing of the current template
163 $this->parser->parse(new Twig_TokenStream(array(
164 new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 1),
165 new Twig_Token(Twig_Token::NAME_TYPE, 'extends', 1),
166 new Twig_Token(Twig_Token::STRING_TYPE, 'base', 1),
167 new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 1),
168 new Twig_Token(Twig_Token::EOF_TYPE, '', 1),
169 )));
170
171 $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
172
173 return new Twig_Node(array());
174 }
175
176 public function getTag()
177 {
178 return 'test';
179 }
180}
diff --git a/vendor/twig/twig/test/Twig/Tests/TemplateTest.php b/vendor/twig/twig/test/Twig/Tests/TemplateTest.php
new file mode 100644
index 00000000..823a9ce9
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/TemplateTest.php
@@ -0,0 +1,626 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11class Twig_Tests_TemplateTest extends PHPUnit_Framework_TestCase
12{
13 /**
14 * @dataProvider getAttributeExceptions
15 */
16 public function testGetAttributeExceptions($template, $message, $useExt)
17 {
18 $name = 'index_'.($useExt ? 1 : 0);
19 $templates = array(
20 $name => $template.$useExt, // appending $useExt makes the template content unique
21 );
22
23 $env = new Twig_Environment(new Twig_Loader_Array($templates), array('strict_variables' => true));
24 if (!$useExt) {
25 $env->addNodeVisitor(new CExtDisablingNodeVisitor());
26 }
27 $template = $env->loadTemplate($name);
28
29 $context = array(
30 'string' => 'foo',
31 'array' => array('foo' => 'foo'),
32 'array_access' => new Twig_TemplateArrayAccessObject(),
33 'magic_exception' => new Twig_TemplateMagicPropertyObjectWithException(),
34 );
35
36 try {
37 $template->render($context);
38 $this->fail('Accessing an invalid attribute should throw an exception.');
39 } catch (Twig_Error_Runtime $e) {
40 $this->assertSame(sprintf($message, $name), $e->getMessage());
41 }
42 }
43
44 public function getAttributeExceptions()
45 {
46 $tests = array(
47 array('{{ string["a"] }}', 'Impossible to access a key ("a") on a string variable ("foo") in "%s" at line 1', false),
48 array('{{ array["a"] }}', 'Key "a" for array with keys "foo" does not exist in "%s" at line 1', false),
49 array('{{ array_access["a"] }}', 'Key "a" in object (with ArrayAccess) of type "Twig_TemplateArrayAccessObject" does not exist in "%s" at line 1', false),
50 array('{{ string.a }}', 'Impossible to access an attribute ("a") on a string variable ("foo") in "%s" at line 1', false),
51 array('{{ string.a() }}', 'Impossible to invoke a method ("a") on a string variable ("foo") in "%s" at line 1', false),
52 array('{{ array.a }}', 'Key "a" for array with keys "foo" does not exist in "%s" at line 1', false),
53 array('{{ attribute(array, -10) }}', 'Key "-10" for array with keys "foo" does not exist in "%s" at line 1', false),
54 array('{{ array_access.a }}', 'Method "a" for object "Twig_TemplateArrayAccessObject" does not exist in "%s" at line 1', false),
55 array('{% macro foo(obj) %}{{ obj.missing_method() }}{% endmacro %}{{ _self.foo(array_access) }}', 'Method "missing_method" for object "Twig_TemplateArrayAccessObject" does not exist in "%s" at line 1', false),
56 array('{{ magic_exception.test }}', 'An exception has been thrown during the rendering of a template ("Hey! Don\'t try to isset me!") in "%s" at line 1.', false),
57 );
58
59 if (function_exists('twig_template_get_attributes')) {
60 foreach (array_slice($tests, 0) as $test) {
61 $test[2] = true;
62 $tests[] = $test;
63 }
64 }
65
66 return $tests;
67 }
68
69 /**
70 * @dataProvider getGetAttributeWithSandbox
71 */
72 public function testGetAttributeWithSandbox($object, $item, $allowed, $useExt)
73 {
74 $twig = new Twig_Environment();
75 $policy = new Twig_Sandbox_SecurityPolicy(array(), array(), array(/*method*/), array(/*prop*/), array());
76 $twig->addExtension(new Twig_Extension_Sandbox($policy, !$allowed));
77 $template = new Twig_TemplateTest($twig, $useExt);
78
79 try {
80 $template->getAttribute($object, $item, array(), 'any');
81
82 if (!$allowed) {
83 $this->fail();
84 }
85 } catch (Twig_Sandbox_SecurityError $e) {
86 if ($allowed) {
87 $this->fail();
88 }
89
90 $this->assertContains('is not allowed', $e->getMessage());
91 }
92 }
93
94 public function getGetAttributeWithSandbox()
95 {
96 $tests = array(
97 array(new Twig_TemplatePropertyObject(), 'defined', false, false),
98 array(new Twig_TemplatePropertyObject(), 'defined', true, false),
99 array(new Twig_TemplateMethodObject(), 'defined', false, false),
100 array(new Twig_TemplateMethodObject(), 'defined', true, false),
101 );
102
103 if (function_exists('twig_template_get_attributes')) {
104 foreach (array_slice($tests, 0) as $test) {
105 $test[3] = true;
106 $tests[] = $test;
107 }
108 }
109
110 return $tests;
111 }
112
113 /**
114 * @dataProvider getGetAttributeWithTemplateAsObject
115 */
116 public function testGetAttributeWithTemplateAsObject($useExt)
117 {
118 $template = new Twig_TemplateTest(new Twig_Environment(), $useExt);
119 $template1 = new Twig_TemplateTest(new Twig_Environment(), false);
120
121 $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'string'));
122 $this->assertEquals('some_string', $template->getAttribute($template1, 'string'));
123
124 $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'true'));
125 $this->assertEquals('1', $template->getAttribute($template1, 'true'));
126
127 $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'zero'));
128 $this->assertEquals('0', $template->getAttribute($template1, 'zero'));
129
130 $this->assertNotInstanceof('Twig_Markup', $template->getAttribute($template1, 'empty'));
131 $this->assertSame('', $template->getAttribute($template1, 'empty'));
132 }
133
134 public function getGetAttributeWithTemplateAsObject()
135 {
136 $bools = array(
137 array(false),
138 );
139
140 if (function_exists('twig_template_get_attributes')) {
141 $bools[] = array(true);
142 }
143
144 return $bools;
145 }
146
147 /**
148 * @dataProvider getTestsDependingOnExtensionAvailability
149 */
150 public function testGetAttributeOnArrayWithConfusableKey($useExt = false)
151 {
152 $template = new Twig_TemplateTest(
153 new Twig_Environment(),
154 $useExt
155 );
156
157 $array = array('Zero', 'One', -1 => 'MinusOne', '' => 'EmptyString', '1.5' => 'FloatButString', '01' => 'IntegerButStringWithLeadingZeros');
158
159 $this->assertSame('Zero', $array[false]);
160 $this->assertSame('One', $array[true]);
161 $this->assertSame('One', $array[1.5]);
162 $this->assertSame('One', $array['1']);
163 $this->assertSame('MinusOne', $array[-1.5]);
164 $this->assertSame('FloatButString', $array['1.5']);
165 $this->assertSame('IntegerButStringWithLeadingZeros', $array['01']);
166 $this->assertSame('EmptyString', $array[null]);
167
168 $this->assertSame('Zero', $template->getAttribute($array, false), 'false is treated as 0 when accessing an array (equals PHP behavior)');
169 $this->assertSame('One', $template->getAttribute($array, true), 'true is treated as 1 when accessing an array (equals PHP behavior)');
170 $this->assertSame('One', $template->getAttribute($array, 1.5), 'float is casted to int when accessing an array (equals PHP behavior)');
171 $this->assertSame('One', $template->getAttribute($array, '1'), '"1" is treated as integer 1 when accessing an array (equals PHP behavior)');
172 $this->assertSame('MinusOne', $template->getAttribute($array, -1.5), 'negative float is casted to int when accessing an array (equals PHP behavior)');
173 $this->assertSame('FloatButString', $template->getAttribute($array, '1.5'), '"1.5" is treated as-is when accessing an array (equals PHP behavior)');
174 $this->assertSame('IntegerButStringWithLeadingZeros', $template->getAttribute($array, '01'), '"01" is treated as-is when accessing an array (equals PHP behavior)');
175 $this->assertSame('EmptyString', $template->getAttribute($array, null), 'null is treated as "" when accessing an array (equals PHP behavior)');
176 }
177
178 public function getTestsDependingOnExtensionAvailability()
179 {
180 if (function_exists('twig_template_get_attributes')) {
181 return array(array(false), array(true));
182 }
183
184 return array(array(false));
185 }
186
187 /**
188 * @dataProvider getGetAttributeTests
189 */
190 public function testGetAttribute($defined, $value, $object, $item, $arguments, $type, $useExt = false)
191 {
192 $template = new Twig_TemplateTest(new Twig_Environment(), $useExt);
193
194 $this->assertEquals($value, $template->getAttribute($object, $item, $arguments, $type));
195 }
196
197 /**
198 * @dataProvider getGetAttributeTests
199 */
200 public function testGetAttributeStrict($defined, $value, $object, $item, $arguments, $type, $useExt = false, $exceptionMessage = null)
201 {
202 $template = new Twig_TemplateTest(new Twig_Environment(null, array('strict_variables' => true)), $useExt);
203
204 if ($defined) {
205 $this->assertEquals($value, $template->getAttribute($object, $item, $arguments, $type));
206 } else {
207 try {
208 $this->assertEquals($value, $template->getAttribute($object, $item, $arguments, $type));
209
210 throw new Exception('Expected Twig_Error_Runtime exception.');
211 } catch (Twig_Error_Runtime $e) {
212 if (null !== $exceptionMessage) {
213 $this->assertSame($exceptionMessage, $e->getMessage());
214 }
215 }
216 }
217 }
218
219 /**
220 * @dataProvider getGetAttributeTests
221 */
222 public function testGetAttributeDefined($defined, $value, $object, $item, $arguments, $type, $useExt = false)
223 {
224 $template = new Twig_TemplateTest(new Twig_Environment(), $useExt);
225
226 $this->assertEquals($defined, $template->getAttribute($object, $item, $arguments, $type, true));
227 }
228
229 /**
230 * @dataProvider getGetAttributeTests
231 */
232 public function testGetAttributeDefinedStrict($defined, $value, $object, $item, $arguments, $type, $useExt = false)
233 {
234 $template = new Twig_TemplateTest(new Twig_Environment(null, array('strict_variables' => true)), $useExt);
235
236 $this->assertEquals($defined, $template->getAttribute($object, $item, $arguments, $type, true));
237 }
238
239 public function getGetAttributeTests()
240 {
241 $array = array(
242 'defined' => 'defined',
243 'zero' => 0,
244 'null' => null,
245 '1' => 1,
246 'bar' => true,
247 '09' => '09',
248 '+4' => '+4',
249 );
250
251 $objectArray = new Twig_TemplateArrayAccessObject();
252 $stdObject = (object) $array;
253 $magicPropertyObject = new Twig_TemplateMagicPropertyObject();
254 $propertyObject = new Twig_TemplatePropertyObject();
255 $propertyObject1 = new Twig_TemplatePropertyObjectAndIterator();
256 $propertyObject2 = new Twig_TemplatePropertyObjectAndArrayAccess();
257 $methodObject = new Twig_TemplateMethodObject();
258 $magicMethodObject = new Twig_TemplateMagicMethodObject();
259
260 $anyType = Twig_TemplateInterface::ANY_CALL;
261 $methodType = Twig_TemplateInterface::METHOD_CALL;
262 $arrayType = Twig_TemplateInterface::ARRAY_CALL;
263
264 $basicTests = array(
265 // array(defined, value, property to fetch)
266 array(true, 'defined', 'defined'),
267 array(false, null, 'undefined'),
268 array(false, null, 'protected'),
269 array(true, 0, 'zero'),
270 array(true, 1, 1),
271 array(true, 1, 1.0),
272 array(true, null, 'null'),
273 array(true, true, 'bar'),
274 array(true, '09', '09'),
275 array(true, '+4', '+4'),
276 );
277 $testObjects = array(
278 // array(object, type of fetch)
279 array($array, $arrayType),
280 array($objectArray, $arrayType),
281 array($stdObject, $anyType),
282 array($magicPropertyObject, $anyType),
283 array($methodObject, $methodType),
284 array($methodObject, $anyType),
285 array($propertyObject, $anyType),
286 array($propertyObject1, $anyType),
287 array($propertyObject2, $anyType),
288 );
289
290 $tests = array();
291 foreach ($testObjects as $testObject) {
292 foreach ($basicTests as $test) {
293 // properties cannot be numbers
294 if (($testObject[0] instanceof stdClass || $testObject[0] instanceof Twig_TemplatePropertyObject) && is_numeric($test[2])) {
295 continue;
296 }
297
298 if ('+4' === $test[2] && $methodObject === $testObject[0]) {
299 continue;
300 }
301
302 $tests[] = array($test[0], $test[1], $testObject[0], $test[2], array(), $testObject[1]);
303 }
304 }
305
306 // additional method tests
307 $tests = array_merge($tests, array(
308 array(true, 'defined', $methodObject, 'defined', array(), $methodType),
309 array(true, 'defined', $methodObject, 'DEFINED', array(), $methodType),
310 array(true, 'defined', $methodObject, 'getDefined', array(), $methodType),
311 array(true, 'defined', $methodObject, 'GETDEFINED', array(), $methodType),
312 array(true, 'static', $methodObject, 'static', array(), $methodType),
313 array(true, 'static', $methodObject, 'getStatic', array(), $methodType),
314
315 array(true, '__call_undefined', $magicMethodObject, 'undefined', array(), $methodType),
316 array(true, '__call_UNDEFINED', $magicMethodObject, 'UNDEFINED', array(), $methodType),
317 ));
318
319 // add the same tests for the any type
320 foreach ($tests as $test) {
321 if ($anyType !== $test[5]) {
322 $test[5] = $anyType;
323 $tests[] = $test;
324 }
325 }
326
327 $methodAndPropObject = new Twig_TemplateMethodAndPropObject;
328
329 // additional method tests
330 $tests = array_merge($tests, array(
331 array(true, 'a', $methodAndPropObject, 'a', array(), $anyType),
332 array(true, 'a', $methodAndPropObject, 'a', array(), $methodType),
333 array(false, null, $methodAndPropObject, 'a', array(), $arrayType),
334
335 array(true, 'b_prop', $methodAndPropObject, 'b', array(), $anyType),
336 array(true, 'b', $methodAndPropObject, 'B', array(), $anyType),
337 array(true, 'b', $methodAndPropObject, 'b', array(), $methodType),
338 array(true, 'b', $methodAndPropObject, 'B', array(), $methodType),
339 array(false, null, $methodAndPropObject, 'b', array(), $arrayType),
340
341 array(false, null, $methodAndPropObject, 'c', array(), $anyType),
342 array(false, null, $methodAndPropObject, 'c', array(), $methodType),
343 array(false, null, $methodAndPropObject, 'c', array(), $arrayType),
344
345 ));
346
347 // tests when input is not an array or object
348 $tests = array_merge($tests, array(
349 array(false, null, 42, 'a', array(), $anyType, false, 'Impossible to access an attribute ("a") on a integer variable ("42")'),
350 array(false, null, "string", 'a', array(), $anyType, false, 'Impossible to access an attribute ("a") on a string variable ("string")'),
351 array(false, null, array(), 'a', array(), $anyType, false, 'Key "a" for array with keys "" does not exist'),
352 ));
353
354 // add twig_template_get_attributes tests
355
356 if (function_exists('twig_template_get_attributes')) {
357 foreach (array_slice($tests, 0) as $test) {
358 $test = array_pad($test, 7, null);
359 $test[6] = true;
360 $tests[] = $test;
361 }
362 }
363
364 return $tests;
365 }
366}
367
368class Twig_TemplateTest extends Twig_Template
369{
370 protected $useExtGetAttribute = false;
371
372 public function __construct(Twig_Environment $env, $useExtGetAttribute = false)
373 {
374 parent::__construct($env);
375 $this->useExtGetAttribute = $useExtGetAttribute;
376 Twig_Template::clearCache();
377 }
378
379 public function getZero()
380 {
381 return 0;
382 }
383
384 public function getEmpty()
385 {
386 return '';
387 }
388
389 public function getString()
390 {
391 return 'some_string';
392 }
393
394 public function getTrue()
395 {
396 return true;
397 }
398
399 public function getTemplateName()
400 {
401 }
402
403 public function getDebugInfo()
404 {
405 return array();
406 }
407
408 protected function doGetParent(array $context)
409 {
410 }
411
412 protected function doDisplay(array $context, array $blocks = array())
413 {
414 }
415
416 public function getAttribute($object, $item, array $arguments = array(), $type = Twig_TemplateInterface::ANY_CALL, $isDefinedTest = false, $ignoreStrictCheck = false)
417 {
418 if ($this->useExtGetAttribute) {
419 return twig_template_get_attributes($this, $object, $item, $arguments, $type, $isDefinedTest, $ignoreStrictCheck);
420 } else {
421 return parent::getAttribute($object, $item, $arguments, $type, $isDefinedTest, $ignoreStrictCheck);
422 }
423 }
424}
425
426class Twig_TemplateArrayAccessObject implements ArrayAccess
427{
428 protected $protected = 'protected';
429
430 public $attributes = array(
431 'defined' => 'defined',
432 'zero' => 0,
433 'null' => null,
434 '1' => 1,
435 'bar' => true,
436 '09' => '09',
437 '+4' => '+4',
438 );
439
440 public function offsetExists($name)
441 {
442 return array_key_exists($name, $this->attributes);
443 }
444
445 public function offsetGet($name)
446 {
447 return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : null;
448 }
449
450 public function offsetSet($name, $value)
451 {
452 }
453
454 public function offsetUnset($name)
455 {
456 }
457}
458
459class Twig_TemplateMagicPropertyObject
460{
461 public $defined = 'defined';
462
463 public $attributes = array(
464 'zero' => 0,
465 'null' => null,
466 '1' => 1,
467 'bar' => true,
468 '09' => '09',
469 '+4' => '+4',
470 );
471
472 protected $protected = 'protected';
473
474 public function __isset($name)
475 {
476 return array_key_exists($name, $this->attributes);
477 }
478
479 public function __get($name)
480 {
481 return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : null;
482 }
483}
484
485class Twig_TemplateMagicPropertyObjectWithException
486{
487 public function __isset($key)
488 {
489 throw new Exception("Hey! Don't try to isset me!");
490 }
491}
492
493class Twig_TemplatePropertyObject
494{
495 public $defined = 'defined';
496 public $zero = 0;
497 public $null = null;
498 public $bar = true;
499
500 protected $protected = 'protected';
501}
502
503class Twig_TemplatePropertyObjectAndIterator extends Twig_TemplatePropertyObject implements IteratorAggregate
504{
505 public function getIterator()
506 {
507 return new ArrayIterator(array('foo', 'bar'));
508 }
509}
510
511class Twig_TemplatePropertyObjectAndArrayAccess extends Twig_TemplatePropertyObject implements ArrayAccess
512{
513 private $data = array();
514
515 public function offsetExists($offset)
516 {
517 return array_key_exists($offset, $this->data);
518 }
519
520 public function offsetGet($offset)
521 {
522 return $this->offsetExists($offset) ? $this->data[$offset] : 'n/a';
523 }
524
525 public function offsetSet($offset, $value)
526 {
527 }
528
529 public function offsetUnset($offset)
530 {
531 }
532}
533
534class Twig_TemplateMethodObject
535{
536 public function getDefined()
537 {
538 return 'defined';
539 }
540
541 public function get1()
542 {
543 return 1;
544 }
545
546 public function get09()
547 {
548 return '09';
549 }
550
551 public function getZero()
552 {
553 return 0;
554 }
555
556 public function getNull()
557 {
558 return null;
559 }
560
561 public function isBar()
562 {
563 return true;
564 }
565
566 protected function getProtected()
567 {
568 return 'protected';
569 }
570
571 public static function getStatic()
572 {
573 return 'static';
574 }
575}
576
577class Twig_TemplateMethodAndPropObject
578{
579 private $a = 'a_prop';
580 public function getA()
581 {
582 return 'a';
583 }
584
585 public $b = 'b_prop';
586 public function getB()
587 {
588 return 'b';
589 }
590
591 private $c = 'c_prop';
592 private function getC()
593 {
594 return 'c';
595 }
596}
597
598class Twig_TemplateMagicMethodObject
599{
600 public function __call($method, $arguments)
601 {
602 return '__call_'.$method;
603 }
604}
605
606class CExtDisablingNodeVisitor implements Twig_NodeVisitorInterface
607{
608 public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)
609 {
610 if ($node instanceof Twig_Node_Expression_GetAttr) {
611 $node->setAttribute('disable_c_ext', true);
612 }
613
614 return $node;
615 }
616
617 public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env)
618 {
619 return $node;
620 }
621
622 public function getPriority()
623 {
624 return 0;
625 }
626}
diff --git a/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php b/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php
new file mode 100644
index 00000000..fd4ec633
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php
@@ -0,0 +1,70 @@
1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12class Twig_Tests_TokenStreamTest extends PHPUnit_Framework_TestCase
13{
14 protected static $tokens;
15
16 public function setUp()
17 {
18 self::$tokens = array(
19 new Twig_Token(Twig_Token::TEXT_TYPE, 1, 1),
20 new Twig_Token(Twig_Token::TEXT_TYPE, 2, 1),
21 new Twig_Token(Twig_Token::TEXT_TYPE, 3, 1),
22 new Twig_Token(Twig_Token::TEXT_TYPE, 4, 1),
23 new Twig_Token(Twig_Token::TEXT_TYPE, 5, 1),
24 new Twig_Token(Twig_Token::TEXT_TYPE, 6, 1),
25 new Twig_Token(Twig_Token::TEXT_TYPE, 7, 1),
26 new Twig_Token(Twig_Token::EOF_TYPE, 0, 1),
27 );
28 }
29
30 public function testNext()
31 {
32 $stream = new Twig_TokenStream(self::$tokens);
33 $repr = array();
34 while (!$stream->isEOF()) {
35 $token = $stream->next();
36
37 $repr[] = $token->getValue();
38 }
39 $this->assertEquals('1, 2, 3, 4, 5, 6, 7', implode(', ', $repr), '->next() advances the pointer and returns the current token');
40 }
41
42 /**
43 * @expectedException Twig_Error_Syntax
44 * @expectedMessage Unexpected end of template
45 */
46 public function testEndOfTemplateNext()
47 {
48 $stream = new Twig_TokenStream(array(
49 new Twig_Token(Twig_Token::BLOCK_START_TYPE, 1, 1),
50 ));
51 while (!$stream->isEOF()) {
52 $stream->next();
53 }
54 }
55
56 /**
57 * @expectedException Twig_Error_Syntax
58 * @expectedMessage Unexpected end of template
59 */
60 public function testEndOfTemplateLook()
61 {
62 $stream = new Twig_TokenStream(array(
63 new Twig_Token(Twig_Token::BLOCK_START_TYPE, 1, 1),
64 ));
65 while (!$stream->isEOF()) {
66 $stream->look();
67 $stream->next();
68 }
69 }
70}
diff --git a/vendor/twig/twig/test/Twig/Tests/escapingTest.php b/vendor/twig/twig/test/Twig/Tests/escapingTest.php
new file mode 100644
index 00000000..b41b5f97
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/escapingTest.php
@@ -0,0 +1,320 @@
1<?php
2
3/**
4 * This class is adapted from code coming from Zend Framework.
5 *
6 * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
7 * @license http://framework.zend.com/license/new-bsd New BSD License
8 */
9
10class Twig_Test_EscapingTest extends PHPUnit_Framework_TestCase
11{
12 /**
13 * All character encodings supported by htmlspecialchars()
14 */
15 protected $htmlSpecialChars = array(
16 '\'' => '&#039;',
17 '"' => '&quot;',
18 '<' => '&lt;',
19 '>' => '&gt;',
20 '&' => '&amp;'
21 );
22
23 protected $htmlAttrSpecialChars = array(
24 '\'' => '&#x27;',
25 /* Characters beyond ASCII value 255 to unicode escape */
26 'Ā' => '&#x0100;',
27 /* Immune chars excluded */
28 ',' => ',',
29 '.' => '.',
30 '-' => '-',
31 '_' => '_',
32 /* Basic alnums excluded */
33 'a' => 'a',
34 'A' => 'A',
35 'z' => 'z',
36 'Z' => 'Z',
37 '0' => '0',
38 '9' => '9',
39 /* Basic control characters and null */
40 "\r" => '&#x0D;',
41 "\n" => '&#x0A;',
42 "\t" => '&#x09;',
43 "\0" => '&#xFFFD;', // should use Unicode replacement char
44 /* Encode chars as named entities where possible */
45 '<' => '&lt;',
46 '>' => '&gt;',
47 '&' => '&amp;',
48 '"' => '&quot;',
49 /* Encode spaces for quoteless attribute protection */
50 ' ' => '&#x20;',
51 );
52
53 protected $jsSpecialChars = array(
54 /* HTML special chars - escape without exception to hex */
55 '<' => '\\x3C',
56 '>' => '\\x3E',
57 '\'' => '\\x27',
58 '"' => '\\x22',
59 '&' => '\\x26',
60 /* Characters beyond ASCII value 255 to unicode escape */
61 'Ā' => '\\u0100',
62 /* Immune chars excluded */
63 ',' => ',',
64 '.' => '.',
65 '_' => '_',
66 /* Basic alnums excluded */
67 'a' => 'a',
68 'A' => 'A',
69 'z' => 'z',
70 'Z' => 'Z',
71 '0' => '0',
72 '9' => '9',
73 /* Basic control characters and null */
74 "\r" => '\\x0D',
75 "\n" => '\\x0A',
76 "\t" => '\\x09',
77 "\0" => '\\x00',
78 /* Encode spaces for quoteless attribute protection */
79 ' ' => '\\x20',
80 );
81
82 protected $urlSpecialChars = array(
83 /* HTML special chars - escape without exception to percent encoding */
84 '<' => '%3C',
85 '>' => '%3E',
86 '\'' => '%27',
87 '"' => '%22',
88 '&' => '%26',
89 /* Characters beyond ASCII value 255 to hex sequence */
90 'Ā' => '%C4%80',
91 /* Punctuation and unreserved check */
92 ',' => '%2C',
93 '.' => '.',
94 '_' => '_',
95 '-' => '-',
96 ':' => '%3A',
97 ';' => '%3B',
98 '!' => '%21',
99 /* Basic alnums excluded */
100 'a' => 'a',
101 'A' => 'A',
102 'z' => 'z',
103 'Z' => 'Z',
104 '0' => '0',
105 '9' => '9',
106 /* Basic control characters and null */
107 "\r" => '%0D',
108 "\n" => '%0A',
109 "\t" => '%09',
110 "\0" => '%00',
111 /* PHP quirks from the past */
112 ' ' => '%20',
113 '~' => '~',
114 '+' => '%2B',
115 );
116
117 protected $cssSpecialChars = array(
118 /* HTML special chars - escape without exception to hex */
119 '<' => '\\3C ',
120 '>' => '\\3E ',
121 '\'' => '\\27 ',
122 '"' => '\\22 ',
123 '&' => '\\26 ',
124 /* Characters beyond ASCII value 255 to unicode escape */
125 'Ā' => '\\100 ',
126 /* Immune chars excluded */
127 ',' => '\\2C ',
128 '.' => '\\2E ',
129 '_' => '\\5F ',
130 /* Basic alnums excluded */
131 'a' => 'a',
132 'A' => 'A',
133 'z' => 'z',
134 'Z' => 'Z',
135 '0' => '0',
136 '9' => '9',
137 /* Basic control characters and null */
138 "\r" => '\\D ',
139 "\n" => '\\A ',
140 "\t" => '\\9 ',
141 "\0" => '\\0 ',
142 /* Encode spaces for quoteless attribute protection */
143 ' ' => '\\20 ',
144 );
145
146 protected $env;
147
148 public function setUp()
149 {
150 $this->env = new Twig_Environment();
151 }
152
153 public function testHtmlEscapingConvertsSpecialChars()
154 {
155 foreach ($this->htmlSpecialChars as $key => $value) {
156 $this->assertEquals($value, twig_escape_filter($this->env, $key, 'html'), 'Failed to escape: '.$key);
157 }
158 }
159
160 public function testHtmlAttributeEscapingConvertsSpecialChars()
161 {
162 foreach ($this->htmlAttrSpecialChars as $key => $value) {
163 $this->assertEquals($value, twig_escape_filter($this->env, $key, 'html_attr'), 'Failed to escape: '.$key);
164 }
165 }
166
167 public function testJavascriptEscapingConvertsSpecialChars()
168 {
169 foreach ($this->jsSpecialChars as $key => $value) {
170 $this->assertEquals($value, twig_escape_filter($this->env, $key, 'js'), 'Failed to escape: '.$key);
171 }
172 }
173
174 public function testJavascriptEscapingReturnsStringIfZeroLength()
175 {
176 $this->assertEquals('', twig_escape_filter($this->env, '', 'js'));
177 }
178
179 public function testJavascriptEscapingReturnsStringIfContainsOnlyDigits()
180 {
181 $this->assertEquals('123', twig_escape_filter($this->env, '123', 'js'));
182 }
183
184 public function testCssEscapingConvertsSpecialChars()
185 {
186 foreach ($this->cssSpecialChars as $key => $value) {
187 $this->assertEquals($value, twig_escape_filter($this->env, $key, 'css'), 'Failed to escape: '.$key);
188 }
189 }
190
191 public function testCssEscapingReturnsStringIfZeroLength()
192 {
193 $this->assertEquals('', twig_escape_filter($this->env, '', 'css'));
194 }
195
196 public function testCssEscapingReturnsStringIfContainsOnlyDigits()
197 {
198 $this->assertEquals('123', twig_escape_filter($this->env, '123', 'css'));
199 }
200
201 public function testUrlEscapingConvertsSpecialChars()
202 {
203 foreach ($this->urlSpecialChars as $key => $value) {
204 $this->assertEquals($value, twig_escape_filter($this->env, $key, 'url'), 'Failed to escape: '.$key);
205 }
206 }
207
208 /**
209 * Range tests to confirm escaped range of characters is within OWASP recommendation
210 */
211
212 /**
213 * Only testing the first few 2 ranges on this prot. function as that's all these
214 * other range tests require
215 */
216 public function testUnicodeCodepointConversionToUtf8()
217 {
218 $expected = " ~ޙ";
219 $codepoints = array(0x20, 0x7e, 0x799);
220 $result = '';
221 foreach ($codepoints as $value) {
222 $result .= $this->codepointToUtf8($value);
223 }
224 $this->assertEquals($expected, $result);
225 }
226
227 /**
228 * Convert a Unicode Codepoint to a literal UTF-8 character.
229 *
230 * @param int Unicode codepoint in hex notation
231 * @return string UTF-8 literal string
232 */
233 protected function codepointToUtf8($codepoint)
234 {
235 if ($codepoint < 0x80) {
236 return chr($codepoint);
237 }
238 if ($codepoint < 0x800) {
239 return chr($codepoint >> 6 & 0x3f | 0xc0)
240 . chr($codepoint & 0x3f | 0x80);
241 }
242 if ($codepoint < 0x10000) {
243 return chr($codepoint >> 12 & 0x0f | 0xe0)
244 . chr($codepoint >> 6 & 0x3f | 0x80)
245 . chr($codepoint & 0x3f | 0x80);
246 }
247 if ($codepoint < 0x110000) {
248 return chr($codepoint >> 18 & 0x07 | 0xf0)
249 . chr($codepoint >> 12 & 0x3f | 0x80)
250 . chr($codepoint >> 6 & 0x3f | 0x80)
251 . chr($codepoint & 0x3f | 0x80);
252 }
253 throw new Exception('Codepoint requested outside of Unicode range');
254 }
255
256 public function testJavascriptEscapingEscapesOwaspRecommendedRanges()
257 {
258 $immune = array(',', '.', '_'); // Exceptions to escaping ranges
259 for ($chr=0; $chr < 0xFF; $chr++) {
260 if ($chr >= 0x30 && $chr <= 0x39
261 || $chr >= 0x41 && $chr <= 0x5A
262 || $chr >= 0x61 && $chr <= 0x7A) {
263 $literal = $this->codepointToUtf8($chr);
264 $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'js'));
265 } else {
266 $literal = $this->codepointToUtf8($chr);
267 if (in_array($literal, $immune)) {
268 $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'js'));
269 } else {
270 $this->assertNotEquals(
271 $literal,
272 twig_escape_filter($this->env, $literal, 'js'),
273 "$literal should be escaped!");
274 }
275 }
276 }
277 }
278
279 public function testHtmlAttributeEscapingEscapesOwaspRecommendedRanges()
280 {
281 $immune = array(',', '.', '-', '_'); // Exceptions to escaping ranges
282 for ($chr=0; $chr < 0xFF; $chr++) {
283 if ($chr >= 0x30 && $chr <= 0x39
284 || $chr >= 0x41 && $chr <= 0x5A
285 || $chr >= 0x61 && $chr <= 0x7A) {
286 $literal = $this->codepointToUtf8($chr);
287 $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'html_attr'));
288 } else {
289 $literal = $this->codepointToUtf8($chr);
290 if (in_array($literal, $immune)) {
291 $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'html_attr'));
292 } else {
293 $this->assertNotEquals(
294 $literal,
295 twig_escape_filter($this->env, $literal, 'html_attr'),
296 "$literal should be escaped!");
297 }
298 }
299 }
300 }
301
302 public function testCssEscapingEscapesOwaspRecommendedRanges()
303 {
304 $immune = array(); // CSS has no exceptions to escaping ranges
305 for ($chr=0; $chr < 0xFF; $chr++) {
306 if ($chr >= 0x30 && $chr <= 0x39
307 || $chr >= 0x41 && $chr <= 0x5A
308 || $chr >= 0x61 && $chr <= 0x7A) {
309 $literal = $this->codepointToUtf8($chr);
310 $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'css'));
311 } else {
312 $literal = $this->codepointToUtf8($chr);
313 $this->assertNotEquals(
314 $literal,
315 twig_escape_filter($this->env, $literal, 'css'),
316 "$literal should be escaped!");
317 }
318 }
319 }
320}