[module local(http://www.eclipse.org/emf/2002/Ecore) extends extended/]
[comment test definitions/]
[template public test_protected_visibility(c:EClass)]
	[file('protected_visibility', false)]
		[c.protected_overriding_template()/]
	[/file]
[/template]

[template public test_private_visibility(c:EClass)]
	[file('private_visibility', false)]
		[private_local_template(c)/]
	[/file]
[/template]

[template public test_super(c:EClass)]
	[file('super', false)]
		[call_to_super(c)/]
	[/file]
[/template]

[template public test_before(c:EClass)]
	[file('before_test', false)]
		[c.protected_overriding_template() before('before')/]
	[/file]
[/template]

[template public test_after(c:EClass)]
	[file('after_test', false)]
		[c.protected_overriding_template() after('after')/]
	[/file]
[/template]

[template public test_false_guard(c:EClass)]
	[file('false_guard', false)]
		[false_guard_template(c)/]
	[/file]
[/template]

[template public test_true_guard(c:EClass)]
	[file('true_guard', false)]
		[true_guard_template(c)/]
	[/file]
[/template]

[template public test_protect_override(c:EClass)]
	[file('protected_override', false)]
		[c.protected_extended_template()/]
	[/file]
[/template]

[template public test_import(c:EClass)]
	[file('import', false)]
		[imported_template(c)/]
	[/file]
[/template]

[comment template definitions/]
[comment visibility tests/]
[template protected protected_overriding_template(c:EClass) overrides protected_extended_template]
	local.protected_overriding_template called on [c.oclAsType(EObject).eClass().name/] [c.name/]
[/template]

[template private private_local_template(c:EClass)]
	local.private_local_template called on [c.oclAsType(EObject).eClass().name/] [c.name/]
[/template]

[comment super test/]
[template public call_to_super(c:EClass) overrides super_extended_template]
	overriding call to [super/]
[/template]

[comment guard tests/]
[template public false_guard_template(c:EClass) ? (not c.abstract)]
	local.false_guard_template called on [c.oclAsType(EObject).eClass().name/] [c.name/]
[/template]

[template public true_guard_template(c:EClass) ? (c.abstract)]
	local.true_guard_template called on [c.oclAsType(EObject).eClass().name/] [c.name/]
[/template]

[template public templateResult(str : Sequence(String))][str->first()/][/template]

[template public templateResultCollection(str : Sequence(Sequence(String)))][str->first()->first()/][/template]

[template public templateResultCollectionCollectionCollection(str : OrderedSet(Set(Sequence(Bag(String)))))][str/][/template]

[template public templateCalled(str : String)]template_call_[str/][/template]

[template public test_template_collection(eClass : EClass)]
[file('template_collection', false)][templateResult(Sequence{templateCalled('collection')})/][/file]
[/template]

[template public test_template_collection_collection(eClass : EClass)]
[file('template_collection_collection', false)][templateResultCollection(Sequence{Sequence{templateCalled('collection_collection')}})/][/file]
[/template]

[template public test_template_collection_collection_collection_collection(eClass : EClass)]
[file('template_collection_collection', false)][OrderedSet{Set{Sequence{Bag{templateCalled('collection_collection_collection_collection')}}}}/][/file]
[/template]

[template public test_collection_template(c:EClass)]
[file('test_collection_template', false)]
[collection_template(Sequence{c})/]
[/file]
[/template]

[template public test_sequence_template(c:EClass)]
[file('test_sequence_template', false)]
[sequence_template(Sequence{c})/]
[/file]
[/template]

[template public test_set_template(c:EClass)]
[file('test_set_template', false)]
[set_template(Set{c})/]
[/file]
[/template]

[template public test_bag_template(c:EClass)]
[file('test_bag_template', false)]
[bag_template(Bag{c})/]
[/file]
[/template]

[template public test_ordered_set_template(c:EClass)]
[file('test_ordered_set_template', false)]
[ordered_set_template(OrderedSet{c})/]
[/file]
[/template]





[template public collection_template(c:Collection(EClass)) collection_template]
extending_collection_template
[/template]

[template public sequence_template(c:Sequence(EClass)) overrides sequence_template]
extending_sequence_template
[/template]

[template public set_template(c:Set(EClass)) overrides set_template]
extending_set_template
[/template]

[template public bag_template(c:Bag(EClass)) overrides bag_template]
extending_bag_template
[/template]

[template public ordered_set_template(c:OrderedSet(EClass)) overrides ordered_set_template]
extending_ordered_set_template
[/template]

