Browse Source

[UI] New tests for the new UI

Notice that screenshots for fastlane are taken in the test file
by calling `snapshot("IMG_NAME")`
Mike JS. Choi 7 years ago
parent
commit
050b23f83a

+ 3 - 1
.gitignore

@@ -10,9 +10,11 @@ xcuserdata
 # Fastlane
 fastlane/report.xml
 fastlane/Preview.html
-fastlane/screenshots
 fastlane/test_output
 
+fastlane/screenshots/*/*.png
+fastlane/screenshots/screenshots.html
+
 # CocoaPods
 Pods
 

+ 45 - 0
VLC for iOSUITests/LocaleHelper.swift

@@ -0,0 +1,45 @@
+/*****************************************************************************
+ * LocaleHelper.swift
+ * VLC for iOSUITests
+ *****************************************************************************
+ * Copyright (c) 2018 VideoLAN. All rights reserved.
+ * $Id$
+ *
+ * Authors: Mike JS. Choi <mkchoi212 # icloud.com>
+ *
+ * Refer to the COPYING file of the official project for license.
+ *****************************************************************************/
+
+import Foundation
+import XCTest
+
+struct LocaleHelper {
+    let localizationBundle: Bundle
+    let inherantBundle = Bundle(for: UIApplication.self)
+
+    init(lang: String, target: AnyClass) {
+        localizationBundle = LocaleHelper.loadLocalizables(lang: lang, target: target)
+    }
+
+    func localized(key: String) -> String {
+        let res = NSLocalizedString(key, bundle: localizationBundle, comment: "")
+        return res
+    }
+}
+
+extension LocaleHelper {
+    static func loadLocalizables(lang: String, target: AnyClass) -> Bundle {
+        let mainBundle = Bundle(for: target.self)
+        guard let path = mainBundle.path(forResource: lang, ofType: ".lproj") else {
+            XCTFail("Could not resolve localization file for \(lang)")
+            return Bundle()
+        }
+
+        guard let bundle = Bundle(path: path) else {
+            XCTFail("Could not load bundle at \(path)")
+            return Bundle()
+        }
+
+        return bundle
+    }
+}

+ 0 - 113
VLC for iOSUITests/VLC_for_IOSTestMenu.m

@@ -1,113 +0,0 @@
-/*****************************************************************************
- * VLC_for_IOSTestMenu.m
- * VLC for iOS
- *****************************************************************************
- * Copyright (c) 2018 VideoLAN. All rights reserved.
- * $Id$
- *
- * Author: Carola Nitz <caro # videolan.org>
- *
- * Refer to the COPYING file of the official project for license.
- *****************************************************************************/
-
-#import <XCTest/XCTest.h>
-
-@interface VLC_for_IOSTestMenu : XCTestCase
-@property (nonatomic, strong) XCUIApplication *application;
-@end
-
-@implementation VLC_for_IOSTestMenu
-
-- (void)setUp {
-    [super setUp];
-    self.continueAfterFailure = YES;
-
-    self.application = [[XCUIApplication alloc] init];
-    [self.application launch];
-    [[XCUIDevice sharedDevice] setOrientation:UIDeviceOrientationFaceUp];
-
-    if (self.application.navigationBars[@"Welcome"].exists) {
-        [self.application.navigationBars[@"Welcome"].buttons[@"Done"] tap];
-    }
-}
-
-- (void)testMenuTabAllFiles
-{
-    [self.application.navigationBars[@"All Files"].buttons[@"Open VLC sidebar menu"] tap];
-    [self.application.cells.staticTexts[@"All Files"] tap];
-    XCTAssertNotNil(self.application.navigationBars[@"All Files"]);
-}
-
-- (void)testMenuTabMusicAlbums
-{
-    [self.application.navigationBars[@"All Files"].buttons[@"Open VLC sidebar menu"] tap];
-    [self.application.cells.staticTexts[@"Music Albums"] tap];
-
-    XCTAssertNotNil(self.application.navigationBars[@"Music Albums"]);
-}
-
-- (void)testMenuTabTVShows
-{
-    [self.application.navigationBars[@"All Files"].buttons[@"Open VLC sidebar menu"] tap];
-    [self.application.cells.staticTexts[@"TV Shows"] tap];
-
-    XCTAssertNotNil(self.application.navigationBars[@"TV Shows"]);
-}
-
-- (void)testMenuTabLocalNetwork
-{
-    [self.application.navigationBars[@"All Files"].buttons[@"Open VLC sidebar menu"] tap];
-    [self.application.cells.staticTexts[@"Local Network"] tap];
-
-    XCTAssertNotNil(self.application.navigationBars[@"Local Network"]);
-}
-
-- (void)testMenuTabNetworkStream
-{
-    [self.application.navigationBars[@"All Files"].buttons[@"Open VLC sidebar menu"] tap];
-    [self.application.cells.staticTexts[@"Network Stream"] tap];
-
-    XCTAssertNotNil(self.application.navigationBars[@"Network Stream"]);
-}
-
-- (void)testMenuTabDownloads
-{
-    [self.application.navigationBars[@"All Files"].buttons[@"Open VLC sidebar menu"] tap];
-    [self.application.cells.staticTexts[@"Downloads"] tap];
-
-    XCTAssertNotNil(self.application.navigationBars[@"Downloads"]);
-}
-
-- (void)testMenuTabWifi
-{
-    [self.application.navigationBars[@"All Files"].buttons[@"Open VLC sidebar menu"] tap];
-    [self.application.cells.staticTexts[@"Sharing via WiFi"] tap];
-
-    XCTAssertFalse(self.application.tables.staticTexts[@"Inactive Server"].exists);
-}
-
-- (void)testMenuTabCloudServices
-{
-    [self.application.navigationBars[@"All Files"].buttons[@"Open VLC sidebar menu"] tap];
-    [self.application.cells.staticTexts[@"Cloud Services"] tap];
-
-    XCTAssertNotNil(self.application.navigationBars[@"Cloud Services"]);
-}
-
-- (void)testMenuTabSettings
-{
-    [self.application.navigationBars[@"All Files"].buttons[@"Open VLC sidebar menu"] tap];
-    [self.application.cells.staticTexts[@"Settings"] tap];
-
-    XCTAssertNotNil(self.application.navigationBars[@"Settings"]);
-}
-
-- (void)testMenuTabAbout
-{
-    [self.application.navigationBars[@"All Files"].buttons[@"Open VLC sidebar menu"] tap];
-    [self.application.cells.staticTexts[@"About VLC for iOS"] tap];
-
-    XCTAssertNotNil(self.application.navigationBars[@"About"]);
-}
-
-@end

+ 0 - 106
VLC for iOSUITests/VLC_for_iOSTestVideoCodecs.m

@@ -1,106 +0,0 @@
-/*****************************************************************************
- * VLC_for_iOSTestVideoCodecs.m
- * VLC for iOS
- *****************************************************************************
- * Copyright (c) 2018 VideoLAN. All rights reserved.
- * $Id$
- *
- * Author: Carola Nitz <caro # videolan.org>
- *
- * Refer to the COPYING file of the official project for license.
- *****************************************************************************/
-
-#import <XCTest/XCTest.h>
-
-@interface XCUIElement(Test)
-
-- (void)clearAndEnterText:(NSString *)text;
-
-@end
-
-@implementation XCUIElement(Test)
-
-- (void)clearAndEnterText:(NSString *)text {
-    if( ![[self value] isKindOfClass:[NSString class]]) {
-        XCTFail("Tried to clear and enter text into a non string value");
-        return;
-    }
-
-    [self tap];
-    NSString *deleteString = @"";
-    for (int i = 0; i < [(NSString *)[self value] length]; i++){
-        deleteString = [deleteString stringByAppendingString:XCUIKeyboardKeyDelete];
-    }
-
-    [self typeText:deleteString];
-    [self typeText:text];
-}
-@end
-
-@interface VLC_for_iOSTestVideoCodecs : XCTestCase
-
-@end
-
-@implementation VLC_for_iOSTestVideoCodecs
-
-- (void)setUp {
-    [super setUp];
-    self.continueAfterFailure = YES;
-
-    [[[XCUIApplication alloc] init] launch];
-    [[XCUIDevice sharedDevice] setOrientation:UIDeviceOrientationFaceUp];
-}
-
-- (void)tearDown {
-    // Put teardown code here. This method is called after the invocation of each test method in the class.
-    [super tearDown];
-}
-
-- (void)testMovCodec
-{
-    [self playWithFilename:@"rtsp://184.72.239.149/vod/mp4:BigBuckBunny_175k.mov"];
-}
-
-- (void)testHEVCCodec10b
-{
-    [self playWithFilename:@"http://jell.yfish.us/media/jellyfish-90-mbps-hd-hevc-10bit.mkv"];
-}
-
-- (void)testHEVCCodec
-{
-    [self playWithFilename:@"http://jell.yfish.us/media/jellyfish-25-mbps-hd-hevc.mkv"];
-}
-
-- (void)testH264Codec
-{
-    [self playWithFilename:@"http://jell.yfish.us/media/jellyfish-25-mbps-hd-h264.mkv"];
-}
-
-- (void)playWithFilename:(NSString *)filename
-{
-    XCUIApplication *app = [[XCUIApplication alloc] init];
-    [app.navigationBars[@"All Files"].buttons[@"Open VLC sidebar menu"] tap];
-    
-    [app.cells.staticTexts[@"Network Stream"] tap];
-
-    XCUIElement *httpMyserverComFileMkvTextField = app.textFields.allElementsBoundByIndex.firstObject;
-
-    [httpMyserverComFileMkvTextField clearAndEnterText:filename];
-    [[[XCUIApplication alloc] init].buttons[@"Open Network Stream"] tap];
-    
-    XCUIElement *displayTime = app.buttons[@"--:--"];
-    __block NSPredicate *predicate = [NSPredicate predicateWithFormat:@"exists == 0"];
-
-    [self expectationForPredicate:predicate evaluatedWithObject:displayTime handler:nil];
-    //we wait for the displaytime to change
-    [self waitForExpectationsWithTimeout:20.0 handler:^(NSError * _Nullable error) {
-        //once it changes we tap the videoplayer to bring up the playelements
-        [app.otherElements[@"Video Player"] doubleTap];
-        XCUIElement *playpause = app.buttons[@"Play or Pause current playback"];
-        predicate = [NSPredicate predicateWithFormat:@"exists == 1"];
-        [self expectationForPredicate:predicate evaluatedWithObject:playpause handler:nil];
-        [self waitForExpectationsWithTimeout:20.0 handler:nil];
-    }];
-}
-@end
-

+ 89 - 0
VLC for iOSUITests/VLCiOSTestMenu.swift

@@ -0,0 +1,89 @@
+/*****************************************************************************
+ * VLCiOSTestMenu.swift
+ * VLC for iOSUITests
+ *****************************************************************************
+ * Copyright (c) 2018 VideoLAN. All rights reserved.
+ * $Id$
+ *
+ * Authors: Mike JS. Choi <mkchoi212 # icloud.com>
+ *
+ * Refer to the COPYING file of the official project for license.
+ *****************************************************************************/
+
+import Foundation
+import XCTest
+
+class VLCiOSTestMenu: XCTestCase {
+    let app = XCUIApplication()
+    let helper = LocaleHelper(lang: deviceLanguage, target: VLCiOSTestVideoCodecs.self)
+    let moreTab = XCUIApplication().tabBars.buttons.element(boundBy: 4)
+
+    override func setUp() {
+        super.setUp()
+
+        XCUIDevice.shared.orientation = .portrait
+        setupSnapshot(app)
+        app.launch()
+    }
+
+    func testNavigationToAudioTab() {
+        let audio = helper.localized(key: "AUDIO")
+        app.tabBars.buttons[audio].tap()
+        XCTAssertNotNil(app.navigationBars[audio])
+
+        snapshot("audio_tab")
+    }
+
+    func testNavigationToNetworkTab() {
+        let localNetwork = helper.localized(key: "LOCAL_NETWORK")
+        app.tabBars.buttons[localNetwork].tap()
+        XCTAssertNotNil(app.navigationBars[localNetwork])
+
+        snapshot("network_tab")
+    }
+
+    func testNavigationToVideoTab() {
+        app.tabBars.buttons["Video"].tap()
+        XCTAssertNotNil(app.navigationBars["Video"])
+
+        snapshot("video_tab")
+    }
+
+    func testNavigationToSettingsTab() {
+        let settings = helper.localized(key: "Settings")
+        app.tabBars.buttons[settings].tap()
+        XCTAssertNotNil(app.navigationBars[settings])
+    }
+
+    func testNavigationToCloudServices() {
+        moreTab.tap()
+
+        let cloudServices = helper.localized(key: "CLOUD_SERVICES")
+        app.cells.staticTexts[cloudServices].tap()
+        XCTAssertNotNil(app.navigationBars[cloudServices])
+    }
+
+    func testNavigationToDownloads() {
+        moreTab.tap()
+
+        let downloads = helper.localized(key: "DOWNLOAD_FROM_HTTP")
+        app.cells.staticTexts[downloads].tap()
+        XCTAssertNotNil(app.navigationBars[downloads])
+    }
+
+    func testNavigationToNetworkStream() {
+        moreTab.tap()
+
+        let network = helper.localized(key: "OPEN_NETWORK")
+        app.cells.staticTexts[network].tap()
+        XCTAssertNotNil(app.navigationBars[network])
+    }
+
+    func testNavigationToAbout() {
+        moreTab.tap()
+
+        let about = helper.localized(key: "ABOUT_APP")
+        app.cells.staticTexts[about].tap()
+        XCTAssertNotNil(app.navigationBars[about])
+    }
+}

+ 95 - 0
VLC for iOSUITests/VLCiOSTestVideoCodecs.swift

@@ -0,0 +1,95 @@
+/*****************************************************************************
+ * VLCiOSTestVideoCodecs.swift
+ * VLC for iOSUITests
+ *****************************************************************************
+ * Copyright (c) 2018 VideoLAN. All rights reserved.
+ * $Id$
+ *
+ * Authors: Mike JS. Choi <mkchoi212 # icloud.com>
+ *
+ * Refer to the COPYING file of the official project for license.
+ *****************************************************************************/
+
+import Foundation
+import XCTest
+
+class VLCiOSTestVideoCodecs: XCTestCase {
+    let app = XCUIApplication()
+    let helper = LocaleHelper(lang: deviceLanguage, target: VLCiOSTestVideoCodecs.self)
+    let moreTab = XCUIApplication().tabBars.buttons.element(boundBy: 4)
+
+    override func setUp() {
+        super.setUp()
+
+        XCUIDevice.shared.orientation = .portrait
+        setupSnapshot(app)
+        app.launch()
+    }
+
+    func testDownload() {
+        download(name: "http://jell.yfish.us/media/jellyfish-10-mbps-hd-h264.mkv")
+        app.tabBars.buttons["Video"].tap()
+        app.collectionViews.cells.element(boundBy: 0).tap()
+        app.navigationBars["VLCMovieView"].buttons[helper.localized(key: "VIDEO_ASPECT_RATIO_BUTTON")].tap()
+        snapshot("playback")
+    }
+
+    func testMovCodec() {
+        stream(named: "rtsp://184.72.239.149/vod/mp4:BigBuckBunny_175k.mov")
+    }
+
+    func testHEVCCodec10b() {
+        stream(named: "http://jell.yfish.us/media/jellyfish-90-mbps-hd-hevc-10bit.mkv")
+    }
+
+    func testHEVCCodec() {
+        stream(named: "http://jell.yfish.us/media/jellyfish-25-mbps-hd-hevc.mkv")
+    }
+
+    func testH264Codec() {
+        stream(named: "http://jell.yfish.us/media/jellyfish-25-mbps-hd-h264.mkv")
+    }
+
+    func download(name fileName: String) {
+        moreTab.tap()
+        app.staticTexts[helper.localized(key: "DOWNLOAD_FROM_HTTP")].tap()
+
+        let downloadTextfield = app.textFields["http://myserver.com/file.mkv"]
+        downloadTextfield.clearAndEnter(text: fileName)
+        app.buttons[helper.localized(key: "BUTTON_DOWNLOAD")].tap()
+
+        let cancelDownloadButton = app.buttons["flatDeleteButton"]
+        let predicate = NSPredicate(format: "exists == 0")
+        expectation(for: predicate, evaluatedWith: cancelDownloadButton, handler: nil)
+
+        waitForExpectations(timeout: 20.0) { err in
+            XCTAssertNil(err)
+            downloadTextfield.typeText("\n")
+        }
+    }
+
+    func stream(named fileName: String) {
+        moreTab.tap()
+        app.staticTexts[helper.localized(key: "OPEN_NETWORK")].tap()
+
+        let addressTextField = app.textFields["http://myserver.com/file.mkv"]
+        addressTextField.clearAndEnter(text: fileName)
+
+        app.buttons[helper.localized(key: "OPEN_NETWORK")].tap()
+
+        let displayTime = app.navigationBars["VLCMovieView"].buttons["--:--"]
+        let zeroPredicate = NSPredicate(format: "exists == 0")
+        expectation(for: zeroPredicate, evaluatedWith: displayTime, handler: nil)
+
+        waitForExpectations(timeout: 20.0) { err in
+            XCTAssertNil(err)
+            if !(self.app.buttons[self.helper.localized(key: "BUTTON_DONE")].exists) {
+                self.app.otherElements[self.helper.localized(key: "VO_VIDEOPLAYER_TITLE")].tap()
+            }
+            let playPause = self.app.buttons[self.helper.localized(key: "PLAY_PAUSE_BUTTON")]
+            let onePredicate = NSPredicate(format: "exists == 1")
+            self.expectation(for: onePredicate, evaluatedWith: playPause, handler: nil)
+            self.waitForExpectations(timeout: 20.0, handler: nil)
+        }
+    }
+}

+ 30 - 0
VLC for iOSUITests/XCUIElement+Helpers.swift

@@ -0,0 +1,30 @@
+/*****************************************************************************
+ * XCUIElement+Helpers.swift
+ * VLC for iOSUITests
+ *****************************************************************************
+ * Copyright (c) 2018 VideoLAN. All rights reserved.
+ * $Id$
+ *
+ * Authors: Mike JS. Choi <mkchoi212 # icloud.com>
+ *
+ * Refer to the COPYING file of the official project for license.
+ *****************************************************************************/
+
+import Foundation
+import XCTest
+
+extension XCUIElement {
+    func clearAndEnter(text: String) {
+        guard let stringValue = self.value as? String else {
+            XCTFail("Tried to clear and enter text into a non string value")
+            return
+        }
+
+        tap()
+
+        let deleteString = stringValue.map { _ in XCUIKeyboardKey.delete.rawValue }.joined(separator: "")
+
+        typeText(deleteString)
+        typeText(text)
+    }
+}

+ 50 - 8
VLC.xcodeproj/project.pbxproj

@@ -27,7 +27,6 @@
 		417E686C1F307D8F00DB9BB2 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 417E68711F307D8F00DB9BB2 /* InfoPlist.strings */; };
 		417E68B91F321EFF00DB9BB2 /* VLCActivityViewControllerVendor.m in Sources */ = {isa = PBXBuildFile; fileRef = 417E68B81F321EFF00DB9BB2 /* VLCActivityViewControllerVendor.m */; };
 		4184AA151A5492070063DF5A /* VLCCloudStorageController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4184AA141A5492070063DF5A /* VLCCloudStorageController.m */; };
-		4187112B1F78F87200317B1A /* VLC_for_iOSTestVideoCodecs.m in Sources */ = {isa = PBXBuildFile; fileRef = 4187112A1F78F87200317B1A /* VLC_for_iOSTestVideoCodecs.m */; };
 		418B144720179C00000447AA /* MediaViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 418B144620179C00000447AA /* MediaViewController.swift */; };
 		418B144D20179C75000447AA /* VLCTabBarCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 418B144C20179C74000447AA /* VLCTabBarCoordinator.swift */; };
 		418B145020179CB9000447AA /* LayoutAnchorContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 418B144F20179CB9000447AA /* LayoutAnchorContainer.swift */; };
@@ -38,7 +37,6 @@
 		419A2C661F37A4B70069D224 /* VLCStringsForLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 419A2C651F37A4B70069D224 /* VLCStringsForLocalization.m */; };
 		419A2C681F37A4B70069D224 /* VLCStringsForLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 419A2C651F37A4B70069D224 /* VLCStringsForLocalization.m */; };
 		419D7F051F54176900AF69A2 /* VLCTimeNavigationTitleView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 419D7F041F54176900AF69A2 /* VLCTimeNavigationTitleView.xib */; };
-		41B0BC931F73EF1B0063BA26 /* VLC_for_IOSTestMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 41B0BC911F73EF1B0063BA26 /* VLC_for_IOSTestMenu.m */; };
 		41B93C011A53833B00102E8B /* VLCProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = 41B93C001A53833B00102E8B /* VLCProgressView.m */; };
 		41B93C051A53835300102E8B /* VLCCloudServiceCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 41B93C031A53835300102E8B /* VLCCloudServiceCell.m */; };
 		41B93C081A53853B00102E8B /* VLCCloudServiceCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 41B93C071A53853B00102E8B /* VLCCloudServiceCell.xib */; };
@@ -246,7 +244,13 @@
 		9BADAF45185FBD9D00108BD8 /* VLCFrostedGlasView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BADAF44185FBD9D00108BD8 /* VLCFrostedGlasView.m */; };
 		9BE4D1CE183D76950006346C /* VLCCloudStorageTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D3784B0183A990F009EE944 /* VLCCloudStorageTableViewCell.m */; };
 		A79246C8170F11DF0036AAF2 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A79246C6170F11DF0036AAF2 /* Localizable.strings */; };
-		CAF76D8E20709BE500E2AD7B /* SnapshotHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAF76D8D20709BE400E2AD7B /* SnapshotHelper.swift */; };
+		CAA0B0ED2072651000B9274E /* VLCiOSTestMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAF76D8F20709C4100E2AD7B /* VLCiOSTestMenu.swift */; };
+		CAA0B0EE2072651500B9274E /* SnapshotHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAF76D8D20709BE400E2AD7B /* SnapshotHelper.swift */; };
+		CAA0B0EF2072651800B9274E /* VLCiOSTestVideoCodecs.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAF76D9120709C7000E2AD7B /* VLCiOSTestVideoCodecs.swift */; };
+		CAA0B0F02072651A00B9274E /* XCUIElement+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAF76D9320709C9500E2AD7B /* XCUIElement+Helpers.swift */; };
+		CAA0B0F52072686E00B9274E /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A79246C6170F11DF0036AAF2 /* Localizable.strings */; };
+		CAA0B0F720726A0E00B9274E /* LocaleHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAA0B0F620726A0E00B9274E /* LocaleHelper.swift */; };
+		CAF76D9520709CDE00E2AD7B /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A79246C6170F11DF0036AAF2 /* Localizable.strings */; };
 		CC1BBC461704938300A20CBF /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CC1BBC451704938300A20CBF /* libiconv.dylib */; };
 		CC1BBC4C1704939B00A20CBF /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CC1BBC4B1704939B00A20CBF /* libsqlite3.dylib */; };
 		CC1BBC4E170493A300A20CBF /* libbz2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CC1BBC4D170493A300A20CBF /* libbz2.dylib */; };
@@ -535,7 +539,6 @@
 		417E68B81F321EFF00DB9BB2 /* VLCActivityViewControllerVendor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCActivityViewControllerVendor.m; sourceTree = "<group>"; };
 		4184AA131A5492070063DF5A /* VLCCloudStorageController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCCloudStorageController.h; path = Sources/VLCCloudStorageController.h; sourceTree = SOURCE_ROOT; };
 		4184AA141A5492070063DF5A /* VLCCloudStorageController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCCloudStorageController.m; path = Sources/VLCCloudStorageController.m; sourceTree = SOURCE_ROOT; };
-		4187112A1F78F87200317B1A /* VLC_for_iOSTestVideoCodecs.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLC_for_iOSTestVideoCodecs.m; sourceTree = "<group>"; };
 		418B144620179C00000447AA /* MediaViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MediaViewController.swift; path = Sources/MediaViewController.swift; sourceTree = SOURCE_ROOT; };
 		418B144C20179C74000447AA /* VLCTabBarCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = VLCTabBarCoordinator.swift; path = Sources/VLCTabBarCoordinator.swift; sourceTree = SOURCE_ROOT; };
 		418B144F20179CB9000447AA /* LayoutAnchorContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LayoutAnchorContainer.swift; path = Sources/LayoutAnchorContainer.swift; sourceTree = "<group>"; };
@@ -547,7 +550,6 @@
 		419D7F041F54176900AF69A2 /* VLCTimeNavigationTitleView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = VLCTimeNavigationTitleView.xib; path = Resources/VLCTimeNavigationTitleView.xib; sourceTree = SOURCE_ROOT; };
 		41B0BC861F73ED7D0063BA26 /* VLC for iOSUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "VLC for iOSUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
 		41B0BC8A1F73ED7D0063BA26 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
-		41B0BC911F73EF1B0063BA26 /* VLC_for_IOSTestMenu.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLC_for_IOSTestMenu.m; sourceTree = "<group>"; };
 		41B93BFF1A53833B00102E8B /* VLCProgressView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCProgressView.h; path = Sources/VLCProgressView.h; sourceTree = SOURCE_ROOT; };
 		41B93C001A53833B00102E8B /* VLCProgressView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCProgressView.m; path = Sources/VLCProgressView.m; sourceTree = SOURCE_ROOT; };
 		41B93C021A53835300102E8B /* VLCCloudServiceCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCCloudServiceCell.h; path = Sources/VLCCloudServiceCell.h; sourceTree = SOURCE_ROOT; };
@@ -943,7 +945,11 @@
 		A79246C9170F11E40036AAF2 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = "<group>"; };
 		AC40202FFE42CEDCEB37E50D /* Pods-VLC-tvOS.distribution.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VLC-tvOS.distribution.xcconfig"; path = "Pods/Target Support Files/Pods-VLC-tvOS/Pods-VLC-tvOS.distribution.xcconfig"; sourceTree = "<group>"; };
 		C6872E7B396534F3DAF4E48F /* Pods-VLC-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VLC-iOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-VLC-iOS/Pods-VLC-iOS.release.xcconfig"; sourceTree = "<group>"; };
+		CAA0B0F620726A0E00B9274E /* LocaleHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocaleHelper.swift; sourceTree = "<group>"; };
 		CAF76D8D20709BE400E2AD7B /* SnapshotHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SnapshotHelper.swift; path = fastlane/SnapshotHelper.swift; sourceTree = SOURCE_ROOT; };
+		CAF76D8F20709C4100E2AD7B /* VLCiOSTestMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VLCiOSTestMenu.swift; sourceTree = "<group>"; };
+		CAF76D9120709C7000E2AD7B /* VLCiOSTestVideoCodecs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VLCiOSTestVideoCodecs.swift; sourceTree = "<group>"; };
+		CAF76D9320709C9500E2AD7B /* XCUIElement+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "XCUIElement+Helpers.swift"; sourceTree = "<group>"; };
 		CC1BBC451704938300A20CBF /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; };
 		CC1BBC471704938B00A20CBF /* libstdc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libstdc++.dylib"; path = "usr/lib/libstdc++.dylib"; sourceTree = SDKROOT; };
 		CC1BBC491704939300A20CBF /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
@@ -1229,10 +1235,12 @@
 		41B0BC871F73ED7D0063BA26 /* VLC for iOSUITests */ = {
 			isa = PBXGroup;
 			children = (
-				4187112A1F78F87200317B1A /* VLC_for_iOSTestVideoCodecs.m */,
-				41B0BC911F73EF1B0063BA26 /* VLC_for_IOSTestMenu.m */,
 				41B0BC8A1F73ED7D0063BA26 /* Info.plist */,
 				CAF76D8D20709BE400E2AD7B /* SnapshotHelper.swift */,
+				CAF76D8F20709C4100E2AD7B /* VLCiOSTestMenu.swift */,
+				CAF76D9120709C7000E2AD7B /* VLCiOSTestVideoCodecs.swift */,
+				CAA0B0F620726A0E00B9274E /* LocaleHelper.swift */,
+				CAF76D9320709C9500E2AD7B /* XCUIElement+Helpers.swift */,
 			);
 			path = "VLC for iOSUITests";
 			sourceTree = "<group>";
@@ -2631,6 +2639,7 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				CAA0B0F52072686E00B9274E /* Localizable.strings in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2670,6 +2679,7 @@
 				6B4E33D11BF2A39400A35255 /* playerControl.css in Resources */,
 				7D405EE21BEA1FAD006ED886 /* index.html in Resources */,
 				7D51B3B11BF0EEF4005AF4D5 /* VLCPlaybackInfoMediaInfoTVViewController.xib in Resources */,
+				CAF76D9520709CDE00E2AD7B /* Localizable.strings in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2911,6 +2921,39 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
+		F7403765A53B71CD3E9EF429 /* [CP] Check Pods Manifest.lock */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+				"${PODS_ROOT}/Manifest.lock",
+			);
+			name = "[CP] Check Pods Manifest.lock";
+			outputPaths = (
+				"$(DERIVED_FILE_DIR)/Pods-VLC-watchOS-Extension-checkManifestLockResult.txt",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+			showEnvVarsInLog = 0;
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		41B0BC821F73ED7D0063BA26 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				CAA0B0F720726A0E00B9274E /* LocaleHelper.swift in Sources */,
+				CAA0B0EF2072651800B9274E /* VLCiOSTestVideoCodecs.swift in Sources */,
+				CAA0B0F02072651A00B9274E /* XCUIElement+Helpers.swift in Sources */,
+				CAA0B0ED2072651000B9274E /* VLCiOSTestMenu.swift in Sources */,
+				CAA0B0EE2072651500B9274E /* SnapshotHelper.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 		7D1329391BA1F10100BE647E /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
@@ -3009,7 +3052,6 @@
 				7D3E528B1BD7B5E100309D15 /* VLCCloudServicesTVViewController.m in Sources */,
 				DD9D8F6B1C01FE5B00B4060F /* VLCPlaybackInfoCollectionViewDataSource.m in Sources */,
 				7D405ED41BEA150C006ED886 /* VLCActivityManager.m in Sources */,
-				CAF76D8E20709BE500E2AD7B /* SnapshotHelper.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

+ 0 - 2
fastlane/SnapshotHelper.swift

@@ -276,6 +276,4 @@ private extension CGFloat {
     }
 }
 
-// Please don't remove the lines below
-// They are used to detect outdated configuration files
 // SnapshotHelperVersion [1.10]