Files TS: TS migration script improvements

Change the build file to have the desired TS path commented out, then
change the script to uncomment those lines.  This should avoid the git
conflict on concurrent CLs.

For integration tests, add the desired test registration on testcase.ts,
using the same approach with commented lines and the script
un-commenting them.

Bug: b:319188711, b:319189127
Change-Id: I8354c928479c3e85e3fc9d73539e06e5c6cc0708
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5267201
Commit-Queue: Luciano Pacheco <[email protected]>
Reviewed-by: Wenbo Jie <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1256092}
diff --git a/ui/file_manager/base/js/convert_to_ts.py b/ui/file_manager/base/js/convert_to_ts.py
index 64d430b2..cb458cfc 100644
--- a/ui/file_manager/base/js/convert_to_ts.py
+++ b/ui/file_manager/base/js/convert_to_ts.py
@@ -455,12 +455,18 @@
 
             # Replace .js with .ts inplace for Image Loader.
             if f'"{js_file_name.name}",' in line.strip():
-              l = line.replace('.js',  '.ts', 1)
-              new_file.append(l)
-              continue
+                l = line.replace('.js',  '.ts', 1)
+                new_file.append(l)
+                continue
 
             new_file.append(line)
 
+    if 'integration_tests/' in str(from_root):
+        js_str_name = str(js_file_name.absolute().relative_to(build_file_name.parent))
+        js_str_name = js_str_name.replace('.js', '.ts')
+        anchor = 'ts_files = [\n'
+        find_and_uncomment(new_file, anchor, js_str_name)
+
     return new_file
 
 
@@ -478,8 +484,10 @@
     anchor = 'ts_files = [\n'
     if js_str_name.endswith('unittest.js'):
         anchor = 'ts_test_files = [\n'
-    if 'image_loader/' in js_str_name:
-        anchor = 'image_loader_ts = [\n'
+    if 'integration_tests/' in str(gni_file):
+        anchor = None
+    elif 'image_loader/' in js_str_name:
+        anchor = None
 
     with gni_file.open() as f:
         for line in f.readlines():
@@ -491,9 +499,35 @@
             if line == anchor:
                 new_file.append(ts_line)
 
+    if 'image_loader/' in js_str_name:
+        anchor = 'image_loader_ts = [\n'
+        ts_str_name = js_str_name.replace('.js', '.ts')
+        find_and_uncomment(new_file, anchor, ts_str_name)
+
     return new_file
 
 
+def find(lines, pattern):
+    for idx, line in enumerate(lines):
+        if pattern in line:
+            return idx
+
+    return -1
+
+
+def find_and_uncomment(lines, anchor, ts_fname):
+    """Finds the line with `ts_fname` and uncomment.
+    It updates the `lines` in-place.
+    """
+    idx_start = find(lines, anchor)
+    idx_end = idx_start + find(lines[idx_start:], ']')
+    idx_fname = idx_start + find(lines[idx_start:idx_end], f'# "{ts_fname}"')
+    line = lines[idx_fname]
+    # Uncomment the line.
+    line = line.replace('# ', '', 1)
+    lines[idx_fname] = line
+
+
 def to_build_file(js_fname):
     """Converts the `js_fname` path to its sibling BUILD.gn."""
     return Path(js_fname).with_name('BUILD.gn')
@@ -525,7 +559,7 @@
     return ret
 
 
-#### End of Build file conversions:
+#### End of Build file conversions.
 
 
 def replace_file(fname, content):
@@ -556,6 +590,35 @@
         return ''
 
 
+def register_testcase(js_file_name):
+    # Lines:
+    # 1. Import line
+    # 2. Spread assigning to the `testcase` namespace.
+
+    namespace_re = re.compile(r"import \* as (\w+) from '[\w\/.]+';")
+    js_import_path = js_file_name.absolute().relative_to(_INTEGRATION_TESTS_ROOT)
+    import_line_pattern = f"from './{js_import_path}';"
+    testcase_path = _INTEGRATION_TESTS_ROOT.joinpath('testcase.ts')
+    lines = list(open(testcase_path).readlines())
+    import_idx = find(lines, import_line_pattern)
+    if import_idx == -1:
+        return
+
+    import_line = lines[import_idx]
+    lines[import_idx] = import_line.replace('// ', '');
+    try:
+        namespace_name = namespace_re.findall(import_line)[0]
+    except IndexError:
+        namespace_name = ''
+    if namespace_name:
+        spread_line_pattern = f" ...{namespace_name},"
+        spread_line_idx = find(lines, spread_line_pattern)
+        if spread_line_idx > -1:
+            spread_line = lines[spread_line_idx]
+            lines[spread_line_idx] = spread_line.replace('// ', '');
+
+    replace_file(testcase_path, lines)
+
 #### Start of controlling the execution of the script.
 
 
@@ -570,7 +633,8 @@
         for b in bs:
             new_build_file = process_build_file(b, js_path)
             replace_file(b, new_build_file)
-            # Remove the .js file and add it to the `ts_files = ` section.
+            # Process as `file_names.gni` to remove the .js file and add it to
+            # the `ts_files = ` section.
             if b == _INTEGRATION_TESTS_ROOT.joinpath('BUILD.gn'):
               new_build_file = process_file_names_gni(js_path.absolute(), b)
               replace_file(b, new_build_file)
@@ -583,12 +647,16 @@
                 js_path.absolute(), file_names)
             replace_file(file_names, new_file_names_gni)
 
+        # For Integration Tests, uncomment relevant lines in the testcase.ts
+        if 'integration_tests/' in fname:
+            register_testcase(js_path)
+
         # Process the JS file content and save as JS file.
-        ts_content = process_js_file(js_path)
-        replace_file(js_path, ts_content)
+        # ts_content = process_js_file(js_path)
+        # replace_file(js_path, ts_content)
 
         # Rename to TS.
-        run_git_mv(str(js_path))
+        # run_git_mv(str(js_path))
 
 
 def main():
diff --git a/ui/file_manager/file_names.gni b/ui/file_manager/file_names.gni
index 65bae869..db33dfa 100644
--- a/ui/file_manager/file_names.gni
+++ b/ui/file_manager/file_names.gni
@@ -9,10 +9,24 @@
 ]
 
 image_loader_ts = [
-  "image_loader/scheduler.ts",
   "image_loader/background.ts",
   "image_loader/cache.ts",
+
+  # "image_loader/image_loader.ts",
+
+  # "image_loader/image_loader_client.ts",
+
+  # "image_loader/image_loader_util.ts",
+
   "image_loader/image_orientation.ts",
+
+  # "image_loader/image_request_task.ts",
+
+  # "image_loader/load_image_request.ts",
+
+  # "image_loader/piex_loader.ts",
+
+  "image_loader/scheduler.ts",
 ]
 
 static_js_files = [
diff --git a/ui/file_manager/integration_tests/BUILD.gn b/ui/file_manager/integration_tests/BUILD.gn
index 031cf49..24412a5 100644
--- a/ui/file_manager/integration_tests/BUILD.gn
+++ b/ui/file_manager/integration_tests/BUILD.gn
@@ -68,12 +68,122 @@
 ]
 
 ts_files = [
-  "file_manager/files_tooltip.ts",
-  "file_manager/android_photos.ts",
   "testcase.ts",
 
+  # "remote_call.ts",
+
+  # "test_util.ts",
+
+  # File Manager.
+  "file_manager/android_photos.ts",
+
+  # "file_manager/background.ts",
+
+  # "file_manager/breadcrumbs.ts",
+
   "file_manager/choose_entry.ts",
   "file_manager/choose_entry_const.ts",
+
+  # "file_manager/context_menu.ts",
+
+  # "file_manager/copy_between_windows.ts",
+
+  # "file_manager/create_new_folder.ts",
+
+  # "file_manager/crostini.ts",
+
+  # "file_manager/directory_tree.ts",
+
+  # "file_manager/directory_tree_context_menu.ts",
+
+  # "file_manager/dlp.ts",
+
+  # "file_manager/dlp_enterprise_connectors.ts",
+
+  # "file_manager/drive_specific.ts",
+
+  # "file_manager/file_dialog.ts",
+
+  # "file_manager/file_display.ts",
+
+  # "file_manager/file_list.ts",
+
+  # "file_manager/file_transfer_connector.ts",
+
+  "file_manager/files_tooltip.ts",
+
+  # "file_manager/folder_shortcuts.ts",
+
+  # "file_manager/format_dialog.ts",
+
+  # "file_manager/gear_menu.ts",
+
+  # "file_manager/grid_view.ts",
+
+  # "file_manager/guest_os.ts",
+
+  # "file_manager/holding_space.ts",
+
+  # "file_manager/install_linux_package_dialog.ts",
+
+  # "file_manager/keyboard_operations.ts",
+
+  # "file_manager/metadata.ts",
+
+  # "file_manager/metrics.ts",
+
+  # "file_manager/my_files.ts",
+
+  # "file_manager/navigation.ts",
+
+  # "file_manager/office.ts",
+
+  # "file_manager/open_audio_media_app.ts",
+
+  # "file_manager/open_files_in_web_drive.ts",
+
+  # "file_manager/open_image_media_app.ts",
+
+  # "file_manager/open_media_app.ts",
+
+  # "file_manager/open_sniffed_files.ts",
+
+  # "file_manager/open_video_media_app.ts",
+
+  # "file_manager/providers.ts",
+
+  # "file_manager/quick_view.ts",
+
+  # "file_manager/recents.ts",
+
+  # "file_manager/restore_prefs.ts",
+
+  # "file_manager/search.ts",
+
+  # "file_manager/share.ts",
+
+  # "file_manager/share_and_manage_dialog.ts",
+
+  # "file_manager/sort_columns.ts",
+
+  # "file_manager/tab_index.ts",
+
+  # "file_manager/tasks.ts",
+
+  # "file_manager/test_data.ts",
+
+  # "file_manager/toolbar.ts",
+
+  # "file_manager/transfer.ts",
+
+  # "file_manager/trash.ts",
+
+  # "file_manager/traverse.ts",
+
+  # "file_manager/zip_files.ts",
+
+  # Page Objects.
+  # "file_manager/page_objects/directory_tree.ts",
 ]
 
 # TS/JS files.
diff --git a/ui/file_manager/integration_tests/testcase.ts b/ui/file_manager/integration_tests/testcase.ts
index aff5a8d..222bde7 100644
--- a/ui/file_manager/integration_tests/testcase.ts
+++ b/ui/file_manager/integration_tests/testcase.ts
@@ -3,7 +3,57 @@
 // found in the LICENSE file.
 
 import * as androidPhotosTests from './file_manager/android_photos.js';
+// clang-format off
+// import * as breadcrumbsTests from './file_manager/breadcrumbs.js';
+// import * as contextMenuTests from './file_manager/context_menu.js';
+// import * as copyBetweenWindowsTests from './file_manager/copy_between_windows.js';
+// import * as createNewFolderTests from './file_manager/create_new_folder.js';
+// import * as crostiniTests from './file_manager/crostini.js';
+// import * as directoryTreeTests from './file_manager/directory_tree.js';
+// import * as directoryTreeContextMenuTests from './file_manager/directory_tree_context_menu.js';
+// import * as dlpTests from './file_manager/dlp.js';
+// import * as dlpEnterpriseConnectorsTests from './file_manager/dlp_enterprise_connectors.js';
+// import * as driveSpecificTests from './file_manager/drive_specific.js';
+// import * as fileDialogTests from './file_manager/file_dialog.js';
+// import * as fileDisplayTests from './file_manager/file_display.js';
+// import * as fileListTests from './file_manager/file_list.js';
+// import * as fileTransferConnectorTests from './file_manager/file_transfer_connector.js';
 import * as filesTooltipTests from './file_manager/files_tooltip.js';
+// import * as folderShortcutsTests from './file_manager/folder_shortcuts.js';
+// import * as formatDialogTests from './file_manager/format_dialog.js';
+// import * as gearMenuTests from './file_manager/gear_menu.js';
+// import * as gridViewTests from './file_manager/grid_view.js';
+// import * as guestOsTests from './file_manager/guest_os.js';
+// import * as holdingSpaceTests from './file_manager/holding_space.js';
+// import * as installLinuxPackageDialogTests from './file_manager/install_linux_package_dialog.js';
+// import * as keyboardOperationsTests from './file_manager/keyboard_operations.js';
+// import * as metadataTests from './file_manager/metadata.js';
+// import * as metricsTests from './file_manager/metrics.js';
+// import * as myFilesTests from './file_manager/my_files.js';
+// import * as navigationTests from './file_manager/navigation.js';
+// import * as officeTests from './file_manager/office.js';
+// import * as openAudioMediaAppTests from './file_manager/open_audio_media_app.js';
+// import * as openFilesInWebDriveTests from './file_manager/open_files_in_web_drive.js';
+// import * as openImageMediaAppTests from './file_manager/open_image_media_app.js';
+// import * as openMediaAppTests from './file_manager/open_media_app.js';
+// import * as openSniffedFilesTests from './file_manager/open_sniffed_files.js';
+// import * as openVideoMediaAppTests from './file_manager/open_video_media_app.js';
+// import * as providersTests from './file_manager/providers.js';
+// import * as quickViewTests from './file_manager/quick_view.js';
+// import * as recentsTests from './file_manager/recents.js';
+// import * as restorePrefsTests from './file_manager/restore_prefs.js';
+// import * as searchTests from './file_manager/search.js';
+// import * as shareTests from './file_manager/share.js';
+// import * as shareAndManageDialogTests from './file_manager/share_and_manage_dialog.js';
+// import * as sortColumnsTests from './file_manager/sort_columns.js';
+// import * as tabIndexTests from './file_manager/tab_index.js';
+// import * as tasksTests from './file_manager/tasks.js';
+// import * as toolbarTests from './file_manager/toolbar.js';
+// import * as transferTests from './file_manager/transfer.js';
+// import * as trashTests from './file_manager/trash.js';
+// import * as traverseTests from './file_manager/traverse.js';
+// import * as zipFilesTests from './file_manager/zip_files.js';
+// clang-format on
 
 export type TestFunctionName = string;
 export type TestFunction = (() => void)|(() => Promise<void>);
@@ -13,5 +63,53 @@
  */
 export const testcase: Record<TestFunctionName, TestFunction> = {
   ...androidPhotosTests,
+  // ...breadcrumbsTests,
+  // ...contextMenuTests,
+  // ...copyBetweenWindowsTests,
+  // ...createNewFolderTests,
+  // ...crostiniTests,
+  // ...directoryTreeTests,
+  // ...directoryTreeContextMenuTests,
+  // ...dlpTests,
+  // ...dlpEnterpriseConnectorsTests,
+  // ...driveSpecificTests,
+  // ...fileDialogTests,
+  // ...fileDisplayTests,
+  // ...fileListTests,
+  // ...fileTransferConnectorTests,
   ...filesTooltipTests,
+  // ...folderShortcutsTests,
+  // ...formatDialogTests,
+  // ...gearMenuTests,
+  // ...gridViewTests,
+  // ...guestOsTests,
+  // ...holdingSpaceTests,
+  // ...installLinuxPackageDialogTests,
+  // ...keyboardOperationsTests,
+  // ...metadataTests,
+  // ...metricsTests,
+  // ...myFilesTests,
+  // ...navigationTests,
+  // ...officeTests,
+  // ...openAudioMediaAppTests,
+  // ...openFilesInWebDriveTests,
+  // ...openImageMediaAppTests,
+  // ...openMediaAppTests,
+  // ...openSniffedFilesTests,
+  // ...openVideoMediaAppTests,
+  // ...providersTests,
+  // ...quickViewTests,
+  // ...recentsTests,
+  // ...restorePrefsTests,
+  // ...searchTests,
+  // ...shareTests,
+  // ...shareAndManageDialogTests,
+  // ...sortColumnsTests,
+  // ...tabIndexTests,
+  // ...tasksTests,
+  // ...toolbarTests,
+  // ...transferTests,
+  // ...trashTests,
+  // ...traverseTests,
+  // ...zipFilesTests,
 };