Skip to content
This repository was archived by the owner on Mar 8, 2020. It is now read-only.

Commit fa2c481

Browse files
author
Mark S. Lewis
authored
Handle primitive types in ModelUtil.isAssignableTo() (#1022)
Also fixed a logic error where property name was used as a type name.
1 parent 8ddce61 commit fa2c481

File tree

2 files changed

+33
-29
lines changed

2 files changed

+33
-29
lines changed

packages/composer-common/lib/modelutil.js

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -96,23 +96,14 @@ class ModelUtil {
9696
* @private
9797
*/
9898
static isAssignableTo(modelFile, type, property) {
99-
if(ModelUtil.isPrimitiveType(type)) {
100-
throw new Error('This method only works with complex types.');
101-
}
99+
const propertyType = property.getFullyQualifiedTypeName();
102100

103-
if(ModelUtil.isPrimitiveType(property.getName())) {
104-
return false;
101+
if (ModelUtil.isPrimitiveType(type) || ModelUtil.isPrimitiveType(propertyType)) {
102+
return type === propertyType;
105103
}
106104

107-
// console.log( 'Checking whether type ' + type + ' can be stored in a property of type ' + property.getFullyQualifiedTypeName() );
108-
109-
// console.log( 'model file ns ' + modelFile.getNamespace() );
110-
// console.log( 'type ' + type );
111-
// console.log( 'property ' + property.getFullyQualifiedName() );
112-
// console.log( 'property type ' + property.getFullyQualifiedTypeName() );
113-
114105
// simple case
115-
if(type === property.getFullyQualifiedTypeName()) {
106+
if (type === propertyType) {
116107
return true;
117108
}
118109

packages/composer-common/test/modelutil.js

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -104,32 +104,45 @@ describe('ModelUtil', function () {
104104
});
105105

106106
describe('#isAssignableTo', function() {
107+
let mockModelFile;
108+
let mockProperty;
107109

108-
it('throws error for primitive types', function() {
109-
let mockModelFile = sinon.createStubInstance(ModelFile);
110-
let mockProperty = sinon.createStubInstance(Property);
111-
(() => {
112-
ModelUtil.isAssignableTo(mockModelFile, 'String', mockProperty);
113-
}).should.throw(/This method only works with complex types/);
110+
beforeEach(function() {
111+
mockModelFile = sinon.createStubInstance(ModelFile);
112+
mockProperty = sinon.createStubInstance(Property);
113+
});
114+
115+
it('returns true for matching primitive types', function() {
116+
mockProperty.getFullyQualifiedTypeName.returns('String');
117+
const result = ModelUtil.isAssignableTo(mockModelFile, 'String', mockProperty);
118+
result.should.equal(true);
119+
});
120+
121+
it('returns false for non-matching primitive types', function() {
122+
mockProperty.getFullyQualifiedTypeName.returns('DateTime');
123+
const result = ModelUtil.isAssignableTo(mockModelFile, 'Boolean', mockProperty);
124+
result.should.equal(false);
125+
});
126+
127+
it('returns false for assignment of primitive to non-primitive property', function() {
128+
mockProperty.getFullyQualifiedTypeName.returns('org.doge.Doge');
129+
const result = ModelUtil.isAssignableTo(mockModelFile, 'String', mockProperty);
130+
result.should.equal(false);
114131
});
115132

116-
it('returns false if property name is primitive type', function() {
117-
let mockModelFile = sinon.createStubInstance(ModelFile);
118-
let mockProperty = sinon.createStubInstance(Property);
119-
mockProperty.getName.returns('String');
120-
ModelUtil.isAssignableTo(mockModelFile, 'org.doge.Doge', mockProperty).should.equal(false);
133+
it('returns false for assignment of non-primitive to primitive property', function() {
134+
mockProperty.getFullyQualifiedTypeName.returns('String');
135+
const result = ModelUtil.isAssignableTo(mockModelFile, 'org.doge.Doge', mockProperty);
136+
result.should.equal(false);
121137
});
122138

123139
it('returns true if property type and required type are identical', function() {
124-
let mockModelFile = sinon.createStubInstance(ModelFile);
125-
let mockProperty = sinon.createStubInstance(Property);
126140
mockProperty.getFullyQualifiedTypeName.returns('org.doge.Doge');
127-
ModelUtil.isAssignableTo(mockModelFile, 'org.doge.Doge', mockProperty).should.equal(true);
141+
const result = ModelUtil.isAssignableTo(mockModelFile, 'org.doge.Doge', mockProperty);
142+
result.should.equal(true);
128143
});
129144

130145
it('throws error when type cannot be found', function() {
131-
let mockModelFile = sinon.createStubInstance(ModelFile);
132-
let mockProperty = sinon.createStubInstance(Property);
133146
mockProperty.getName.returns('theDoge');
134147
mockProperty.getFullyQualifiedTypeName.returns('org.doge.BaseDoge');
135148
mockModelFile.getType.returns(null);

0 commit comments

Comments
 (0)