Lines Matching refs:self
143 def __init__(self, path, content):
144 self.path = Path(path)
145 self.content = content
146 self._preserved = None
148 def __enter__(self):
150 self._preserved = self.path.read_bytes()
152 self._preserved = None
153 self.path.write_text(self.content, encoding="utf-16")
155 def __exit__(self, *exc_info):
156 if self._preserved is None:
157 self.path.unlink()
159 self.path.write_bytes(self._preserved)
206 def get_py_exe(self):
207 if not self.py_exe:
208 self.py_exe = self.find_py()
209 return self.py_exe
211 def run_py(self, args, env=None, allow_fail=False, expect_returncode=0, argv=None):
212 if not self.py_exe:
213 self.py_exe = self.find_py()
224 argv = [self.py_exe, *args]
228 executable=self.py_exe,
239 print([self.py_exe, *args])
245 raise subprocess.CalledProcessError(p.returncode, [self.py_exe, *args], out, err)
247 self.assertEqual(expect_returncode, p.returncode)
257 def py_ini(self, content):
265 def script(self, content, encoding="utf-8"):
274 def fake_venv(self):
302 def test_version(self):
303 data = self.run_py(["-0"])
304 self.assertEqual(self.py_exe, Path(data["argv0"]))
305 self.assertEqual(sys.version.partition(" ")[0], data["version"])
307 def test_help_option(self):
308 data = self.run_py(["-h"])
309 self.assertEqual("True", data["SearchInfo.help"])
311 def test_list_option(self):
318 with self.subTest(opt):
319 data = self.run_py([opt])
320 self.assertEqual(v1, data["SearchInfo.list"])
321 self.assertEqual(v2, data["SearchInfo.listPaths"])
323 def test_list(self):
324 data = self.run_py(["--list"])
341 self.assertDictEqual(expect, actual)
348 def test_list_paths(self):
349 data = self.run_py(["--list-paths"])
375 self.assertDictEqual(expect, actual)
382 def test_filter_to_company(self):
384 data = self.run_py([f"-V:{company}/"])
385 self.assertEqual("X.Y.exe", data["LaunchCommand"])
386 self.assertEqual(company, data["env.company"])
387 self.assertEqual("3.100", data["env.tag"])
389 def test_filter_to_company_with_default(self):
391 data = self.run_py([f"-V:{company}/"], env=dict(PY_PYTHON="3.0"))
392 self.assertEqual("X.Y.exe", data["LaunchCommand"])
393 self.assertEqual(company, data["env.company"])
394 self.assertEqual("3.100", data["env.tag"])
396 def test_filter_to_tag(self):
398 data = self.run_py([f"-V:3.100"])
399 self.assertEqual("X.Y.exe", data["LaunchCommand"])
400 self.assertEqual(company, data["env.company"])
401 self.assertEqual("3.100", data["env.tag"])
403 data = self.run_py([f"-V:3.100-32"])
404 self.assertEqual("X.Y-32.exe", data["LaunchCommand"])
405 self.assertEqual(company, data["env.company"])
406 self.assertEqual("3.100-32", data["env.tag"])
408 data = self.run_py([f"-V:3.100-arm64"])
409 self.assertEqual("X.Y-arm64.exe -X fake_arg_for_test", data["LaunchCommand"])
410 self.assertEqual(company, data["env.company"])
411 self.assertEqual("3.100-arm64", data["env.tag"])
413 def test_filter_to_company_and_tag(self):
415 data = self.run_py([f"-V:{company}/3.1"], expect_returncode=103)
417 data = self.run_py([f"-V:{company}/3.100"])
418 self.assertEqual("X.Y.exe", data["LaunchCommand"])
419 self.assertEqual(company, data["env.company"])
420 self.assertEqual("3.100", data["env.tag"])
422 def test_filter_with_single_install(self):
424 data = self.run_py(
430 def test_search_major_3(self):
432 data = self.run_py(["-3"], allow_fail=True)
435 self.assertEqual("PythonCore", data["env.company"])
436 self.assertTrue(data["env.tag"].startswith("3."), data["env.tag"])
438 def test_search_major_3_32(self):
440 data = self.run_py(["-3-32"], allow_fail=True)
445 self.assertEqual("PythonCore", data["env.company"])
446 self.assertTrue(data["env.tag"].startswith("3."), data["env.tag"])
447 self.assertTrue(data["env.tag"].endswith("-32"), data["env.tag"])
449 def test_search_major_2(self):
451 data = self.run_py(["-2"], allow_fail=True)
455 self.assertEqual("PythonCore", data["env.company"])
456 self.assertTrue(data["env.tag"].startswith("2."), data["env.tag"])
458 def test_py_default(self):
459 with self.py_ini(TEST_PY_DEFAULTS):
460 data = self.run_py(["-arg"])
461 self.assertEqual("PythonTestSuite", data["SearchInfo.company"])
462 self.assertEqual("3.100", data["SearchInfo.tag"])
463 self.assertEqual("X.Y.exe -arg", data["stdout"].strip())
465 def test_py2_default(self):
466 with self.py_ini(TEST_PY_DEFAULTS):
467 data = self.run_py(["-2", "-arg"])
468 self.assertEqual("PythonTestSuite", data["SearchInfo.company"])
469 self.assertEqual("3.100-32", data["SearchInfo.tag"])
470 self.assertEqual("X.Y-32.exe -arg", data["stdout"].strip())
472 def test_py3_default(self):
473 with self.py_ini(TEST_PY_DEFAULTS):
474 data = self.run_py(["-3", "-arg"])
475 self.assertEqual("PythonTestSuite", data["SearchInfo.company"])
476 self.assertEqual("3.100-arm64", data["SearchInfo.tag"])
477 self.assertEqual("X.Y-arm64.exe -X fake_arg_for_test -arg", data["stdout"].strip())
479 def test_py_default_env(self):
480 data = self.run_py(["-arg"], env=TEST_PY_ENV)
481 self.assertEqual("PythonTestSuite", data["SearchInfo.company"])
482 self.assertEqual("3.100", data["SearchInfo.tag"])
483 self.assertEqual("X.Y.exe -arg", data["stdout"].strip())
485 def test_py2_default_env(self):
486 data = self.run_py(["-2", "-arg"], env=TEST_PY_ENV)
487 self.assertEqual("PythonTestSuite", data["SearchInfo.company"])
488 self.assertEqual("3.100-32", data["SearchInfo.tag"])
489 self.assertEqual("X.Y-32.exe -arg", data["stdout"].strip())
491 def test_py3_default_env(self):
492 data = self.run_py(["-3", "-arg"], env=TEST_PY_ENV)
493 self.assertEqual("PythonTestSuite", data["SearchInfo.company"])
494 self.assertEqual("3.100-arm64", data["SearchInfo.tag"])
495 self.assertEqual("X.Y-arm64.exe -X fake_arg_for_test -arg", data["stdout"].strip())
497 def test_py_default_short_argv0(self):
498 with self.py_ini(TEST_PY_DEFAULTS):
500 with self.subTest(argv0):
501 data = self.run_py(["--version"], argv=f'{argv0} --version')
502 self.assertEqual("PythonTestSuite", data["SearchInfo.company"])
503 self.assertEqual("3.100", data["SearchInfo.tag"])
504 self.assertEqual(f'X.Y.exe --version', data["stdout"].strip())
506 def test_py_default_in_list(self):
507 data = self.run_py(["-0"], env=TEST_PY_ENV)
514 self.assertEqual("PythonTestSuite/3.100", default)
516 def test_virtualenv_in_list(self):
517 with self.fake_venv() as (venv_exe, env):
518 data = self.run_py(["-0p"], env=env)
522 self.assertEqual(str(venv_exe), m.group(1))
525 self.fail("did not find active venv path")
527 data = self.run_py(["-0"], env=env)
531 self.assertEqual("Active venv", m.group(1))
534 self.fail("did not find active venv entry")
536 def test_virtualenv_with_env(self):
537 with self.fake_venv() as (venv_exe, env):
538 data1 = self.run_py([], env={**env, "PY_PYTHON": "PythonTestSuite/3"})
539 data2 = self.run_py(["-V:PythonTestSuite/3"], env={**env, "PY_PYTHON": "PythonTestSuite/3"})
541 self.assertEqual(data1["stdout"].strip(), str(venv_exe))
542 self.assertEqual(data1["SearchInfo.lowPriorityTag"], "True")
544 self.assertNotEqual(data2["stdout"].strip(), str(venv_exe))
545 self.assertNotEqual(data2["SearchInfo.lowPriorityTag"], "True")
547 def test_py_shebang(self):
548 with self.py_ini(TEST_PY_DEFAULTS):
549 with self.script("#! /usr/bin/python -prearg") as script:
550 data = self.run_py([script, "-postarg"])
551 self.assertEqual("PythonTestSuite", data["SearchInfo.company"])
552 self.assertEqual("3.100", data["SearchInfo.tag"])
553 self.assertEqual(f"X.Y.exe -prearg {script} -postarg", data["stdout"].strip())
555 def test_python_shebang(self):
556 with self.py_ini(TEST_PY_DEFAULTS):
557 with self.script("#! python -prearg") as script:
558 data = self.run_py([script, "-postarg"])
559 self.assertEqual("PythonTestSuite", data["SearchInfo.company"])
560 self.assertEqual("3.100", data["SearchInfo.tag"])
561 self.assertEqual(f"X.Y.exe -prearg {script} -postarg", data["stdout"].strip())
563 def test_py2_shebang(self):
564 with self.py_ini(TEST_PY_DEFAULTS):
565 with self.script("#! /usr/bin/python2 -prearg") as script:
566 data = self.run_py([script, "-postarg"])
567 self.assertEqual("PythonTestSuite", data["SearchInfo.company"])
568 self.assertEqual("3.100-32", data["SearchInfo.tag"])
569 self.assertEqual(f"X.Y-32.exe -prearg {script} -postarg", data["stdout"].strip())
571 def test_py3_shebang(self):
572 with self.py_ini(TEST_PY_DEFAULTS):
573 with self.script("#! /usr/bin/python3 -prearg") as script:
574 data = self.run_py([script, "-postarg"])
575 self.assertEqual("PythonTestSuite", data["SearchInfo.company"])
576 self.assertEqual("3.100-arm64", data["SearchInfo.tag"])
577 self.assertEqual(f"X.Y-arm64.exe -X fake_arg_for_test -prearg {script} -postarg", data["stdout"].strip())
579 def test_py_shebang_nl(self):
580 with self.py_ini(TEST_PY_DEFAULTS):
581 with self.script("#! /usr/bin/python -prearg\n") as script:
582 data = self.run_py([script, "-postarg"])
583 self.assertEqual("PythonTestSuite", data["SearchInfo.company"])
584 self.assertEqual("3.100", data["SearchInfo.tag"])
585 self.assertEqual(f"X.Y.exe -prearg {script} -postarg", data["stdout"].strip())
587 def test_py2_shebang_nl(self):
588 with self.py_ini(TEST_PY_DEFAULTS):
589 with self.script("#! /usr/bin/python2 -prearg\n") as script:
590 data = self.run_py([script, "-postarg"])
591 self.assertEqual("PythonTestSuite", data["SearchInfo.company"])
592 self.assertEqual("3.100-32", data["SearchInfo.tag"])
593 self.assertEqual(f"X.Y-32.exe -prearg {script} -postarg", data["stdout"].strip())
595 def test_py3_shebang_nl(self):
596 with self.py_ini(TEST_PY_DEFAULTS):
597 with self.script("#! /usr/bin/python3 -prearg\n") as script:
598 data = self.run_py([script, "-postarg"])
599 self.assertEqual("PythonTestSuite", data["SearchInfo.company"])
600 self.assertEqual("3.100-arm64", data["SearchInfo.tag"])
601 self.assertEqual(f"X.Y-arm64.exe -X fake_arg_for_test -prearg {script} -postarg", data["stdout"].strip())
603 def test_py_shebang_short_argv0(self):
604 with self.py_ini(TEST_PY_DEFAULTS):
605 with self.script("#! /usr/bin/python -prearg") as script:
607 data = self.run_py([script, "-postarg"], argv=f'"py.exe" "{script}" -postarg')
608 self.assertEqual("PythonTestSuite", data["SearchInfo.company"])
609 self.assertEqual("3.100", data["SearchInfo.tag"])
610 self.assertEqual(f'X.Y.exe -prearg "{script}" -postarg', data["stdout"].strip())
612 def test_py_handle_64_in_ini(self):
613 with self.py_ini("\n".join(["[defaults]", "python=3.999-64"])):
615 data = self.run_py([], allow_fail=True, expect_returncode=103)
616 self.assertEqual("3.999-64", data["SearchInfo.tag"])
617 self.assertEqual("True", data["SearchInfo.oldStyleTag"])
619 def test_search_path(self):
621 with self.py_ini(TEST_PY_DEFAULTS):
622 with self.script(f"#! /usr/bin/env {stem} -prearg") as script:
623 data = self.run_py(
627 self.assertEqual(f"{sys.executable} -prearg {script} -postarg", data["stdout"].strip())
629 def test_search_path_exe(self):
632 with self.py_ini(TEST_PY_DEFAULTS):
633 with self.script(f"#! /usr/bin/env {name} -prearg") as script:
634 data = self.run_py(
638 self.assertEqual(f"{sys.executable} -prearg {script} -postarg", data["stdout"].strip())
640 def test_recursive_search_path(self):
641 stem = self.get_py_exe().stem
642 with self.py_ini(TEST_PY_DEFAULTS):
643 with self.script(f"#! /usr/bin/env {stem}") as script:
644 data = self.run_py(
646 env={"PATH": f"{self.get_py_exe().parent};{os.getenv('PATH')}"},
649 self.assertEqual(f"X.Y.exe {script}", data["stdout"].strip())
651 def test_install(self):
652 data = self.run_py(["-V:3.10"], env={"PYLAUNCHER_ALWAYS_INSTALL": "1"}, expect_returncode=111)
659 self.assertIn("ms-windows-store://", cmd)
661 self.assertIn("winget.exe", cmd)
663 self.assertIn("9PJPW5LDXLZ5", cmd)
665 def test_literal_shebang_absolute(self):
666 with self.script(f"#! C:/some_random_app -witharg") as script:
667 data = self.run_py([script])
668 self.assertEqual(
673 def test_literal_shebang_relative(self):
674 with self.script(f"#! ..\\some_random_app -witharg") as script:
675 data = self.run_py([script])
676 self.assertEqual(
681 def test_literal_shebang_quoted(self):
682 with self.script(f'#! "some random app" -witharg') as script:
683 data = self.run_py([script])
684 self.assertEqual(
689 with self.script(f'#! some" random "app -witharg') as script:
690 data = self.run_py([script])
691 self.assertEqual(
696 def test_literal_shebang_quoted_escape(self):
697 with self.script(f'#! some\\" random "app -witharg') as script:
698 data = self.run_py([script])
699 self.assertEqual(
704 def test_literal_shebang_command(self):
705 with self.py_ini(TEST_PY_COMMANDS):
706 with self.script('#! test-command arg1') as script:
707 data = self.run_py([script])
708 self.assertEqual(
713 def test_literal_shebang_invalid_template(self):
714 with self.script('#! /usr/bin/not-python arg1') as script:
715 data = self.run_py([script])
717 self.assertEqual(