import org.bar.Foo;
import TestBlackboxLibrary;
import org.eclipse.m2m.tests.qvt.oml.bbox.SimpleJavaLibrary;

modeltype Ecore "strict" uses ecore('http://www.eclipse.org/emf/2002/Ecore');

library bug289982_lib;


// from 'org.eclipse.m2m.tests.qvt.oml.bbox.SimpleJavaLibrary'
// 
blackbox helper echoFromSimpleJavaLibrary(s : String) : String;


// from 'TestBlackboxLibrary'
//
blackbox helper legacyAsRenamedSet(obj : OclAny, text: String) : Set(ENamedElement);

blackbox helper OclAny::legacyOclAnyAsSet() : Set(OclAny);


// from 'org.bar.Foo' unit, library 'Bug289982_Lib'
// 
blackbox constructor EPackage::EPackage();

blackbox constructor EPackage::EPackage(c : List(String));

blackbox constructor EModelElement::EModelElement();


// helpers
// 
blackbox helper EPackage::contextualHelper();

blackbox helper nonContextualHelper();

blackbox helper EPackage::contextualHelper(c : List(String)) : Set(String);

blackbox helper nonContextualHelper(c : List(String)) : Set(String);

blackbox helper EPackage::contextualHelperWithExecContext();

blackbox helper nonContextualHelperWithExecContext();

blackbox helper EPackage::contextualHelperWithExecContext(c : List(String)) : Set(String);

blackbox helper nonContextualHelperWithExecContext(c : List(String)) : Set(String);


// queries
// 
blackbox query EClass::contextualQuery();

blackbox query nonContextualQuery();

blackbox query EClass::contextualQuery(c : Dict(String, Integer)) : Sequence(String);

blackbox query nonContextualQuery(c : Dict(String, Integer)) : Sequence(String);

blackbox query EClass::contextualQueryWithExecContext();

blackbox query nonContextualQueryWithExecContext();

blackbox query EClass::contextualQueryWithExecContext(c : Dict(String, Integer)) : Sequence(String);

blackbox query nonContextualQueryWithExecContext(c : Dict(String, Integer)) : Sequence(String);


// operations
// 
blackbox helper EClass::contextualOperation();

blackbox helper nonContextualOperation();

blackbox helper EClass::contextualOperation(c : Dict(String, Integer)) : Sequence(String);

blackbox helper nonContextualOperation(c : Dict(String, Integer)) : Sequence(String);

blackbox helper EClass::contextualOperationWithExecContext();

blackbox helper nonContextualOperationWithExecContext();

blackbox helper EClass::contextualOperationWithExecContext(c : Dict(String, Integer)) : Sequence(String);

blackbox helper nonContextualOperationWithExecContext(c : Dict(String, Integer)) : Sequence(String);


// mappings
// 
blackbox mapping EClassifier::contextualMapping() : EClassifier when {false};

blackbox mapping nonContextualMapping() : EClassifier when {true};

blackbox mapping EClassifier::contextualMapping(r : Real, c : Collection(Real), e : EModelElement) : Sequence(EClassifier);

blackbox mapping nonContextualMapping(r : Real, c : Collection(Real), e : EModelElement) : Sequence(EClassifier);

blackbox mapping EClassifier::contextualMappingWithExecContext() : EClassifier;

blackbox mapping nonContextualMappingWithExecContext() : EClassifier;

blackbox mapping EClassifier::contextualMappingWithExecContext(c : Dict(String, Integer)) : Sequence(EClassifier);

blackbox mapping nonContextualMappingWithExecContext(c : Dict(String, Integer)) : Sequence(EClassifier);
