Skip to content

Commit

Permalink
[#58] handle second level or deeper nested array properties and test
Browse files Browse the repository at this point in the history
  • Loading branch information
vickeryj committed Mar 2, 2009
1 parent 3659421 commit f804c5f
Show file tree
Hide file tree
Showing 7 changed files with 136 additions and 13 deletions.
31 changes: 18 additions & 13 deletions Classes/lib/Serialization/XML/FromXMLElementDelegate.m
Expand Up @@ -33,17 +33,15 @@ - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName nam
if ([@"nil-classes" isEqualToString:elementName]) {
//empty result set, do nothing
}

//Start of an array type
else if ([@"array" isEqualToString:[attributeDict objectForKey:@"type"]]) {
self.parsedObject = [NSMutableArray array];
[self.unclosedProperties addObject:[NSArray arrayWithObjects:elementName, self.parsedObject, nil]];
self.currentPropertyName = elementName;
}


//Start of the root object
else if (parsedObject == nil && [elementName isEqualToString:[self.targetClass xmlElementName]]) {
self.parsedObject = [[[self.targetClass alloc] init] autorelease];
else if (parsedObject == nil) {
if ([elementName isEqualToString:[self.targetClass xmlElementName]]) {
self.parsedObject = [[[self.targetClass alloc] init] autorelease];
}
else if ([@"array" isEqualToString:[attributeDict objectForKey:@"type"]]) {
self.parsedObject = [NSMutableArray array];
}
[self.unclosedProperties addObject:[NSArray arrayWithObjects:elementName, self.parsedObject, nil]];
self.currentPropertyName = elementName;
}
Expand All @@ -66,9 +64,16 @@ - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName nam
if (([self.parsedObject isKindOfClass:[NSArray class]]) ||
([[[self.parsedObject class] propertyNames] containsObject:[[self convertElementName:elementName] camelize]])) {
self.currentPropertyName = [self convertElementName:elementName];
self.contentOfCurrentProperty = [NSMutableString string];
self.currentPropertyType = [attributeDict objectForKey:@"type"];
} else {
if ([@"array" isEqualToString:[attributeDict objectForKey:@"type"]]) {
self.parsedObject = [NSMutableArray array];
[self.unclosedProperties addObject:[NSArray arrayWithObjects:elementName, self.parsedObject, nil]];
}
else {
self.contentOfCurrentProperty = [NSMutableString string];
self.currentPropertyType = [attributeDict objectForKey:@"type"];
}
}
else {
// The element isn't one that we care about, so set the property that holds the
// character content of the current element to nil. That way, in the parser:foundCharacters:
// callback, the string that the parser reports will be ignored.
Expand Down
10 changes: 10 additions & 0 deletions Classes/unit_tests/XMLDeserializeTest.m
Expand Up @@ -10,6 +10,8 @@
#import "NSObject+XMLSerializableSupport.h"
#import "TestClass.h"
#import "ObjectiveResourceDateFormatter.h"
#import "TestClassMiddle.h"
#import "TestClassTop.h"

@implementation XMLDeserializeTest

Expand Down Expand Up @@ -53,4 +55,12 @@ -(void) testDeserializationOfArray {

}

-(void) testArrayProperties {
[ObjectiveResourceDateFormatter setSerializeFormat:DateTime];
NSString *testXML = @"<test-class-top><test-class-middle><test-classes type=\"array\"><test-class><created-at></created-at><name>Hourly Test</name></test-class><test-class><created-at type=\"datetime\">2009-02-16T10:43:50Z</created-at><name>Hourly Test</name></test-class></test-classes></test-class-middle><test-classes type=\"array\"><test-class><created-at></created-at><name>Hourly Test</name></test-class><test-class><created-at type=\"datetime\">2009-02-16T10:43:50Z</created-at><name>Hourly Test</name></test-class></test-classes><test-class-top>";
TestClassTop *testclassTop = [TestClassTop fromXMLData:[testXML dataUsingEncoding:NSUTF8StringEncoding]];
STAssertEquals([testclassTop.testClasses count], [testclassTop.testClassMiddle.testClasses count], @"both test classes should have the same number of entries in their array properties");

}

@end
20 changes: 20 additions & 0 deletions TestClassMiddle.h
@@ -0,0 +1,20 @@
//
// TestClassMiddle.h
// objective_support
//
// Created by vickeryj on 3/2/09.
// Copyright 2009 Joshua Vickery. All rights reserved.
//

#import <Foundation/Foundation.h>


@interface TestClassMiddle : NSObject {

NSArray *testClasses;

}

@property(nonatomic, retain) NSArray *testClasses;

@end
23 changes: 23 additions & 0 deletions TestClassMiddle.m
@@ -0,0 +1,23 @@
//
// TestClassMiddle.m
// objective_support
//
// Created by vickeryj on 3/2/09.
// Copyright 2009 Joshua Vickery. All rights reserved.
//

#import "TestClassMiddle.h"


@implementation TestClassMiddle

@synthesize testClasses;

- (void) dealloc
{
[testClasses release];
[super dealloc];
}


@end
24 changes: 24 additions & 0 deletions TestClassTop.h
@@ -0,0 +1,24 @@
//
// TestClassTop.h
// objective_support
//
// Created by vickeryj on 3/2/09.
// Copyright 2009 Joshua Vickery. All rights reserved.
//

#import <Foundation/Foundation.h>

@class TestClassMiddle;

@interface TestClassTop : NSObject {

TestClassMiddle *testClassMiddle;
NSArray *testClasses;

}

@property(nonatomic, retain) TestClassMiddle *testClassMiddle;
@property(nonatomic, retain) NSArray *testClasses;


@end
25 changes: 25 additions & 0 deletions TestClassTop.m
@@ -0,0 +1,25 @@
//
// TestClassTop.m
// objective_support
//
// Created by vickeryj on 3/2/09.
// Copyright 2009 Joshua Vickery. All rights reserved.
//

#import "TestClassTop.h"
#import "TestClassMiddle.h"


@implementation TestClassTop

@synthesize testClassMiddle, testClasses;

- (void) dealloc
{
[testClassMiddle release];
[testClasses release];
[super dealloc];
}


@end
16 changes: 16 additions & 0 deletions objective_support.xcodeproj/project.pbxproj
Expand Up @@ -75,6 +75,10 @@
35C677850F2E6886005FF6CE /* NSObject+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 35C677800F2E6886005FF6CE /* NSObject+SBJSON.m */; };
35C677860F2E6886005FF6CE /* NSString+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 35C677820F2E6886005FF6CE /* NSString+SBJSON.m */; };
35C677870F2E6886005FF6CE /* SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 35C677840F2E6886005FF6CE /* SBJSON.m */; };
35CC9B700F5C9F0600BAE304 /* TestClassTop.m in Sources */ = {isa = PBXBuildFile; fileRef = 35CC9B6F0F5C9F0600BAE304 /* TestClassTop.m */; };
35CC9B710F5C9F0600BAE304 /* TestClassTop.m in Sources */ = {isa = PBXBuildFile; fileRef = 35CC9B6F0F5C9F0600BAE304 /* TestClassTop.m */; };
35CC9B740F5C9F1000BAE304 /* TestClassMiddle.m in Sources */ = {isa = PBXBuildFile; fileRef = 35CC9B730F5C9F1000BAE304 /* TestClassMiddle.m */; };
35CC9B750F5C9F1000BAE304 /* TestClassMiddle.m in Sources */ = {isa = PBXBuildFile; fileRef = 35CC9B730F5C9F1000BAE304 /* TestClassMiddle.m */; };
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
Expand Down Expand Up @@ -158,6 +162,10 @@
35C677820F2E6886005FF6CE /* NSString+SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+SBJSON.m"; sourceTree = "<group>"; };
35C677830F2E6886005FF6CE /* SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJSON.h; sourceTree = "<group>"; };
35C677840F2E6886005FF6CE /* SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJSON.m; sourceTree = "<group>"; };
35CC9B6E0F5C9F0600BAE304 /* TestClassTop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestClassTop.h; sourceTree = "<group>"; };
35CC9B6F0F5C9F0600BAE304 /* TestClassTop.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestClassTop.m; sourceTree = "<group>"; };
35CC9B720F5C9F1000BAE304 /* TestClassMiddle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestClassMiddle.h; sourceTree = "<group>"; };
35CC9B730F5C9F1000BAE304 /* TestClassMiddle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestClassMiddle.m; sourceTree = "<group>"; };
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
/* End PBXFileReference section */

Expand Down Expand Up @@ -224,6 +232,10 @@
351C5C5E0F4230C20008D3BC /* JSONDeserializeTest.m */,
351C5C600F4230DE0008D3BC /* TestClass.h */,
351C5C610F4230DE0008D3BC /* TestClass.m */,
35CC9B720F5C9F1000BAE304 /* TestClassMiddle.h */,
35CC9B730F5C9F1000BAE304 /* TestClassMiddle.m */,
35CC9B6E0F5C9F0600BAE304 /* TestClassTop.h */,
35CC9B6F0F5C9F0600BAE304 /* TestClassTop.m */,
23C783410F46497E0096B79D /* XMLDeserializeTest.h */,
23C783420F46497E0096B79D /* XMLDeserializeTest.m */,
);
Expand Down Expand Up @@ -504,6 +516,8 @@
237A71D30F49F8AD007AE4E5 /* NSArray+JSONSerializableSupport.m in Sources */,
237ACD080F4B1CD8009890E1 /* NSNumber+XMLSerializableSupport.m in Sources */,
23BE674A0F55941D002045F8 /* ObjectiveResourceDateFormatterTest.m in Sources */,
35CC9B700F5C9F0600BAE304 /* TestClassTop.m in Sources */,
35CC9B750F5C9F1000BAE304 /* TestClassMiddle.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -542,6 +556,8 @@
23B8A4FB0F55F2A600F74584 /* NSArray+JSONSerializableSupport.m in Sources */,
23B8A4FC0F55F2A600F74584 /* NSNumber+XMLSerializableSupport.m in Sources */,
23B8A4FD0F55F2A600F74584 /* ObjectiveResourceDateFormatterTest.m in Sources */,
35CC9B710F5C9F0600BAE304 /* TestClassTop.m in Sources */,
35CC9B740F5C9F1000BAE304 /* TestClassMiddle.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down

0 comments on commit f804c5f

Please sign in to comment.