Bgerstle has uploaded a new change for review. https://gerrit.wikimedia.org/r/219474
Change subject: save user lang selection ...................................................................... save user lang selection Change-Id: I8f3eef90811ca600941efcc6db256d471fd87a49 --- M Wikipedia.xcodeproj/project.pbxproj M Wikipedia/UI-V5/Global.h M Wikipedia/View Controllers/Languages/LanguagesViewController.m M Wikipedia/View Controllers/Languages/MWKLanguageLinkController.h M Wikipedia/View Controllers/Languages/MWKLanguageLinkController.m A Wikipedia/View Controllers/Languages/MWKLanguageLinkController_Private.h A WikipediaUnitTests/MWKLanguageLinkControllerTests.m A WikipediaUnitTests/Supporting Files/WikipediaUnitTests-Prefix.pch 8 files changed, 241 insertions(+), 7 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/ios/wikipedia refs/changes/74/219474/1 diff --git a/Wikipedia.xcodeproj/project.pbxproj b/Wikipedia.xcodeproj/project.pbxproj index a9f9e1e..27dae01 100644 --- a/Wikipedia.xcodeproj/project.pbxproj +++ b/Wikipedia.xcodeproj/project.pbxproj @@ -245,6 +245,7 @@ BC69C3141AB0C1FF0090B039 /* WMFImageInfoController.m in Sources */ = {isa = PBXBuildFile; fileRef = BC69C3131AB0C1FF0090B039 /* WMFImageInfoController.m */; }; BC6BF4001B19213600362968 /* XCTestCase+WMFLocaleTesting.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6BF3FE1B19209900362968 /* XCTestCase+WMFLocaleTesting.m */; }; BC7DFCD61AA4E5FE000035C3 /* WMFImageURLParsing.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7DFCD51AA4E5FE000035C3 /* WMFImageURLParsing.m */; }; + BC7E4A521B34B53E00EECD8B /* MWKLanguageLinkControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = BC7E4A511B34B53E00EECD8B /* MWKLanguageLinkControllerTests.m */; }; BC86B9361A92966B00B4C039 /* AFHTTPRequestOperationManager+UniqueRequests.m in Sources */ = {isa = PBXBuildFile; fileRef = BC86B9351A92966B00B4C039 /* AFHTTPRequestOperationManager+UniqueRequests.m */; }; BC86B93D1A929CC500B4C039 /* UICollectionViewFlowLayout+NSCopying.m in Sources */ = {isa = PBXBuildFile; fileRef = BC86B93C1A929CC500B4C039 /* UICollectionViewFlowLayout+NSCopying.m */; }; BC86B9401A929D7900B4C039 /* UICollectionViewFlowLayout+WMFItemSizeThatFits.m in Sources */ = {isa = PBXBuildFile; fileRef = BC86B93F1A929D7900B4C039 /* UICollectionViewFlowLayout+WMFItemSizeThatFits.m */; }; @@ -764,6 +765,7 @@ BC092BA01B19135700093C59 /* WMFApiJsonResponseSerializer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WMFApiJsonResponseSerializer.h; path = Serializers/WMFApiJsonResponseSerializer.h; sourceTree = "<group>"; }; BC092BA11B19135700093C59 /* WMFApiJsonResponseSerializer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WMFApiJsonResponseSerializer.m; path = Serializers/WMFApiJsonResponseSerializer.m; sourceTree = "<group>"; }; BC092BA61B19189100093C59 /* MWKSiteInfoFetcherTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MWKSiteInfoFetcherTests.m; sourceTree = "<group>"; }; + BC14F89F1B34B72500860018 /* WikipediaUnitTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WikipediaUnitTests-Prefix.pch"; sourceTree = "<group>"; }; BC2375981AB78D8A00B0BAA8 /* NSParagraphStyle+WMFNaturalAlignmentStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSParagraphStyle+WMFNaturalAlignmentStyle.h"; sourceTree = "<group>"; }; BC2375991AB78D8A00B0BAA8 /* NSParagraphStyle+WMFNaturalAlignmentStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSParagraphStyle+WMFNaturalAlignmentStyle.m"; sourceTree = "<group>"; }; BC23759D1AB8928600B0BAA8 /* WMFDateFormatterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WMFDateFormatterTests.m; sourceTree = "<group>"; }; @@ -796,6 +798,8 @@ BC7DFCCB1AA4BA8A000035C3 /* WMFCodingStyle.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WMFCodingStyle.h; sourceTree = "<group>"; }; BC7DFCD41AA4E5FE000035C3 /* WMFImageURLParsing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WMFImageURLParsing.h; sourceTree = "<group>"; }; BC7DFCD51AA4E5FE000035C3 /* WMFImageURLParsing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WMFImageURLParsing.m; sourceTree = "<group>"; }; + BC7E4A501B34B4B900EECD8B /* MWKLanguageLinkController_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWKLanguageLinkController_Private.h; sourceTree = "<group>"; }; + BC7E4A511B34B53E00EECD8B /* MWKLanguageLinkControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MWKLanguageLinkControllerTests.m; sourceTree = "<group>"; }; BC86B9341A92966B00B4C039 /* AFHTTPRequestOperationManager+UniqueRequests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "AFHTTPRequestOperationManager+UniqueRequests.h"; sourceTree = "<group>"; }; BC86B9351A92966B00B4C039 /* AFHTTPRequestOperationManager+UniqueRequests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AFHTTPRequestOperationManager+UniqueRequests.m"; sourceTree = "<group>"; }; BC86B93B1A929CC500B4C039 /* UICollectionViewFlowLayout+NSCopying.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UICollectionViewFlowLayout+NSCopying.h"; sourceTree = "<group>"; }; @@ -1285,6 +1289,7 @@ 041A3B5818E11ED90079FF1C /* LanguageCell.h */, 041A3B5918E11ED90079FF1C /* LanguageCell.m */, BC34E4681B31AD8B00258928 /* MWKLanguageLinkController.h */, + BC7E4A501B34B4B900EECD8B /* MWKLanguageLinkController_Private.h */, BC34E4691B31AD8B00258928 /* MWKLanguageLinkController.m */, BC34E4721B31D92100258928 /* LangaugeSelectionDelegate.h */, ); @@ -2143,6 +2148,7 @@ BCAFC5CF1AFD5E7D004615BA /* MWKArticle+WMFSharingTests.m */, BC5FE5741B1DFF5400273BC0 /* ArticleFetcherTests.m */, BC092BA61B19189100093C59 /* MWKSiteInfoFetcherTests.m */, + BC7E4A511B34B53E00EECD8B /* MWKLanguageLinkControllerTests.m */, ); name = Tests; path = WikipediaUnitTests; @@ -2164,6 +2170,7 @@ isa = PBXGroup; children = ( BCA6764D1AC05FD600A16160 /* Info.plist */, + BC14F89F1B34B72500860018 /* WikipediaUnitTests-Prefix.pch */, ); path = "Supporting Files"; sourceTree = "<group>"; @@ -2978,6 +2985,7 @@ BCEC778F1AC9AEC800D9DDA5 /* MWKImage+AssociationTestUtils.m in Sources */, 04F1226A1ACB822D002FC3B5 /* NSString+FormattedAttributedStringTests.m in Sources */, BCCED2D01AE03BE20094EB7E /* MWKSectionListTests.m in Sources */, + BC7E4A521B34B53E00EECD8B /* MWKLanguageLinkControllerTests.m in Sources */, BC0FED6B1AAA0268002488D7 /* MWKDataStoreStorageTests.m in Sources */, 0484B9071ABB50FA00874073 /* WMFArticleParsing.m in Sources */, BC0FED751AAA026C002488D7 /* NSArray+BKIndexTests.m in Sources */, @@ -3600,6 +3608,7 @@ "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", ); + GCC_PREFIX_HEADER = "WikipediaUnitTests/Supporting Files/WikipediaUnitTests-Prefix.pch"; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = "WikipediaUnitTests/Supporting Files/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.1; @@ -3707,6 +3716,7 @@ "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", ); + GCC_PREFIX_HEADER = "WikipediaUnitTests/Supporting Files/WikipediaUnitTests-Prefix.pch"; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = "WikipediaUnitTests/Supporting Files/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.1; @@ -3729,9 +3739,12 @@ "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", ); + GCC_PREFIX_HEADER = "WikipediaUnitTests/Supporting Files/WikipediaUnitTests-Prefix.pch"; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", "FB_REFERENCE_IMAGE_DIR=\"$(PROJECT_DIR)/WikipediaUnitTests/Reference Snapshots\"", + "MKT_SHORTHAND=1", + "HC_SHORTHAND=1", ); GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = "WikipediaUnitTests/Supporting Files/Info.plist"; @@ -3756,6 +3769,7 @@ "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", ); + GCC_PREFIX_HEADER = "WikipediaUnitTests/Supporting Files/WikipediaUnitTests-Prefix.pch"; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; INFOPLIST_FILE = "WikipediaUnitTests/Supporting Files/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.1; diff --git a/Wikipedia/UI-V5/Global.h b/Wikipedia/UI-V5/Global.h index 9e7cf48..b6bca8a 100644 --- a/Wikipedia/UI-V5/Global.h +++ b/Wikipedia/UI-V5/Global.h @@ -9,6 +9,7 @@ #endif // end DEBUG #import "WMFGCDHelpers.h" +#import "NSObjectUtilities.h" #import "RootViewController.h" #import "CenterNavController.h" diff --git a/Wikipedia/View Controllers/Languages/LanguagesViewController.m b/Wikipedia/View Controllers/Languages/LanguagesViewController.m index 4f124b3..c0e5e3c 100644 --- a/Wikipedia/View Controllers/Languages/LanguagesViewController.m +++ b/Wikipedia/View Controllers/Languages/LanguagesViewController.m @@ -261,7 +261,9 @@ - (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; - [self.languageSelectionDelegate languageSelected:[self languageAtIndexPath:indexPath] sender:self]; + MWKLanguageLink* selectedLanguage = [self languageAtIndexPath:indexPath]; + [self.langLinkController saveSelectedLanguage:selectedLanguage]; + [self.languageSelectionDelegate languageSelected:selectedLanguage sender:self]; } #pragma mark - UITextFieldDelegate diff --git a/Wikipedia/View Controllers/Languages/MWKLanguageLinkController.h b/Wikipedia/View Controllers/Languages/MWKLanguageLinkController.h index 40168ba..2e4a4db 100644 --- a/Wikipedia/View Controllers/Languages/MWKLanguageLinkController.h +++ b/Wikipedia/View Controllers/Languages/MWKLanguageLinkController.h @@ -44,6 +44,10 @@ success:(dispatch_block_t)success failure:(void (^ __nullable)(NSError* __nonnull))failure; +- (void)saveSelectedLanguage:(MWKLanguageLink*)language; + +- (void)saveSelectedLanguageCode:(NSString*)languageCode; + @end NS_ASSUME_NONNULL_END diff --git a/Wikipedia/View Controllers/Languages/MWKLanguageLinkController.m b/Wikipedia/View Controllers/Languages/MWKLanguageLinkController.m index cfde35d..f3e498a 100644 --- a/Wikipedia/View Controllers/Languages/MWKLanguageLinkController.m +++ b/Wikipedia/View Controllers/Languages/MWKLanguageLinkController.m @@ -6,7 +6,7 @@ // Copyright (c) 2015 Wikimedia Foundation. All rights reserved. // -#import "MWKLanguageLinkController.h" +#import "MWKLanguageLinkController_Private.h" #import "MWKTitle.h" #import "MWKLanguageLink.h" #import "MWKLanguageLinkFetcher.h" @@ -21,6 +21,35 @@ #import <BlocksKit/BlocksKit.h> NS_ASSUME_NONNULL_BEGIN + +static NSString* const WMFPreviousLanguagesKey = @"WMFPreviousSelectedLanguagesKey"; + +void WMFDeletePreviouslySelectedLanguages() { + [[NSUserDefaults standardUserDefaults] removeObjectForKey:WMFPreviousLanguagesKey]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} + +NSArray* WMFReadPreviouslySelectedLanguages() { + return [[NSUserDefaults standardUserDefaults] arrayForKey:WMFPreviousLanguagesKey] ? : @[]; +} + +/// Get the union of OS preferred languages & previously selected languages. +static NSArray* WMFReadPreviousAndPreferredLanguages() { + NSMutableSet* preferredLanguages = [NSMutableSet setWithArray:[NSLocale preferredLanguages]]; + [preferredLanguages addObjectsFromArray:WMFReadPreviouslySelectedLanguages()]; + return [preferredLanguages allObjects]; +} + +/// Uniquely append @c languageCode to the list of previously selected languages. +static NSArray* WMFAppendAndWriteToPreviousLanguages(NSString* languageCode) { + NSMutableArray* langCodes = WMFReadPreviouslySelectedLanguages().mutableCopy; + if (![langCodes containsObject:languageCode]) { + [langCodes addObject:languageCode]; + [[NSUserDefaults standardUserDefaults] setObject:langCodes forKey:WMFPreviousLanguagesKey]; + [[NSUserDefaults standardUserDefaults] synchronize]; + } + return langCodes; +} /** * List of unsupported language codes. @@ -39,8 +68,6 @@ } @interface MWKLanguageLinkController () - -@property (copy, nonatomic) NSArray* languageLinks; @property (readonly, strong, nonatomic) MWKLanguageLinkFetcher* fetcher; @@ -92,6 +119,14 @@ #pragma mark - Getters & Setters +- (NSArray*)languageCodes { + return [self.languageLinks valueForKey:WMF_SAFE_KEYPATH(MWKLanguageLink.new, languageCode)]; +} + +- (NSArray*)filteredPreferredLanguageCodes { + return [self.filteredPreferredLanguages valueForKey:WMF_SAFE_KEYPATH(MWKLanguageLink.new, languageCode)]; +} + - (void)setLanguageFilter:(NSString* __nullable)filterString { if (WMF_EQUAL(self.languageFilter, isEqualToString:, filterString)) { return; @@ -130,17 +165,30 @@ } - (void)updateFilteredLanguages { + [self updateFilteredLanguagesWithPreviousLanguages:WMFReadPreviousAndPreferredLanguages()]; +} + +- (void)updateFilteredLanguagesWithPreviousLanguages:(NSArray*)previousLanguages { NSArray* sortedAndFilteredLanguages = [self sortedAndFilteredLanguageLinks]; - + NSArray* preferredLangs = WMFReadPreviousAndPreferredLanguages(); self.filteredPreferredLanguages = [sortedAndFilteredLanguages bk_select:^BOOL (MWKLanguageLink* langLink) { - return [[NSLocale preferredLanguages] containsObject:langLink.languageCode]; + return [preferredLangs containsObject:langLink.languageCode]; }]; - self.filteredOtherLanguages = [sortedAndFilteredLanguages bk_select:^BOOL (MWKLanguageLink* langLink) { return ![self.filteredPreferredLanguages containsObject:langLink]; }]; } +#pragma mark - Saving + +- (void)saveSelectedLanguage:(MWKLanguageLink*)language { + [self saveSelectedLanguageCode:language.languageCode]; +} + +- (void)saveSelectedLanguageCode:(NSString*)languageCode { + [self updateFilteredLanguagesWithPreviousLanguages:WMFAppendAndWriteToPreviousLanguages(languageCode)]; +} + @end NS_ASSUME_NONNULL_END diff --git a/Wikipedia/View Controllers/Languages/MWKLanguageLinkController_Private.h b/Wikipedia/View Controllers/Languages/MWKLanguageLinkController_Private.h new file mode 100644 index 0000000..39085c9 --- /dev/null +++ b/Wikipedia/View Controllers/Languages/MWKLanguageLinkController_Private.h @@ -0,0 +1,37 @@ +// +// MWKLanguageLinkController_Private.h +// Wikipedia +// +// Created by Brian Gerstle on 6/19/15. +// Copyright (c) 2015 Wikimedia Foundation. All rights reserved. +// + +#import "MWKLanguageLinkController.h" + +NS_ASSUME_NONNULL_BEGIN + +/** + * Delete all previously selected languages. + * @warning For testing only! + */ +extern void WMFDeletePreviouslySelectedLanguages(); + +/** + * Reads previously selected languages from storage. + * @return The previously selected languages, or an empty array of none were previously selected. + */ +extern NSArray* WMFReadPreviouslySelectedLanguages(); + +@interface MWKLanguageLinkController () + +@property (copy, nonatomic) NSArray* languageLinks; + +/// @return All the language codes in @c filteredPreferredLanguages +- (NSArray*)filteredPreferredLanguageCodes; + +/// @return All the language codes in @c languageLinks +- (NSArray*)languageCodes; + +@end + +NS_ASSUME_NONNULL_END diff --git a/WikipediaUnitTests/MWKLanguageLinkControllerTests.m b/WikipediaUnitTests/MWKLanguageLinkControllerTests.m new file mode 100644 index 0000000..a9af389 --- /dev/null +++ b/WikipediaUnitTests/MWKLanguageLinkControllerTests.m @@ -0,0 +1,113 @@ +// +// MWKLanguageLinkControllerTests.m +// Wikipedia +// +// Created by Brian Gerstle on 6/19/15. +// Copyright (c) 2015 Wikimedia Foundation. All rights reserved. +// + +#import <UIKit/UIKit.h> +#import <XCTest/XCTest.h> +#import "MWKLanguageLinkController_Private.h" +#import "MWKLanguageLink.h" +#import <OCHamcrest/OCHamcrest.h> + +@interface MWKLanguageLinkControllerTests : XCTestCase +@property (strong, nonatomic) MWKLanguageLinkController* controller; +@end + +@implementation MWKLanguageLinkControllerTests + +- (void)setUp { + [super setUp]; + + NSAssert([[NSLocale preferredLanguages] containsObject:@"en"], + @"For simplicity these tests assume the simulator has 'English' has one of its preferred languages."); + + // all tests must start w/ a clean slate + WMFDeletePreviouslySelectedLanguages(); + [self instantiateController]; +} + +- (void)testReadPreviouslySelectedLanguagesReturnsEmpty { + assertThat(WMFReadPreviouslySelectedLanguages(), hasCountOf(0)); +} + +- (void)testDefaultsToDevicePreferredLanguages { + NSParameterAssert(self.controller.filteredPreferredLanguageCodes.count > 0); + + /* + using weaker "intersection" test since there might be a case where the sim preferred languages have + more than what's defined in the static language data + */ + XCTAssertTrue([[NSSet setWithArray:self.controller.filteredPreferredLanguageCodes] + intersectsSet: + [NSSet setWithArray:[NSLocale preferredLanguages]]]); + + [self verifyAllLanguageArrayProperties]; +} + +- (void)testSaveSelectedLanguageUpdatesTheControllersFilteredPreferredLanguages { + NSAssert(![self.controller.filteredPreferredLanguageCodes containsObject:@"test"], + @"'test' shouldn't be a default member of preferred languages!"); + + [self.controller saveSelectedLanguageCode:@"test"]; + + assertThat(self.controller.filteredPreferredLanguageCodes, hasItem(@"test")); + [self verifyAllLanguageArrayProperties]; +} + +- (void)testUniqueAppendToPreferredLanguages { + [self.controller saveSelectedLanguageCode:@"test"]; + NSArray* firstAppend = [self.controller.filteredOtherLanguages copy]; + + [self.controller saveSelectedLanguageCode:@"test"]; + NSArray* secondAppend = [self.controller.filteredOtherLanguages copy]; + + assertThat(firstAppend, is(equalTo(secondAppend))); + + [self verifyAllLanguageArrayProperties]; +} + +- (void)testPersistentSaves { + id firstController = self.controller; + [firstController saveSelectedLanguageCode:@"test"]; + [self instantiateController]; + NSParameterAssert(firstController != self.controller); + assertThat(self.controller.filteredPreferredLanguageCodes, hasItem(@"test")); +} + +#pragma mark - Utils + +- (void)instantiateController { + self.controller = [MWKLanguageLinkController new]; + // temporarily repurpose static lang data for testing + [self.controller loadStaticSiteLanguageData]; +} + +- (void)verifyAllLanguageArrayProperties { + [self verifyPreferredAndOtherSumIsAllLanguages]; + [self verifyPreferredAndOtherAreDisjoint]; +} + +- (void)verifyPreferredAndOtherAreDisjoint { + XCTAssertFalse([[NSSet setWithArray:self.controller.filteredPreferredLanguages] + intersectsSet: + [NSSet setWithArray:self.controller.filteredOtherLanguages]], + @"'preferred' and 'other' languages shouldn't intersect: \n preferred: %@ \nother: %@", + self.controller.filteredPreferredLanguages, self.controller.filteredOtherLanguages); +} + +- (void)verifyPreferredAndOtherSumIsAllLanguages { + NSSet* joinedLanguages = [NSSet setWithArray: + [self.controller.filteredPreferredLanguages + arrayByAddingObjectsFromArray:self.controller.filteredOtherLanguages]]; + + assertThat(joinedLanguages, + hasCountOf(self.controller.filteredOtherLanguages.count + + self.controller.filteredPreferredLanguages.count)); + + assertThat([NSSet setWithArray:self.controller.languageLinks], is(equalTo(joinedLanguages))); +} + +@end diff --git a/WikipediaUnitTests/Supporting Files/WikipediaUnitTests-Prefix.pch b/WikipediaUnitTests/Supporting Files/WikipediaUnitTests-Prefix.pch new file mode 100644 index 0000000..0413211 --- /dev/null +++ b/WikipediaUnitTests/Supporting Files/WikipediaUnitTests-Prefix.pch @@ -0,0 +1,15 @@ +// +// WikipediaUnitTests-Prefix.pch +// Wikipedia +// +// Created by Brian Gerstle on 6/19/15. +// Copyright (c) 2015 Wikimedia Foundation. All rights reserved. +// + +#ifndef Wikipedia_WikipediaUnitTests_Prefix_pch +#define Wikipedia_WikipediaUnitTests_Prefix_pch + +#import <XCTest/XCTest.h> +#import "Global.h" + +#endif -- To view, visit https://gerrit.wikimedia.org/r/219474 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I8f3eef90811ca600941efcc6db256d471fd87a49 Gerrit-PatchSet: 1 Gerrit-Project: apps/ios/wikipedia Gerrit-Branch: master Gerrit-Owner: Bgerstle <bgers...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits