KWSharedExampleRegistry.m 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. //
  2. // Licensed under the terms in License.txt
  3. //
  4. // Copyright 2014 Allen Ding. All rights reserved.
  5. //
  6. #import "KWSharedExampleRegistry.h"
  7. #import "KWSharedExample.h"
  8. @interface KWSharedExampleRegistry ()
  9. @property (nonatomic, strong) NSMutableDictionary *sharedExamples;
  10. @end
  11. @implementation KWSharedExampleRegistry
  12. #pragma mark - Initializing
  13. + (instancetype)sharedRegistry {
  14. static KWSharedExampleRegistry *sharedRegistry = nil;
  15. static dispatch_once_t onceToken;
  16. dispatch_once(&onceToken, ^{
  17. sharedRegistry = [self new];
  18. });
  19. return sharedRegistry;
  20. }
  21. - (id)init {
  22. self = [super init];
  23. if (self) {
  24. _sharedExamples = [NSMutableDictionary dictionary];
  25. }
  26. return self;
  27. }
  28. #pragma mark - Public Interface
  29. - (KWSharedExample *)sharedExampleForName:(NSString *)name {
  30. [self raiseIfSharedExampleNotRegistered:name];
  31. return [_sharedExamples objectForKey:name];
  32. }
  33. - (void)registerSharedExample:(KWSharedExample *)sharedExample {
  34. [self raiseIfSharedExampleAlreadyRegistered:sharedExample];
  35. [_sharedExamples setObject:sharedExample forKey:sharedExample.name];
  36. }
  37. #pragma mark - Internal Methods
  38. - (void)raiseIfSharedExampleNotRegistered:(NSString *)name {
  39. if (![_sharedExamples objectForKey:name]) {
  40. [NSException raise:NSInternalInconsistencyException
  41. format:@"Kiwi shared example error: No shared example registered for '%@'",
  42. name];
  43. }
  44. }
  45. - (void)raiseIfSharedExampleAlreadyRegistered:(KWSharedExample *)sharedExample {
  46. if ([_sharedExamples objectForKey:sharedExample.name]) {
  47. [NSException raise:NSInternalInconsistencyException
  48. format:@"Kiwi shared example error: Shared example already registered for '%@'",
  49. sharedExample.name];
  50. }
  51. }
  52. @end