mirror of
https://github.com/rjNemo/mars-rover-kata
synced 2026-06-06 02:36:48 +00:00
part 1 functional
This commit is contained in:
parent
7fdce18e16
commit
975cbb4858
38 changed files with 2098 additions and 0 deletions
BIN
.coverage
Normal file
BIN
.coverage
Normal file
Binary file not shown.
8
.idea/.gitignore
vendored
Normal file
8
.idea/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
6
.idea/dictionaries
Normal file
6
.idea/dictionaries
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectDictionaryState">
|
||||||
|
<dictionary name="ruidy" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
25
.idea/inspectionProfiles/Project_Default.xml
Normal file
25
.idea/inspectionProfiles/Project_Default.xml
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<profile version="1.0">
|
||||||
|
<option name="myName" value="Project Default" />
|
||||||
|
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||||
|
<inspection_tool class="JSXSyntaxUsed" enabled="true" level="ERROR" enabled_by_default="true" />
|
||||||
|
<inspection_tool class="PyCompatibilityInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||||
|
<option name="ourVersions">
|
||||||
|
<value>
|
||||||
|
<list size="2">
|
||||||
|
<item index="0" class="java.lang.String" itemvalue="3.8" />
|
||||||
|
<item index="1" class="java.lang.String" itemvalue="3.9" />
|
||||||
|
</list>
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
</inspection_tool>
|
||||||
|
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||||
|
<option name="ignoredIdentifiers">
|
||||||
|
<list>
|
||||||
|
<option value="examples.work_queue.worker.sys" />
|
||||||
|
<option value="examples.work_queue.worker.BlockingChannel" />
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</inspection_tool>
|
||||||
|
</profile>
|
||||||
|
</component>
|
||||||
6
.idea/inspectionProfiles/profiles_settings.xml
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<settings>
|
||||||
|
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||||
|
<version value="1.0" />
|
||||||
|
</settings>
|
||||||
|
</component>
|
||||||
8
.idea/mars-rover.iml
Normal file
8
.idea/mars-rover.iml
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="PYTHON_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
4
.idea/misc.xml
Normal file
4
.idea/misc.xml
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9" project-jdk-type="Python SDK" />
|
||||||
|
</project>
|
||||||
8
.idea/modules.xml
Normal file
8
.idea/modules.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/mars-rover.iml" filepath="$PROJECT_DIR$/.idea/mars-rover.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
7
.idea/prettier.xml
Normal file
7
.idea/prettier.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="PrettierConfiguration">
|
||||||
|
<option name="myRunOnSave" value="true" />
|
||||||
|
<option name="myRunOnReformat" value="true" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
8
.idea/watcherTasks.xml
Normal file
8
.idea/watcherTasks.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectTasksOptions">
|
||||||
|
<enabled-global>
|
||||||
|
<option value="black" />
|
||||||
|
</enabled-global>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
11
Makefile
Normal file
11
Makefile
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
run:
|
||||||
|
pipenv run python -m rover.main
|
||||||
|
test: tests
|
||||||
|
tests:
|
||||||
|
pipenv run pytest -v --cov=. --cov-report=html
|
||||||
|
lint:
|
||||||
|
pipenv run black -l 99 .
|
||||||
|
pipenv run flake8 .
|
||||||
|
pipenv run mypy .
|
||||||
|
|
||||||
|
.PHONY: run test tests lint
|
||||||
18
Pipfile
Normal file
18
Pipfile
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
[[source]]
|
||||||
|
url = "https://pypi.org/simple"
|
||||||
|
verify_ssl = true
|
||||||
|
name = "pypi"
|
||||||
|
|
||||||
|
[packages]
|
||||||
|
|
||||||
|
[dev-packages]
|
||||||
|
pytest = "*"
|
||||||
|
pytest-cov = "*"
|
||||||
|
black = "*"
|
||||||
|
mypy = "*"
|
||||||
|
|
||||||
|
[requires]
|
||||||
|
python_version = "3.9"
|
||||||
|
|
||||||
|
[pipenv]
|
||||||
|
allow_prereleases = true
|
||||||
256
Pipfile.lock
generated
Normal file
256
Pipfile.lock
generated
Normal file
|
|
@ -0,0 +1,256 @@
|
||||||
|
{
|
||||||
|
"_meta": {
|
||||||
|
"hash": {
|
||||||
|
"sha256": "2f01db9a7ea9d9fbf733806a56ecb7cd41a930958d13ff14a9e8d161f3c08c2d"
|
||||||
|
},
|
||||||
|
"pipfile-spec": 6,
|
||||||
|
"requires": {
|
||||||
|
"python_version": "3.9"
|
||||||
|
},
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"name": "pypi",
|
||||||
|
"url": "https://pypi.org/simple",
|
||||||
|
"verify_ssl": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default": {},
|
||||||
|
"develop": {
|
||||||
|
"appdirs": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41",
|
||||||
|
"sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"
|
||||||
|
],
|
||||||
|
"version": "==1.4.4"
|
||||||
|
},
|
||||||
|
"attrs": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1",
|
||||||
|
"sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"
|
||||||
|
],
|
||||||
|
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
|
||||||
|
"version": "==21.2.0"
|
||||||
|
},
|
||||||
|
"black": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:1c7aa6ada8ee864db745b22790a32f94b2795c253a75d6d9b5e439ff10d23116",
|
||||||
|
"sha256:c8373c6491de9362e39271630b65b964607bc5c79c83783547d76c839b3aa219"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==21.7b0"
|
||||||
|
},
|
||||||
|
"click": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a",
|
||||||
|
"sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"
|
||||||
|
],
|
||||||
|
"markers": "python_version >= '3.6'",
|
||||||
|
"version": "==8.0.1"
|
||||||
|
},
|
||||||
|
"coverage": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:16db4173575901db8f3e6cc05e50fe19c7849b0256f6dc2e0979485184053417",
|
||||||
|
"sha256:18183948d5480e2ae30ad67edddf748149c778592b7e4ee649c058d5de2dcbb1",
|
||||||
|
"sha256:22888d3ce1b6fa1125f0be1602d8c634e00e7ec3a87bdb594ad87bde0b00b2b6",
|
||||||
|
"sha256:23c1611471cbfa2ac0e283862a76a333c13e5e7c4d499feb9919a5f52884610e",
|
||||||
|
"sha256:2dcc6d62b69a82759e5dddd788e09dd329124e493e62d92cfd01c0b918d7e511",
|
||||||
|
"sha256:40e30139113b141c238620b700aa5bd5c1b3a7b29ae47398936ff1c9166109d9",
|
||||||
|
"sha256:4528368196a90f11b70fb5668c13d92e88ba795eb4d37aab5855fd0479db417b",
|
||||||
|
"sha256:4cbdc51fc8c00ec6e53b30221d5757034aecf9839761bf97eaec0db7f0ff4955",
|
||||||
|
"sha256:6a585ba4087cc1fb5bfe34d1ecaaee183b854427992be2b42f1722ba8289fa82",
|
||||||
|
"sha256:79c136327e90ee46a2b3094263df94da5212890d6145678741eb805d79714971",
|
||||||
|
"sha256:7beec4df7542cf681356ef243fee3bf948775fc0d125bdcad3508e834229e07d",
|
||||||
|
"sha256:8394626a07e0a1b3695a16a4548d32e7259e00817d4bab1ef8172a1bd82a724e",
|
||||||
|
"sha256:84a1000f622d1df8824cd1ac629aa8392679c5c4de3f0de9e6889373f99ff3a0",
|
||||||
|
"sha256:91cd79f0f2996a4de737de89fdcbcd379a5bfd7b15129378ad1e5fc234e58d33",
|
||||||
|
"sha256:951e8d7bc98bceb61fc4fb426966fae854160301c0f8cd0945c62f2504f68615",
|
||||||
|
"sha256:95d2293d6a60da8952c675050231c02c9f4f1c1b9cf916315173e921d137d683",
|
||||||
|
"sha256:9981294b131023e63061ba88f4498fe27b9b15d908079d1866ee66a63d6e793f",
|
||||||
|
"sha256:a8826f6ecf079cb648534790ba59218a64e12a59bf2cd9ff00199abb39864a79",
|
||||||
|
"sha256:c1630e847ae0a2a366f18ddc3e017b69f80d729e95830579c61b5f9e9b94b91e",
|
||||||
|
"sha256:c6f46d5bbec8fe1ff25215356e819528a90d84b2801703514746b665742f1cd2",
|
||||||
|
"sha256:c8099c7033fb1ca73ac2246c3e52f45dd6a9c3826c59b3b5ad94e5be4e08d99b",
|
||||||
|
"sha256:ceb872b89c6461d4365be5f8fbf14f867be6b5217760980de7e014e54648f8ef",
|
||||||
|
"sha256:d6fbe69d52628b3e8a144265fd134f5da07cf287a00cf529730ae10380d315b2",
|
||||||
|
"sha256:da7de6e4162c69cc03cc56b7d051ae11147ac30872ff57df4ba4cac6d70ce5d9",
|
||||||
|
"sha256:ddb2287f66500ac57b24cce60341074b148977b74cd20eca755f95262928086f",
|
||||||
|
"sha256:e6a4260f0abf90c023b4f838905f645695b31666b76837152e2befad3d1ef5d6",
|
||||||
|
"sha256:e97b387f2744762b9984639b59abd7abb46ea6ae2ea24cb7c07893612328559b",
|
||||||
|
"sha256:ea784c96ca3b94912176d7adc9c4bb7d1988f36a0223a9ac128f4c834775202c",
|
||||||
|
"sha256:f0b250a03891255feb3ae69ac29d05cf9a62f5869bb8bac0e7f4968e7274efac",
|
||||||
|
"sha256:fdaa96733c9cf85491ad406fd78aa16025a1ea468951545b3da7ee133c150c7a"
|
||||||
|
],
|
||||||
|
"markers": "python_version >= '3.6'",
|
||||||
|
"version": "==6.0b1"
|
||||||
|
},
|
||||||
|
"iniconfig": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3",
|
||||||
|
"sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"
|
||||||
|
],
|
||||||
|
"version": "==1.1.1"
|
||||||
|
},
|
||||||
|
"mypy": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9",
|
||||||
|
"sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a",
|
||||||
|
"sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9",
|
||||||
|
"sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e",
|
||||||
|
"sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2",
|
||||||
|
"sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212",
|
||||||
|
"sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b",
|
||||||
|
"sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885",
|
||||||
|
"sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150",
|
||||||
|
"sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703",
|
||||||
|
"sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072",
|
||||||
|
"sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457",
|
||||||
|
"sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e",
|
||||||
|
"sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0",
|
||||||
|
"sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb",
|
||||||
|
"sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97",
|
||||||
|
"sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8",
|
||||||
|
"sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811",
|
||||||
|
"sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6",
|
||||||
|
"sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de",
|
||||||
|
"sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504",
|
||||||
|
"sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921",
|
||||||
|
"sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==0.910"
|
||||||
|
},
|
||||||
|
"mypy-extensions": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d",
|
||||||
|
"sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"
|
||||||
|
],
|
||||||
|
"version": "==0.4.3"
|
||||||
|
},
|
||||||
|
"packaging": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7",
|
||||||
|
"sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"
|
||||||
|
],
|
||||||
|
"markers": "python_version >= '3.6'",
|
||||||
|
"version": "==21.0"
|
||||||
|
},
|
||||||
|
"pathspec": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a",
|
||||||
|
"sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"
|
||||||
|
],
|
||||||
|
"version": "==0.9.0"
|
||||||
|
},
|
||||||
|
"pluggy": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:265a94bf44ca13662f12fcd1b074c14d4b269a712f051b6f644ef7e705d6735f",
|
||||||
|
"sha256:467f0219e89bb5061a8429c6fc5cf055fa3983a0e68e84a1d205046306b37d9e"
|
||||||
|
],
|
||||||
|
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
||||||
|
"version": "==1.0.0.dev0"
|
||||||
|
},
|
||||||
|
"py": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3",
|
||||||
|
"sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"
|
||||||
|
],
|
||||||
|
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
||||||
|
"version": "==1.10.0"
|
||||||
|
},
|
||||||
|
"pyparsing": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:10f1886e70da7b76ca1b4cf9bbd60f708ef037892496d5cb7c77ab2982412b2d",
|
||||||
|
"sha256:e96a96967098a5221a78bf94d72930cd1cfaf0ab88dae2ea6bfc2b8b8ccb1930"
|
||||||
|
],
|
||||||
|
"markers": "python_version >= '3.5'",
|
||||||
|
"version": "==3.0.0b3"
|
||||||
|
},
|
||||||
|
"pytest": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b",
|
||||||
|
"sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==6.2.4"
|
||||||
|
},
|
||||||
|
"pytest-cov": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a",
|
||||||
|
"sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==2.12.1"
|
||||||
|
},
|
||||||
|
"regex": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:0696eb934dee723e3292056a2c046ddb1e4dd3887685783a9f4af638e85dee76",
|
||||||
|
"sha256:105122fa63da98d8456d5026bc6ac5a1399fd82fa6bad22c6ea641b1572c9142",
|
||||||
|
"sha256:116c277774f84266044e889501fe79cfd293a8b4336b7a5e89b9f20f1e5a9f21",
|
||||||
|
"sha256:12eaf0bbe568bd62e6cade7937e0bf01a2a4cef49a82f4fd204401e78409e158",
|
||||||
|
"sha256:1401cfa4320691cbd91191ec678735c727dee674d0997b0902a5a38ad482faf5",
|
||||||
|
"sha256:19acdb8831a4e3b03b23369db43178d8fee1f17b99c83af6cd907886f76bd9d4",
|
||||||
|
"sha256:208851a2f8dd31e468f0b5aa6c94433975bd67a107a4e7da3bdda947c9f85e25",
|
||||||
|
"sha256:24d68499a27b2d93831fde4a9b84ea5b19e0ab141425fbc9ab1e5b4dad179df7",
|
||||||
|
"sha256:2778c6cb379d804e429cc8e627392909e60db5152b42c695c37ae5757aae50ae",
|
||||||
|
"sha256:2a0a5e323cf86760784ce2b91d8ab5ea09d0865d6ef4da0151e03d15d097b24e",
|
||||||
|
"sha256:2d9cbe0c755ab8b6f583169c0783f7278fc6b195e423b09c5a8da6f858025e96",
|
||||||
|
"sha256:2de1429e4eeab799c168a4f6e6eecdf30fcaa389bba4039cc8a065d6b7aad647",
|
||||||
|
"sha256:32753eda8d413ce4f208cfe01dd61171a78068a6f5d5f38ccd751e00585cdf1d",
|
||||||
|
"sha256:3ee8ad16a35c45a5bab098e39020ecb6fec3b0e700a9d88983d35cbabcee79c8",
|
||||||
|
"sha256:4f03fc0a25122cdcbf39136510d4ea7627f732206892db522adf510bc03b8c67",
|
||||||
|
"sha256:4f3e36086d6631ceaf468503f96a3be0d247caef0660c9452fb1b0c055783851",
|
||||||
|
"sha256:503c1ba0920a46a1844363725215ef44d59fcac2bd2c03ae3c59aa9d08d29bd6",
|
||||||
|
"sha256:507861cf3d97a86fbe26ea6cc04660ae028b9e4080b8290e28b99547b4e15d89",
|
||||||
|
"sha256:56ae6e3cf0506ec0c40b466e31f41ee7a7149a2b505ae0ee50edd9043b423d27",
|
||||||
|
"sha256:6530b7b9505123cdea40a2301225183ca65f389bc6129f0c225b9b41680268d8",
|
||||||
|
"sha256:6729914dd73483cd1c8aaace3ac082436fc98b0072743ac136eaea0b3811d42f",
|
||||||
|
"sha256:7406dd2e44c7cfb4680c0a45a03264381802c67890cf506c147288f04c67177d",
|
||||||
|
"sha256:7684016b73938ca12d160d2907d141f06b7597bd17d854e32bb7588be01afa1d",
|
||||||
|
"sha256:7db58ad61f3f6ea393aaf124d774ee0c58806320bc85c06dc9480f5c7219c250",
|
||||||
|
"sha256:83946ca9278b304728b637bc8d8200ab1663a79de85e47724594917aeed0e892",
|
||||||
|
"sha256:84057cfae5676f456b03970eb78b7e182fddc80c2daafd83465a3d6ca9ff8dbf",
|
||||||
|
"sha256:862b6164e9a38b5c495be2c2854e75fd8af12c5be4c61dc9b42d255980d7e907",
|
||||||
|
"sha256:8ddb4f9ce6bb388ecc97b4b3eb37e786f05d7d5815e8822e0d87a3dbd7100649",
|
||||||
|
"sha256:92eb03f47427fea452ff6956d11f5d5a3f22a048c90a0f34fa223e6badab6c85",
|
||||||
|
"sha256:a5f3bc727fea58f21d99c22e6d4fca652dc11dbc2a1e7cfc4838cd53b2e3691f",
|
||||||
|
"sha256:a6180dbf5945b27e9420e1b58c3cacfc79ad5278bdad3ea35109f5680fbe16d1",
|
||||||
|
"sha256:b158f673ae6a6523f13704f70aa7e4ce875f91e379bece4362c89db18db189d5",
|
||||||
|
"sha256:cd45b4542134de63e7b9dd653e0a2d7d47ffed9615e3637c27ca5f6b78ea68bb",
|
||||||
|
"sha256:d2404336fd16788ea757d4218a2580de60adb052d9888031e765320be8884309",
|
||||||
|
"sha256:db888d4fb33a2fd54b57ac55d5015e51fa849f0d8592bd799b4e47f83bd04e00",
|
||||||
|
"sha256:dde0ac721c7c5bfa5f9fc285e811274dec3c392f2c1225f7d07ca98a8187ca84",
|
||||||
|
"sha256:de0d06ccbc06af5bf93bddec10f4f80275c5d74ea6d28b456931f3955f58bc8c",
|
||||||
|
"sha256:e02dad60e3e8442eefd28095e99b2ac98f2b8667167493ac6a2f3aadb5d84a17",
|
||||||
|
"sha256:e960fe211496333b2f7e36badf4c22a919d740386681f79139ee346b403d1ca1",
|
||||||
|
"sha256:e9700c52749cb3e90c98efd72b730c97b7e4962992fca5fbcaf1363be8e3b849",
|
||||||
|
"sha256:ee318974a1fdacba1701bc9e552e9015788d6345416364af6fa987424ff8df53"
|
||||||
|
],
|
||||||
|
"version": "==2021.8.27"
|
||||||
|
},
|
||||||
|
"toml": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b",
|
||||||
|
"sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"
|
||||||
|
],
|
||||||
|
"markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'",
|
||||||
|
"version": "==0.10.2"
|
||||||
|
},
|
||||||
|
"tomli": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:8dd0e9524d6f386271a36b41dbf6c57d8e32fd96fd22b6584679dc569d20899f",
|
||||||
|
"sha256:a5b75cb6f3968abb47af1b40c1819dc519ea82bcc065776a866e8d74c5ca9442"
|
||||||
|
],
|
||||||
|
"markers": "python_version >= '3.6'",
|
||||||
|
"version": "==1.2.1"
|
||||||
|
},
|
||||||
|
"typing-extensions": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497",
|
||||||
|
"sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342",
|
||||||
|
"sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"
|
||||||
|
],
|
||||||
|
"version": "==3.10.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
3
README.md
Normal file
3
README.md
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
# Mars Rover
|
||||||
|
|
||||||
|
See [description](./description.pdf) for more details.
|
||||||
BIN
description.pdf
Normal file
BIN
description.pdf
Normal file
Binary file not shown.
611
htmlcov/coverage_html.js
Normal file
611
htmlcov/coverage_html.js
Normal file
|
|
@ -0,0 +1,611 @@
|
||||||
|
// Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
// For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
|
||||||
|
|
||||||
|
// Coverage.py HTML report browser code.
|
||||||
|
/*jslint browser: true, sloppy: true, vars: true, plusplus: true, maxerr: 50, indent: 4 */
|
||||||
|
/*global coverage: true, document, window, $ */
|
||||||
|
|
||||||
|
coverage = {};
|
||||||
|
|
||||||
|
// Find all the elements with shortkey_* class, and use them to assign a shortcut key.
|
||||||
|
coverage.assign_shortkeys = function () {
|
||||||
|
$("*[class*='shortkey_']").each(function (i, e) {
|
||||||
|
$.each($(e).attr("class").split(" "), function (i, c) {
|
||||||
|
if (/^shortkey_/.test(c)) {
|
||||||
|
$(document).bind('keydown', c.substr(9), function () {
|
||||||
|
$(e).click();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create the events for the help panel.
|
||||||
|
coverage.wire_up_help_panel = function () {
|
||||||
|
$("#keyboard_icon").click(function () {
|
||||||
|
// Show the help panel, and position it so the keyboard icon in the
|
||||||
|
// panel is in the same place as the keyboard icon in the header.
|
||||||
|
$(".help_panel").show();
|
||||||
|
var koff = $("#keyboard_icon").offset();
|
||||||
|
var poff = $("#panel_icon").position();
|
||||||
|
$(".help_panel").offset({
|
||||||
|
top: koff.top-poff.top-1,
|
||||||
|
left: koff.left-poff.left-1
|
||||||
|
});
|
||||||
|
});
|
||||||
|
$("#panel_icon").click(function () {
|
||||||
|
$(".help_panel").hide();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create the events for the filter box.
|
||||||
|
coverage.wire_up_filter = function () {
|
||||||
|
// Cache elements.
|
||||||
|
var table = $("table.index");
|
||||||
|
var table_rows = table.find("tbody tr");
|
||||||
|
var table_row_names = table_rows.find("td.name a");
|
||||||
|
var no_rows = $("#no_rows");
|
||||||
|
|
||||||
|
// Create a duplicate table footer that we can modify with dynamic summed values.
|
||||||
|
var table_footer = $("table.index tfoot tr");
|
||||||
|
var table_dynamic_footer = table_footer.clone();
|
||||||
|
table_dynamic_footer.attr('class', 'total_dynamic hidden');
|
||||||
|
table_footer.after(table_dynamic_footer);
|
||||||
|
|
||||||
|
// Observe filter keyevents.
|
||||||
|
$("#filter").on("keyup change", $.debounce(150, function (event) {
|
||||||
|
var filter_value = $(this).val();
|
||||||
|
|
||||||
|
if (filter_value === "") {
|
||||||
|
// Filter box is empty, remove all filtering.
|
||||||
|
table_rows.removeClass("hidden");
|
||||||
|
|
||||||
|
// Show standard footer, hide dynamic footer.
|
||||||
|
table_footer.removeClass("hidden");
|
||||||
|
table_dynamic_footer.addClass("hidden");
|
||||||
|
|
||||||
|
// Hide placeholder, show table.
|
||||||
|
if (no_rows.length > 0) {
|
||||||
|
no_rows.hide();
|
||||||
|
}
|
||||||
|
table.show();
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Filter table items by value.
|
||||||
|
var hidden = 0;
|
||||||
|
var shown = 0;
|
||||||
|
|
||||||
|
// Hide / show elements.
|
||||||
|
$.each(table_row_names, function () {
|
||||||
|
var element = $(this).parents("tr");
|
||||||
|
|
||||||
|
if ($(this).text().indexOf(filter_value) === -1) {
|
||||||
|
// hide
|
||||||
|
element.addClass("hidden");
|
||||||
|
hidden++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// show
|
||||||
|
element.removeClass("hidden");
|
||||||
|
shown++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Show placeholder if no rows will be displayed.
|
||||||
|
if (no_rows.length > 0) {
|
||||||
|
if (shown === 0) {
|
||||||
|
// Show placeholder, hide table.
|
||||||
|
no_rows.show();
|
||||||
|
table.hide();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Hide placeholder, show table.
|
||||||
|
no_rows.hide();
|
||||||
|
table.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Manage dynamic header:
|
||||||
|
if (hidden > 0) {
|
||||||
|
// Calculate new dynamic sum values based on visible rows.
|
||||||
|
for (var column = 2; column < 20; column++) {
|
||||||
|
// Calculate summed value.
|
||||||
|
var cells = table_rows.find('td:nth-child(' + column + ')');
|
||||||
|
if (!cells.length) {
|
||||||
|
// No more columns...!
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
var sum = 0, numer = 0, denom = 0;
|
||||||
|
$.each(cells.filter(':visible'), function () {
|
||||||
|
var ratio = $(this).data("ratio");
|
||||||
|
if (ratio) {
|
||||||
|
var splitted = ratio.split(" ");
|
||||||
|
numer += parseInt(splitted[0], 10);
|
||||||
|
denom += parseInt(splitted[1], 10);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sum += parseInt(this.innerHTML, 10);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Get footer cell element.
|
||||||
|
var footer_cell = table_dynamic_footer.find('td:nth-child(' + column + ')');
|
||||||
|
|
||||||
|
// Set value into dynamic footer cell element.
|
||||||
|
if (cells[0].innerHTML.indexOf('%') > -1) {
|
||||||
|
// Percentage columns use the numerator and denominator,
|
||||||
|
// and adapt to the number of decimal places.
|
||||||
|
var match = /\.([0-9]+)/.exec(cells[0].innerHTML);
|
||||||
|
var places = 0;
|
||||||
|
if (match) {
|
||||||
|
places = match[1].length;
|
||||||
|
}
|
||||||
|
var pct = numer * 100 / denom;
|
||||||
|
footer_cell.text(pct.toFixed(places) + '%');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
footer_cell.text(sum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hide standard footer, show dynamic footer.
|
||||||
|
table_footer.addClass("hidden");
|
||||||
|
table_dynamic_footer.removeClass("hidden");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Show standard footer, hide dynamic footer.
|
||||||
|
table_footer.removeClass("hidden");
|
||||||
|
table_dynamic_footer.addClass("hidden");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Trigger change event on setup, to force filter on page refresh
|
||||||
|
// (filter value may still be present).
|
||||||
|
$("#filter").trigger("change");
|
||||||
|
};
|
||||||
|
|
||||||
|
// Loaded on index.html
|
||||||
|
coverage.index_ready = function ($) {
|
||||||
|
// Look for a localStorage item containing previous sort settings:
|
||||||
|
var sort_list = [];
|
||||||
|
var storage_name = "COVERAGE_INDEX_SORT";
|
||||||
|
var stored_list = undefined;
|
||||||
|
try {
|
||||||
|
stored_list = localStorage.getItem(storage_name);
|
||||||
|
} catch(err) {}
|
||||||
|
|
||||||
|
if (stored_list) {
|
||||||
|
sort_list = JSON.parse('[[' + stored_list + ']]');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new widget which exists only to save and restore
|
||||||
|
// the sort order:
|
||||||
|
$.tablesorter.addWidget({
|
||||||
|
id: "persistentSort",
|
||||||
|
|
||||||
|
// Format is called by the widget before displaying:
|
||||||
|
format: function (table) {
|
||||||
|
if (table.config.sortList.length === 0 && sort_list.length > 0) {
|
||||||
|
// This table hasn't been sorted before - we'll use
|
||||||
|
// our stored settings:
|
||||||
|
$(table).trigger('sorton', [sort_list]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// This is not the first load - something has
|
||||||
|
// already defined sorting so we'll just update
|
||||||
|
// our stored value to match:
|
||||||
|
sort_list = table.config.sortList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Configure our tablesorter to handle the variable number of
|
||||||
|
// columns produced depending on report options:
|
||||||
|
var headers = [];
|
||||||
|
var col_count = $("table.index > thead > tr > th").length;
|
||||||
|
|
||||||
|
headers[0] = { sorter: 'text' };
|
||||||
|
for (i = 1; i < col_count-1; i++) {
|
||||||
|
headers[i] = { sorter: 'digit' };
|
||||||
|
}
|
||||||
|
headers[col_count-1] = { sorter: 'percent' };
|
||||||
|
|
||||||
|
// Enable the table sorter:
|
||||||
|
$("table.index").tablesorter({
|
||||||
|
widgets: ['persistentSort'],
|
||||||
|
headers: headers
|
||||||
|
});
|
||||||
|
|
||||||
|
coverage.assign_shortkeys();
|
||||||
|
coverage.wire_up_help_panel();
|
||||||
|
coverage.wire_up_filter();
|
||||||
|
|
||||||
|
// Watch for page unload events so we can save the final sort settings:
|
||||||
|
$(window).on("unload", function () {
|
||||||
|
try {
|
||||||
|
localStorage.setItem(storage_name, sort_list.toString())
|
||||||
|
} catch(err) {}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// -- pyfile stuff --
|
||||||
|
|
||||||
|
coverage.LINE_FILTERS_STORAGE = "COVERAGE_LINE_FILTERS";
|
||||||
|
|
||||||
|
coverage.pyfile_ready = function ($) {
|
||||||
|
// If we're directed to a particular line number, highlight the line.
|
||||||
|
var frag = location.hash;
|
||||||
|
if (frag.length > 2 && frag[1] === 't') {
|
||||||
|
$(frag).addClass('highlight');
|
||||||
|
coverage.set_sel(parseInt(frag.substr(2), 10));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
coverage.set_sel(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document)
|
||||||
|
.bind('keydown', 'j', coverage.to_next_chunk_nicely)
|
||||||
|
.bind('keydown', 'k', coverage.to_prev_chunk_nicely)
|
||||||
|
.bind('keydown', '0', coverage.to_top)
|
||||||
|
.bind('keydown', '1', coverage.to_first_chunk)
|
||||||
|
;
|
||||||
|
|
||||||
|
$(".button_toggle_run").click(function (evt) {coverage.toggle_lines(evt.target, "run");});
|
||||||
|
$(".button_toggle_exc").click(function (evt) {coverage.toggle_lines(evt.target, "exc");});
|
||||||
|
$(".button_toggle_mis").click(function (evt) {coverage.toggle_lines(evt.target, "mis");});
|
||||||
|
$(".button_toggle_par").click(function (evt) {coverage.toggle_lines(evt.target, "par");});
|
||||||
|
|
||||||
|
coverage.filters = undefined;
|
||||||
|
try {
|
||||||
|
coverage.filters = localStorage.getItem(coverage.LINE_FILTERS_STORAGE);
|
||||||
|
} catch(err) {}
|
||||||
|
|
||||||
|
if (coverage.filters) {
|
||||||
|
coverage.filters = JSON.parse(coverage.filters);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
coverage.filters = {run: false, exc: true, mis: true, par: true};
|
||||||
|
}
|
||||||
|
|
||||||
|
for (cls in coverage.filters) {
|
||||||
|
coverage.set_line_visibilty(cls, coverage.filters[cls]);
|
||||||
|
}
|
||||||
|
|
||||||
|
coverage.assign_shortkeys();
|
||||||
|
coverage.wire_up_help_panel();
|
||||||
|
|
||||||
|
coverage.init_scroll_markers();
|
||||||
|
|
||||||
|
// Rebuild scroll markers when the window height changes.
|
||||||
|
$(window).resize(coverage.build_scroll_markers);
|
||||||
|
};
|
||||||
|
|
||||||
|
coverage.toggle_lines = function (btn, cls) {
|
||||||
|
var onoff = !$(btn).hasClass("show_" + cls);
|
||||||
|
coverage.set_line_visibilty(cls, onoff);
|
||||||
|
coverage.build_scroll_markers();
|
||||||
|
coverage.filters[cls] = onoff;
|
||||||
|
try {
|
||||||
|
localStorage.setItem(coverage.LINE_FILTERS_STORAGE, JSON.stringify(coverage.filters));
|
||||||
|
} catch(err) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
coverage.set_line_visibilty = function (cls, onoff) {
|
||||||
|
var show = "show_" + cls;
|
||||||
|
var btn = $(".button_toggle_" + cls);
|
||||||
|
if (onoff) {
|
||||||
|
$("#source ." + cls).addClass(show);
|
||||||
|
btn.addClass(show);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$("#source ." + cls).removeClass(show);
|
||||||
|
btn.removeClass(show);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Return the nth line div.
|
||||||
|
coverage.line_elt = function (n) {
|
||||||
|
return $("#t" + n);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Set the selection. b and e are line numbers.
|
||||||
|
coverage.set_sel = function (b, e) {
|
||||||
|
// The first line selected.
|
||||||
|
coverage.sel_begin = b;
|
||||||
|
// The next line not selected.
|
||||||
|
coverage.sel_end = (e === undefined) ? b+1 : e;
|
||||||
|
};
|
||||||
|
|
||||||
|
coverage.to_top = function () {
|
||||||
|
coverage.set_sel(0, 1);
|
||||||
|
coverage.scroll_window(0);
|
||||||
|
};
|
||||||
|
|
||||||
|
coverage.to_first_chunk = function () {
|
||||||
|
coverage.set_sel(0, 1);
|
||||||
|
coverage.to_next_chunk();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Return a string indicating what kind of chunk this line belongs to,
|
||||||
|
// or null if not a chunk.
|
||||||
|
coverage.chunk_indicator = function (line_elt) {
|
||||||
|
var klass = line_elt.attr('class');
|
||||||
|
if (klass) {
|
||||||
|
var m = klass.match(/\bshow_\w+\b/);
|
||||||
|
if (m) {
|
||||||
|
return m[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
coverage.to_next_chunk = function () {
|
||||||
|
var c = coverage;
|
||||||
|
|
||||||
|
// Find the start of the next colored chunk.
|
||||||
|
var probe = c.sel_end;
|
||||||
|
var chunk_indicator, probe_line;
|
||||||
|
while (true) {
|
||||||
|
probe_line = c.line_elt(probe);
|
||||||
|
if (probe_line.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
chunk_indicator = c.chunk_indicator(probe_line);
|
||||||
|
if (chunk_indicator) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
probe++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// There's a next chunk, `probe` points to it.
|
||||||
|
var begin = probe;
|
||||||
|
|
||||||
|
// Find the end of this chunk.
|
||||||
|
var next_indicator = chunk_indicator;
|
||||||
|
while (next_indicator === chunk_indicator) {
|
||||||
|
probe++;
|
||||||
|
probe_line = c.line_elt(probe);
|
||||||
|
next_indicator = c.chunk_indicator(probe_line);
|
||||||
|
}
|
||||||
|
c.set_sel(begin, probe);
|
||||||
|
c.show_selection();
|
||||||
|
};
|
||||||
|
|
||||||
|
coverage.to_prev_chunk = function () {
|
||||||
|
var c = coverage;
|
||||||
|
|
||||||
|
// Find the end of the prev colored chunk.
|
||||||
|
var probe = c.sel_begin-1;
|
||||||
|
var probe_line = c.line_elt(probe);
|
||||||
|
if (probe_line.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var chunk_indicator = c.chunk_indicator(probe_line);
|
||||||
|
while (probe > 0 && !chunk_indicator) {
|
||||||
|
probe--;
|
||||||
|
probe_line = c.line_elt(probe);
|
||||||
|
if (probe_line.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
chunk_indicator = c.chunk_indicator(probe_line);
|
||||||
|
}
|
||||||
|
|
||||||
|
// There's a prev chunk, `probe` points to its last line.
|
||||||
|
var end = probe+1;
|
||||||
|
|
||||||
|
// Find the beginning of this chunk.
|
||||||
|
var prev_indicator = chunk_indicator;
|
||||||
|
while (prev_indicator === chunk_indicator) {
|
||||||
|
probe--;
|
||||||
|
probe_line = c.line_elt(probe);
|
||||||
|
prev_indicator = c.chunk_indicator(probe_line);
|
||||||
|
}
|
||||||
|
c.set_sel(probe+1, end);
|
||||||
|
c.show_selection();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Return the line number of the line nearest pixel position pos
|
||||||
|
coverage.line_at_pos = function (pos) {
|
||||||
|
var l1 = coverage.line_elt(1),
|
||||||
|
l2 = coverage.line_elt(2),
|
||||||
|
result;
|
||||||
|
if (l1.length && l2.length) {
|
||||||
|
var l1_top = l1.offset().top,
|
||||||
|
line_height = l2.offset().top - l1_top,
|
||||||
|
nlines = (pos - l1_top) / line_height;
|
||||||
|
if (nlines < 1) {
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
result = Math.ceil(nlines);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Returns 0, 1, or 2: how many of the two ends of the selection are on
|
||||||
|
// the screen right now?
|
||||||
|
coverage.selection_ends_on_screen = function () {
|
||||||
|
if (coverage.sel_begin === 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
var top = coverage.line_elt(coverage.sel_begin);
|
||||||
|
var next = coverage.line_elt(coverage.sel_end-1);
|
||||||
|
|
||||||
|
return (
|
||||||
|
(top.isOnScreen() ? 1 : 0) +
|
||||||
|
(next.isOnScreen() ? 1 : 0)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
coverage.to_next_chunk_nicely = function () {
|
||||||
|
coverage.finish_scrolling();
|
||||||
|
if (coverage.selection_ends_on_screen() === 0) {
|
||||||
|
// The selection is entirely off the screen: select the top line on
|
||||||
|
// the screen.
|
||||||
|
var win = $(window);
|
||||||
|
coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop()));
|
||||||
|
}
|
||||||
|
coverage.to_next_chunk();
|
||||||
|
};
|
||||||
|
|
||||||
|
coverage.to_prev_chunk_nicely = function () {
|
||||||
|
coverage.finish_scrolling();
|
||||||
|
if (coverage.selection_ends_on_screen() === 0) {
|
||||||
|
var win = $(window);
|
||||||
|
coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop() + win.height()));
|
||||||
|
}
|
||||||
|
coverage.to_prev_chunk();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Select line number lineno, or if it is in a colored chunk, select the
|
||||||
|
// entire chunk
|
||||||
|
coverage.select_line_or_chunk = function (lineno) {
|
||||||
|
var c = coverage;
|
||||||
|
var probe_line = c.line_elt(lineno);
|
||||||
|
if (probe_line.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var the_indicator = c.chunk_indicator(probe_line);
|
||||||
|
if (the_indicator) {
|
||||||
|
// The line is in a highlighted chunk.
|
||||||
|
// Search backward for the first line.
|
||||||
|
var probe = lineno;
|
||||||
|
var indicator = the_indicator;
|
||||||
|
while (probe > 0 && indicator === the_indicator) {
|
||||||
|
probe--;
|
||||||
|
probe_line = c.line_elt(probe);
|
||||||
|
if (probe_line.length === 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
indicator = c.chunk_indicator(probe_line);
|
||||||
|
}
|
||||||
|
var begin = probe + 1;
|
||||||
|
|
||||||
|
// Search forward for the last line.
|
||||||
|
probe = lineno;
|
||||||
|
indicator = the_indicator;
|
||||||
|
while (indicator === the_indicator) {
|
||||||
|
probe++;
|
||||||
|
probe_line = c.line_elt(probe);
|
||||||
|
indicator = c.chunk_indicator(probe_line);
|
||||||
|
}
|
||||||
|
|
||||||
|
coverage.set_sel(begin, probe);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
coverage.set_sel(lineno);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
coverage.show_selection = function () {
|
||||||
|
var c = coverage;
|
||||||
|
|
||||||
|
// Highlight the lines in the chunk
|
||||||
|
$("#source .highlight").removeClass("highlight");
|
||||||
|
for (var probe = c.sel_begin; probe > 0 && probe < c.sel_end; probe++) {
|
||||||
|
c.line_elt(probe).addClass("highlight");
|
||||||
|
}
|
||||||
|
|
||||||
|
c.scroll_to_selection();
|
||||||
|
};
|
||||||
|
|
||||||
|
coverage.scroll_to_selection = function () {
|
||||||
|
// Scroll the page if the chunk isn't fully visible.
|
||||||
|
if (coverage.selection_ends_on_screen() < 2) {
|
||||||
|
// Need to move the page. The html,body trick makes it scroll in all
|
||||||
|
// browsers, got it from http://stackoverflow.com/questions/3042651
|
||||||
|
var top = coverage.line_elt(coverage.sel_begin);
|
||||||
|
var top_pos = parseInt(top.offset().top, 10);
|
||||||
|
coverage.scroll_window(top_pos - 30);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
coverage.scroll_window = function (to_pos) {
|
||||||
|
$("html,body").animate({scrollTop: to_pos}, 200);
|
||||||
|
};
|
||||||
|
|
||||||
|
coverage.finish_scrolling = function () {
|
||||||
|
$("html,body").stop(true, true);
|
||||||
|
};
|
||||||
|
|
||||||
|
coverage.init_scroll_markers = function () {
|
||||||
|
var c = coverage;
|
||||||
|
// Init some variables
|
||||||
|
c.lines_len = $('#source p').length;
|
||||||
|
c.body_h = $('body').height();
|
||||||
|
c.header_h = $('div#header').height();
|
||||||
|
|
||||||
|
// Build html
|
||||||
|
c.build_scroll_markers();
|
||||||
|
};
|
||||||
|
|
||||||
|
coverage.build_scroll_markers = function () {
|
||||||
|
var c = coverage,
|
||||||
|
min_line_height = 3,
|
||||||
|
max_line_height = 10,
|
||||||
|
visible_window_h = $(window).height();
|
||||||
|
|
||||||
|
c.lines_to_mark = $('#source').find('p.show_run, p.show_mis, p.show_exc, p.show_exc, p.show_par');
|
||||||
|
$('#scroll_marker').remove();
|
||||||
|
// Don't build markers if the window has no scroll bar.
|
||||||
|
if (c.body_h <= visible_window_h) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$("body").append("<div id='scroll_marker'> </div>");
|
||||||
|
var scroll_marker = $('#scroll_marker'),
|
||||||
|
marker_scale = scroll_marker.height() / c.body_h,
|
||||||
|
line_height = scroll_marker.height() / c.lines_len;
|
||||||
|
|
||||||
|
// Line height must be between the extremes.
|
||||||
|
if (line_height > min_line_height) {
|
||||||
|
if (line_height > max_line_height) {
|
||||||
|
line_height = max_line_height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
line_height = min_line_height;
|
||||||
|
}
|
||||||
|
|
||||||
|
var previous_line = -99,
|
||||||
|
last_mark,
|
||||||
|
last_top,
|
||||||
|
offsets = {};
|
||||||
|
|
||||||
|
// Calculate line offsets outside loop to prevent relayouts
|
||||||
|
c.lines_to_mark.each(function() {
|
||||||
|
offsets[this.id] = $(this).offset().top;
|
||||||
|
});
|
||||||
|
c.lines_to_mark.each(function () {
|
||||||
|
var id_name = $(this).attr('id'),
|
||||||
|
line_top = Math.round(offsets[id_name] * marker_scale),
|
||||||
|
line_number = parseInt(id_name.substring(1, id_name.length));
|
||||||
|
|
||||||
|
if (line_number === previous_line + 1) {
|
||||||
|
// If this solid missed block just make previous mark higher.
|
||||||
|
last_mark.css({
|
||||||
|
'height': line_top + line_height - last_top
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Add colored line in scroll_marker block.
|
||||||
|
scroll_marker.append('<div id="m' + line_number + '" class="marker"></div>');
|
||||||
|
last_mark = $('#m' + line_number);
|
||||||
|
last_mark.css({
|
||||||
|
'height': line_height,
|
||||||
|
'top': line_top
|
||||||
|
});
|
||||||
|
last_top = line_top;
|
||||||
|
}
|
||||||
|
|
||||||
|
previous_line = line_number;
|
||||||
|
});
|
||||||
|
};
|
||||||
65
htmlcov/d_a44f0ac069e85531___init___py.html
Normal file
65
htmlcov/d_a44f0ac069e85531___init___py.html
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
|
||||||
|
<title>Coverage for tests/__init__.py: 100%</title>
|
||||||
|
<link rel="icon" sizes="32x32" href="favicon_32.png">
|
||||||
|
<link rel="stylesheet" href="style.css" type="text/css">
|
||||||
|
<script type="text/javascript" src="jquery.min.js"></script>
|
||||||
|
<script type="text/javascript" src="jquery.hotkeys.js"></script>
|
||||||
|
<script type="text/javascript" src="jquery.isonscreen.js"></script>
|
||||||
|
<script type="text/javascript" src="coverage_html.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery(document).ready(coverage.pyfile_ready);
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="pyfile">
|
||||||
|
<div id="header">
|
||||||
|
<div class="content">
|
||||||
|
<h1>Coverage for <b>tests/__init__.py</b> :
|
||||||
|
<span class="pc_cov">100%</span>
|
||||||
|
</h1>
|
||||||
|
<img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
|
||||||
|
<h2 class="stats">
|
||||||
|
0 statements
|
||||||
|
<button type="button" class="run shortkey_r button_toggle_run" title="Toggle lines run">0 run</button>
|
||||||
|
<button type="button" class="mis show_mis shortkey_m button_toggle_mis" title="Toggle lines missing">0 missing</button>
|
||||||
|
<button type="button" class="exc show_exc shortkey_x button_toggle_exc" title="Toggle lines excluded">0 excluded</button>
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="help_panel">
|
||||||
|
<img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
|
||||||
|
<p class="legend">Hot-keys on this page</p>
|
||||||
|
<div>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">r</span>
|
||||||
|
<span class="key">m</span>
|
||||||
|
<span class="key">x</span>
|
||||||
|
<span class="key">p</span> toggle line displays
|
||||||
|
</p>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">j</span>
|
||||||
|
<span class="key">k</span> next/prev highlighted chunk
|
||||||
|
</p>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">0</span> (zero) top of page
|
||||||
|
</p>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">1</span> (one) first highlighted chunk
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="source">
|
||||||
|
</div>
|
||||||
|
<div id="footer">
|
||||||
|
<div class="content">
|
||||||
|
<p>
|
||||||
|
<a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.io/en/6.0b1">coverage.py v6.0b1</a>,
|
||||||
|
created at 2021-08-27 10:41 +0200
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
73
htmlcov/d_a44f0ac069e85531_conftest_py.html
Normal file
73
htmlcov/d_a44f0ac069e85531_conftest_py.html
Normal file
|
|
@ -0,0 +1,73 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
|
||||||
|
<title>Coverage for tests/conftest.py: 100%</title>
|
||||||
|
<link rel="icon" sizes="32x32" href="favicon_32.png">
|
||||||
|
<link rel="stylesheet" href="style.css" type="text/css">
|
||||||
|
<script type="text/javascript" src="jquery.min.js"></script>
|
||||||
|
<script type="text/javascript" src="jquery.hotkeys.js"></script>
|
||||||
|
<script type="text/javascript" src="jquery.isonscreen.js"></script>
|
||||||
|
<script type="text/javascript" src="coverage_html.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery(document).ready(coverage.pyfile_ready);
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="pyfile">
|
||||||
|
<div id="header">
|
||||||
|
<div class="content">
|
||||||
|
<h1>Coverage for <b>tests/conftest.py</b> :
|
||||||
|
<span class="pc_cov">100%</span>
|
||||||
|
</h1>
|
||||||
|
<img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
|
||||||
|
<h2 class="stats">
|
||||||
|
5 statements
|
||||||
|
<button type="button" class="run shortkey_r button_toggle_run" title="Toggle lines run">5 run</button>
|
||||||
|
<button type="button" class="mis show_mis shortkey_m button_toggle_mis" title="Toggle lines missing">0 missing</button>
|
||||||
|
<button type="button" class="exc show_exc shortkey_x button_toggle_exc" title="Toggle lines excluded">0 excluded</button>
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="help_panel">
|
||||||
|
<img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
|
||||||
|
<p class="legend">Hot-keys on this page</p>
|
||||||
|
<div>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">r</span>
|
||||||
|
<span class="key">m</span>
|
||||||
|
<span class="key">x</span>
|
||||||
|
<span class="key">p</span> toggle line displays
|
||||||
|
</p>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">j</span>
|
||||||
|
<span class="key">k</span> next/prev highlighted chunk
|
||||||
|
</p>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">0</span> (zero) top of page
|
||||||
|
</p>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">1</span> (one) first highlighted chunk
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="source">
|
||||||
|
<p id="t1" class="run"><span class="n"><a href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">pytest</span> <span class="key">as</span> <span class="nam">pytest</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t2" class="pln"><span class="n"><a href="#t2">2</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t3" class="run"><span class="n"><a href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">rover</span><span class="op">.</span><span class="nam">rover</span> <span class="key">import</span> <span class="nam">Rover</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t4" class="pln"><span class="n"><a href="#t4">4</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t5" class="pln"><span class="n"><a href="#t5">5</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t6" class="run"><span class="n"><a href="#t6">6</a></span><span class="t"><span class="op">@</span><span class="nam">pytest</span><span class="op">.</span><span class="nam">fixture</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t7" class="run"><span class="n"><a href="#t7">7</a></span><span class="t"><span class="key">def</span> <span class="nam">rover</span><span class="op">(</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t8" class="run"><span class="n"><a href="#t8">8</a></span><span class="t"> <span class="key">return</span> <span class="nam">Rover</span><span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"EAST"</span><span class="op">)</span> </span><span class="r"></span></p>
|
||||||
|
</div>
|
||||||
|
<div id="footer">
|
||||||
|
<div class="content">
|
||||||
|
<p>
|
||||||
|
<a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.io/en/6.0b1">coverage.py v6.0b1</a>,
|
||||||
|
created at 2021-08-27 10:53 +0200
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
114
htmlcov/d_a44f0ac069e85531_test_rover_py.html
Normal file
114
htmlcov/d_a44f0ac069e85531_test_rover_py.html
Normal file
|
|
@ -0,0 +1,114 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
|
||||||
|
<title>Coverage for tests/test_rover.py: 100%</title>
|
||||||
|
<link rel="icon" sizes="32x32" href="favicon_32.png">
|
||||||
|
<link rel="stylesheet" href="style.css" type="text/css">
|
||||||
|
<script type="text/javascript" src="jquery.min.js"></script>
|
||||||
|
<script type="text/javascript" src="jquery.hotkeys.js"></script>
|
||||||
|
<script type="text/javascript" src="jquery.isonscreen.js"></script>
|
||||||
|
<script type="text/javascript" src="coverage_html.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery(document).ready(coverage.pyfile_ready);
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="pyfile">
|
||||||
|
<div id="header">
|
||||||
|
<div class="content">
|
||||||
|
<h1>Coverage for <b>tests/test_rover.py</b> :
|
||||||
|
<span class="pc_cov">100%</span>
|
||||||
|
</h1>
|
||||||
|
<img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
|
||||||
|
<h2 class="stats">
|
||||||
|
19 statements
|
||||||
|
<button type="button" class="run shortkey_r button_toggle_run" title="Toggle lines run">19 run</button>
|
||||||
|
<button type="button" class="mis show_mis shortkey_m button_toggle_mis" title="Toggle lines missing">0 missing</button>
|
||||||
|
<button type="button" class="exc show_exc shortkey_x button_toggle_exc" title="Toggle lines excluded">0 excluded</button>
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="help_panel">
|
||||||
|
<img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
|
||||||
|
<p class="legend">Hot-keys on this page</p>
|
||||||
|
<div>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">r</span>
|
||||||
|
<span class="key">m</span>
|
||||||
|
<span class="key">x</span>
|
||||||
|
<span class="key">p</span> toggle line displays
|
||||||
|
</p>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">j</span>
|
||||||
|
<span class="key">k</span> next/prev highlighted chunk
|
||||||
|
</p>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">0</span> (zero) top of page
|
||||||
|
</p>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">1</span> (one) first highlighted chunk
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="source">
|
||||||
|
<p id="t1" class="run"><span class="n"><a href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">pytest</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t2" class="pln"><span class="n"><a href="#t2">2</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t3" class="run"><span class="n"><a href="#t3">3</a></span><span class="t"><span class="key">from</span> <span class="nam">rover</span><span class="op">.</span><span class="nam">rover</span> <span class="key">import</span> <span class="nam">Rover</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t4" class="pln"><span class="n"><a href="#t4">4</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t5" class="pln"><span class="n"><a href="#t5">5</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t6" class="run"><span class="n"><a href="#t6">6</a></span><span class="t"><span class="key">def</span> <span class="nam">test_rover_initialisation</span><span class="op">(</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t7" class="run"><span class="n"><a href="#t7">7</a></span><span class="t"> <span class="key">assert</span> <span class="nam">Rover</span><span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"EAST"</span><span class="op">)</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t8" class="pln"><span class="n"><a href="#t8">8</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t9" class="pln"><span class="n"><a href="#t9">9</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t10" class="run"><span class="n"><a href="#t10">10</a></span><span class="t"><span class="key">def</span> <span class="nam">test_rover_can_move</span><span class="op">(</span><span class="nam">rover</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t11" class="run"><span class="n"><a href="#t11">11</a></span><span class="t"> <span class="nam">command</span> <span class="op">=</span> <span class="str">"F"</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t12" class="run"><span class="n"><a href="#t12">12</a></span><span class="t"> <span class="key">assert</span> <span class="nam">rover</span><span class="op">.</span><span class="nam">move</span><span class="op">(</span><span class="nam">command</span><span class="op">)</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t13" class="pln"><span class="n"><a href="#t13">13</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t14" class="pln"><span class="n"><a href="#t14">14</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t15" class="run"><span class="n"><a href="#t15">15</a></span><span class="t"><span class="op">@</span><span class="nam">pytest</span><span class="op">.</span><span class="nam">mark</span><span class="op">.</span><span class="nam">parametrize</span><span class="op">(</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t16" class="pln"><span class="n"><a href="#t16">16</a></span><span class="t"> <span class="op">(</span><span class="str">"init"</span><span class="op">,</span> <span class="str">"command"</span><span class="op">,</span> <span class="str">"expected"</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t17" class="pln"><span class="n"><a href="#t17">17</a></span><span class="t"> <span class="op">[</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t18" class="pln"><span class="n"><a href="#t18">18</a></span><span class="t"> <span class="op">(</span><span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"EAST"</span><span class="op">)</span><span class="op">,</span> <span class="str">"F"</span><span class="op">,</span> <span class="op">(</span><span class="num">1</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"EAST"</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t19" class="pln"><span class="n"><a href="#t19">19</a></span><span class="t"> <span class="op">(</span><span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"EAST"</span><span class="op">)</span><span class="op">,</span> <span class="str">"B"</span><span class="op">,</span> <span class="op">(</span><span class="op">-</span><span class="num">1</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"EAST"</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t20" class="pln"><span class="n"><a href="#t20">20</a></span><span class="t"> <span class="op">(</span><span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"EAST"</span><span class="op">)</span><span class="op">,</span> <span class="str">"R"</span><span class="op">,</span> <span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"SOUTH"</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t21" class="pln"><span class="n"><a href="#t21">21</a></span><span class="t"> <span class="op">(</span><span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"EAST"</span><span class="op">)</span><span class="op">,</span> <span class="str">"L"</span><span class="op">,</span> <span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"NORTH"</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t22" class="pln"><span class="n"><a href="#t22">22</a></span><span class="t"> <span class="com"># change starting point</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t23" class="pln"><span class="n"><a href="#t23">23</a></span><span class="t"> <span class="op">(</span><span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"WEST"</span><span class="op">)</span><span class="op">,</span> <span class="str">"F"</span><span class="op">,</span> <span class="op">(</span><span class="op">-</span><span class="num">1</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"WEST"</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t24" class="pln"><span class="n"><a href="#t24">24</a></span><span class="t"> <span class="op">(</span><span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"SOUTH"</span><span class="op">)</span><span class="op">,</span> <span class="str">"R"</span><span class="op">,</span> <span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"WEST"</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t25" class="pln"><span class="n"><a href="#t25">25</a></span><span class="t"> <span class="op">(</span><span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"SOUTH"</span><span class="op">)</span><span class="op">,</span> <span class="str">"F"</span><span class="op">,</span> <span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="op">-</span><span class="num">1</span><span class="op">,</span> <span class="str">"SOUTH"</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t26" class="pln"><span class="n"><a href="#t26">26</a></span><span class="t"> <span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t27" class="pln"><span class="n"><a href="#t27">27</a></span><span class="t"><span class="op">)</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t28" class="run"><span class="n"><a href="#t28">28</a></span><span class="t"><span class="key">def</span> <span class="nam">test_rover_receive_commands</span><span class="op">(</span><span class="nam">init</span><span class="op">,</span> <span class="nam">command</span><span class="op">,</span> <span class="nam">expected</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t29" class="run"><span class="n"><a href="#t29">29</a></span><span class="t"> <span class="nam">rover</span> <span class="op">=</span> <span class="nam">Rover</span><span class="op">(</span><span class="op">*</span><span class="nam">init</span><span class="op">)</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t30" class="run"><span class="n"><a href="#t30">30</a></span><span class="t"> <span class="key">assert</span> <span class="nam">rover</span><span class="op">.</span><span class="nam">move</span><span class="op">(</span><span class="nam">command</span><span class="op">)</span> <span class="op">==</span> <span class="nam">expected</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t31" class="pln"><span class="n"><a href="#t31">31</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t32" class="pln"><span class="n"><a href="#t32">32</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t33" class="run"><span class="n"><a href="#t33">33</a></span><span class="t"><span class="key">def</span> <span class="nam">test_rover_rejects_invalid_commands</span><span class="op">(</span><span class="nam">rover</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t34" class="run"><span class="n"><a href="#t34">34</a></span><span class="t"> <span class="nam">command</span> <span class="op">=</span> <span class="str">" W "</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t35" class="run"><span class="n"><a href="#t35">35</a></span><span class="t"> <span class="key">with</span> <span class="nam">pytest</span><span class="op">.</span><span class="nam">raises</span><span class="op">(</span><span class="nam">ValueError</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t36" class="run"><span class="n"><a href="#t36">36</a></span><span class="t"> <span class="nam">rover</span><span class="op">.</span><span class="nam">move</span><span class="op">(</span><span class="nam">command</span><span class="op">)</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t37" class="pln"><span class="n"><a href="#t37">37</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t38" class="pln"><span class="n"><a href="#t38">38</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t39" class="run"><span class="n"><a href="#t39">39</a></span><span class="t"><span class="op">@</span><span class="nam">pytest</span><span class="op">.</span><span class="nam">mark</span><span class="op">.</span><span class="nam">parametrize</span><span class="op">(</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t40" class="pln"><span class="n"><a href="#t40">40</a></span><span class="t"> <span class="op">(</span><span class="str">"init"</span><span class="op">,</span> <span class="str">"command"</span><span class="op">,</span> <span class="str">"expected"</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t41" class="pln"><span class="n"><a href="#t41">41</a></span><span class="t"> <span class="op">[</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t42" class="pln"><span class="n"><a href="#t42">42</a></span><span class="t"> <span class="op">(</span><span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"NORTH"</span><span class="op">)</span><span class="op">,</span> <span class="str">"FB"</span><span class="op">,</span> <span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"NORTH"</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t43" class="pln"><span class="n"><a href="#t43">43</a></span><span class="t"> <span class="op">(</span><span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"NORTH"</span><span class="op">)</span><span class="op">,</span> <span class="str">"FF"</span><span class="op">,</span> <span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="num">2</span><span class="op">,</span> <span class="str">"NORTH"</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t44" class="pln"><span class="n"><a href="#t44">44</a></span><span class="t"> <span class="op">(</span><span class="op">(</span><span class="num">4</span><span class="op">,</span> <span class="num">2</span><span class="op">,</span> <span class="str">"EAST"</span><span class="op">)</span><span class="op">,</span> <span class="str">"FLFFFRFLB"</span><span class="op">,</span> <span class="op">(</span><span class="num">6</span><span class="op">,</span> <span class="num">4</span><span class="op">,</span> <span class="str">"NORTH"</span><span class="op">)</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t45" class="pln"><span class="n"><a href="#t45">45</a></span><span class="t"> <span class="op">]</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t46" class="pln"><span class="n"><a href="#t46">46</a></span><span class="t"><span class="op">)</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t47" class="run"><span class="n"><a href="#t47">47</a></span><span class="t"><span class="key">def</span> <span class="nam">test_rover_can_receive_multiple_commands</span><span class="op">(</span><span class="nam">init</span><span class="op">,</span> <span class="nam">command</span><span class="op">,</span> <span class="nam">expected</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t48" class="run"><span class="n"><a href="#t48">48</a></span><span class="t"> <span class="nam">rover</span> <span class="op">=</span> <span class="nam">Rover</span><span class="op">(</span><span class="op">*</span><span class="nam">init</span><span class="op">)</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t49" class="run"><span class="n"><a href="#t49">49</a></span><span class="t"> <span class="key">assert</span> <span class="nam">rover</span><span class="op">.</span><span class="nam">move</span><span class="op">(</span><span class="nam">command</span><span class="op">)</span> <span class="op">==</span> <span class="nam">expected</span> </span><span class="r"></span></p>
|
||||||
|
</div>
|
||||||
|
<div id="footer">
|
||||||
|
<div class="content">
|
||||||
|
<p>
|
||||||
|
<a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.io/en/6.0b1">coverage.py v6.0b1</a>,
|
||||||
|
created at 2021-08-27 11:19 +0200
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
65
htmlcov/d_bf1a7b34124815c2___init___py.html
Normal file
65
htmlcov/d_bf1a7b34124815c2___init___py.html
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
|
||||||
|
<title>Coverage for rover/__init__.py: 100%</title>
|
||||||
|
<link rel="icon" sizes="32x32" href="favicon_32.png">
|
||||||
|
<link rel="stylesheet" href="style.css" type="text/css">
|
||||||
|
<script type="text/javascript" src="jquery.min.js"></script>
|
||||||
|
<script type="text/javascript" src="jquery.hotkeys.js"></script>
|
||||||
|
<script type="text/javascript" src="jquery.isonscreen.js"></script>
|
||||||
|
<script type="text/javascript" src="coverage_html.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery(document).ready(coverage.pyfile_ready);
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="pyfile">
|
||||||
|
<div id="header">
|
||||||
|
<div class="content">
|
||||||
|
<h1>Coverage for <b>rover/__init__.py</b> :
|
||||||
|
<span class="pc_cov">100%</span>
|
||||||
|
</h1>
|
||||||
|
<img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
|
||||||
|
<h2 class="stats">
|
||||||
|
0 statements
|
||||||
|
<button type="button" class="run shortkey_r button_toggle_run" title="Toggle lines run">0 run</button>
|
||||||
|
<button type="button" class="mis show_mis shortkey_m button_toggle_mis" title="Toggle lines missing">0 missing</button>
|
||||||
|
<button type="button" class="exc show_exc shortkey_x button_toggle_exc" title="Toggle lines excluded">0 excluded</button>
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="help_panel">
|
||||||
|
<img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
|
||||||
|
<p class="legend">Hot-keys on this page</p>
|
||||||
|
<div>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">r</span>
|
||||||
|
<span class="key">m</span>
|
||||||
|
<span class="key">x</span>
|
||||||
|
<span class="key">p</span> toggle line displays
|
||||||
|
</p>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">j</span>
|
||||||
|
<span class="key">k</span> next/prev highlighted chunk
|
||||||
|
</p>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">0</span> (zero) top of page
|
||||||
|
</p>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">1</span> (one) first highlighted chunk
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="source">
|
||||||
|
</div>
|
||||||
|
<div id="footer">
|
||||||
|
<div class="content">
|
||||||
|
<p>
|
||||||
|
<a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.io/en/6.0b1">coverage.py v6.0b1</a>,
|
||||||
|
created at 2021-08-27 10:43 +0200
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
110
htmlcov/d_bf1a7b34124815c2_rover_py.html
Normal file
110
htmlcov/d_bf1a7b34124815c2_rover_py.html
Normal file
|
|
@ -0,0 +1,110 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=emulateIE7" />
|
||||||
|
<title>Coverage for rover/rover.py: 100%</title>
|
||||||
|
<link rel="icon" sizes="32x32" href="favicon_32.png">
|
||||||
|
<link rel="stylesheet" href="style.css" type="text/css">
|
||||||
|
<script type="text/javascript" src="jquery.min.js"></script>
|
||||||
|
<script type="text/javascript" src="jquery.hotkeys.js"></script>
|
||||||
|
<script type="text/javascript" src="jquery.isonscreen.js"></script>
|
||||||
|
<script type="text/javascript" src="coverage_html.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery(document).ready(coverage.pyfile_ready);
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="pyfile">
|
||||||
|
<div id="header">
|
||||||
|
<div class="content">
|
||||||
|
<h1>Coverage for <b>rover/rover.py</b> :
|
||||||
|
<span class="pc_cov">100%</span>
|
||||||
|
</h1>
|
||||||
|
<img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
|
||||||
|
<h2 class="stats">
|
||||||
|
30 statements
|
||||||
|
<button type="button" class="run shortkey_r button_toggle_run" title="Toggle lines run">30 run</button>
|
||||||
|
<button type="button" class="mis show_mis shortkey_m button_toggle_mis" title="Toggle lines missing">0 missing</button>
|
||||||
|
<button type="button" class="exc show_exc shortkey_x button_toggle_exc" title="Toggle lines excluded">0 excluded</button>
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="help_panel">
|
||||||
|
<img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
|
||||||
|
<p class="legend">Hot-keys on this page</p>
|
||||||
|
<div>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">r</span>
|
||||||
|
<span class="key">m</span>
|
||||||
|
<span class="key">x</span>
|
||||||
|
<span class="key">p</span> toggle line displays
|
||||||
|
</p>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">j</span>
|
||||||
|
<span class="key">k</span> next/prev highlighted chunk
|
||||||
|
</p>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">0</span> (zero) top of page
|
||||||
|
</p>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">1</span> (one) first highlighted chunk
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="source">
|
||||||
|
<p id="t1" class="run"><span class="n"><a href="#t1">1</a></span><span class="t"><span class="key">import</span> <span class="nam">dataclasses</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t2" class="pln"><span class="n"><a href="#t2">2</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t3" class="pln"><span class="n"><a href="#t3">3</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t4" class="run"><span class="n"><a href="#t4">4</a></span><span class="t"><span class="op">@</span><span class="nam">dataclasses</span><span class="op">.</span><span class="nam">dataclass</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t5" class="run"><span class="n"><a href="#t5">5</a></span><span class="t"><span class="key">class</span> <span class="nam">Rover</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t6" class="run"><span class="n"><a href="#t6">6</a></span><span class="t"> <span class="nam">x</span><span class="op">:</span> <span class="nam">int</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t7" class="run"><span class="n"><a href="#t7">7</a></span><span class="t"> <span class="nam">y</span><span class="op">:</span> <span class="nam">int</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t8" class="run"><span class="n"><a href="#t8">8</a></span><span class="t"> <span class="nam">direction</span><span class="op">:</span> <span class="nam">str</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t9" class="pln"><span class="n"><a href="#t9">9</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t10" class="run"><span class="n"><a href="#t10">10</a></span><span class="t"> <span class="nam">valid_commands</span> <span class="op">=</span> <span class="op">(</span><span class="str">"F"</span><span class="op">,</span> <span class="str">"B"</span><span class="op">,</span> <span class="str">"R"</span><span class="op">,</span> <span class="str">"L"</span><span class="op">)</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t11" class="pln"><span class="n"><a href="#t11">11</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t12" class="run"><span class="n"><a href="#t12">12</a></span><span class="t"> <span class="nam">direction_map</span> <span class="op">=</span> <span class="op">{</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t13" class="pln"><span class="n"><a href="#t13">13</a></span><span class="t"> <span class="str">"NORTH"</span><span class="op">:</span> <span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="num">1</span><span class="op">,</span> <span class="str">"WEST"</span><span class="op">,</span> <span class="str">"EAST"</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t14" class="pln"><span class="n"><a href="#t14">14</a></span><span class="t"> <span class="str">"EAST"</span><span class="op">:</span> <span class="op">(</span><span class="num">1</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"NORTH"</span><span class="op">,</span> <span class="str">"SOUTH"</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t15" class="pln"><span class="n"><a href="#t15">15</a></span><span class="t"> <span class="str">"SOUTH"</span><span class="op">:</span> <span class="op">(</span><span class="num">0</span><span class="op">,</span> <span class="op">-</span><span class="num">1</span><span class="op">,</span> <span class="str">"EAST"</span><span class="op">,</span> <span class="str">"WEST"</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t16" class="pln"><span class="n"><a href="#t16">16</a></span><span class="t"> <span class="str">"WEST"</span><span class="op">:</span> <span class="op">(</span><span class="op">-</span><span class="num">1</span><span class="op">,</span> <span class="num">0</span><span class="op">,</span> <span class="str">"SOUTH"</span><span class="op">,</span> <span class="str">"NORTH"</span><span class="op">)</span><span class="op">,</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t17" class="pln"><span class="n"><a href="#t17">17</a></span><span class="t"> <span class="op">}</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t18" class="pln"><span class="n"><a href="#t18">18</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t19" class="run"><span class="n"><a href="#t19">19</a></span><span class="t"> <span class="key">def</span> <span class="nam">is_valid_command</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">command</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t20" class="run"><span class="n"><a href="#t20">20</a></span><span class="t"> <span class="key">for</span> <span class="nam">ch</span> <span class="key">in</span> <span class="nam">command</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t21" class="run"><span class="n"><a href="#t21">21</a></span><span class="t"> <span class="key">if</span> <span class="nam">ch</span> <span class="key">not</span> <span class="key">in</span> <span class="nam">self</span><span class="op">.</span><span class="nam">valid_commands</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t22" class="run"><span class="n"><a href="#t22">22</a></span><span class="t"> <span class="key">return</span> <span class="key">False</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t23" class="pln"><span class="n"><a href="#t23">23</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t24" class="run"><span class="n"><a href="#t24">24</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t25" class="pln"><span class="n"><a href="#t25">25</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t26" class="run"><span class="n"><a href="#t26">26</a></span><span class="t"> <span class="key">def</span> <span class="nam">move</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">command</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t27" class="run"><span class="n"><a href="#t27">27</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">self</span><span class="op">.</span><span class="nam">is_valid_command</span><span class="op">(</span><span class="nam">command</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t28" class="run"><span class="n"><a href="#t28">28</a></span><span class="t"> <span class="key">raise</span> <span class="nam">ValueError</span><span class="op">(</span><span class="str">"invalid command. The rover does not move"</span><span class="op">)</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t29" class="pln"><span class="n"><a href="#t29">29</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t30" class="run"><span class="n"><a href="#t30">30</a></span><span class="t"> <span class="key">for</span> <span class="nam">ch</span> <span class="key">in</span> <span class="nam">command</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t31" class="run"><span class="n"><a href="#t31">31</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">_move_one_step</span><span class="op">(</span><span class="nam">ch</span><span class="op">)</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t32" class="pln"><span class="n"><a href="#t32">32</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t33" class="run"><span class="n"><a href="#t33">33</a></span><span class="t"> <span class="key">return</span> <span class="nam">self</span><span class="op">.</span><span class="nam">x</span><span class="op">,</span> <span class="nam">self</span><span class="op">.</span><span class="nam">y</span><span class="op">,</span> <span class="nam">self</span><span class="op">.</span><span class="nam">direction</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t34" class="pln"><span class="n"><a href="#t34">34</a></span><span class="t"> </span><span class="r"></span></p>
|
||||||
|
<p id="t35" class="run"><span class="n"><a href="#t35">35</a></span><span class="t"> <span class="key">def</span> <span class="nam">_move_one_step</span><span class="op">(</span><span class="nam">self</span><span class="op">,</span> <span class="nam">command</span><span class="op">)</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t36" class="run"><span class="n"><a href="#t36">36</a></span><span class="t"> <span class="key">if</span> <span class="nam">command</span> <span class="op">==</span> <span class="str">"B"</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t37" class="run"><span class="n"><a href="#t37">37</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">x</span> <span class="op">-=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">direction_map</span><span class="op">[</span><span class="nam">self</span><span class="op">.</span><span class="nam">direction</span><span class="op">]</span><span class="op">[</span><span class="num">0</span><span class="op">]</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t38" class="run"><span class="n"><a href="#t38">38</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">y</span> <span class="op">-=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">direction_map</span><span class="op">[</span><span class="nam">self</span><span class="op">.</span><span class="nam">direction</span><span class="op">]</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t39" class="run"><span class="n"><a href="#t39">39</a></span><span class="t"> <span class="key">if</span> <span class="nam">command</span> <span class="op">==</span> <span class="str">"F"</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t40" class="run"><span class="n"><a href="#t40">40</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">x</span> <span class="op">+=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">direction_map</span><span class="op">[</span><span class="nam">self</span><span class="op">.</span><span class="nam">direction</span><span class="op">]</span><span class="op">[</span><span class="num">0</span><span class="op">]</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t41" class="run"><span class="n"><a href="#t41">41</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">y</span> <span class="op">+=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">direction_map</span><span class="op">[</span><span class="nam">self</span><span class="op">.</span><span class="nam">direction</span><span class="op">]</span><span class="op">[</span><span class="num">1</span><span class="op">]</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t42" class="run"><span class="n"><a href="#t42">42</a></span><span class="t"> <span class="key">if</span> <span class="nam">command</span> <span class="op">==</span> <span class="str">"R"</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t43" class="run"><span class="n"><a href="#t43">43</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">direction</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">direction_map</span><span class="op">[</span><span class="nam">self</span><span class="op">.</span><span class="nam">direction</span><span class="op">]</span><span class="op">[</span><span class="num">3</span><span class="op">]</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t44" class="run"><span class="n"><a href="#t44">44</a></span><span class="t"> <span class="key">if</span> <span class="nam">command</span> <span class="op">==</span> <span class="str">"L"</span><span class="op">:</span> </span><span class="r"></span></p>
|
||||||
|
<p id="t45" class="run"><span class="n"><a href="#t45">45</a></span><span class="t"> <span class="nam">self</span><span class="op">.</span><span class="nam">direction</span> <span class="op">=</span> <span class="nam">self</span><span class="op">.</span><span class="nam">direction_map</span><span class="op">[</span><span class="nam">self</span><span class="op">.</span><span class="nam">direction</span><span class="op">]</span><span class="op">[</span><span class="num">2</span><span class="op">]</span> </span><span class="r"></span></p>
|
||||||
|
</div>
|
||||||
|
<div id="footer">
|
||||||
|
<div class="content">
|
||||||
|
<p>
|
||||||
|
<a class="nav" href="index.html">« index</a> <a class="nav" href="https://coverage.readthedocs.io/en/6.0b1">coverage.py v6.0b1</a>,
|
||||||
|
created at 2021-08-27 11:18 +0200
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
BIN
htmlcov/favicon_32.png
Normal file
BIN
htmlcov/favicon_32.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
113
htmlcov/index.html
Normal file
113
htmlcov/index.html
Normal file
|
|
@ -0,0 +1,113 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>Coverage report</title>
|
||||||
|
<link rel="icon" sizes="32x32" href="favicon_32.png">
|
||||||
|
<link rel="stylesheet" href="style.css" type="text/css">
|
||||||
|
<script type="text/javascript" src="jquery.min.js"></script>
|
||||||
|
<script type="text/javascript" src="jquery.ba-throttle-debounce.min.js"></script>
|
||||||
|
<script type="text/javascript" src="jquery.tablesorter.min.js"></script>
|
||||||
|
<script type="text/javascript" src="jquery.hotkeys.js"></script>
|
||||||
|
<script type="text/javascript" src="coverage_html.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery(document).ready(coverage.index_ready);
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body class="indexfile">
|
||||||
|
<div id="header">
|
||||||
|
<div class="content">
|
||||||
|
<h1>Coverage report:
|
||||||
|
<span class="pc_cov">100%</span>
|
||||||
|
</h1>
|
||||||
|
<img id="keyboard_icon" src="keybd_closed.png" alt="Show keyboard shortcuts" />
|
||||||
|
<form id="filter_container">
|
||||||
|
<input id="filter" type="text" value="" placeholder="filter..." />
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="help_panel">
|
||||||
|
<img id="panel_icon" src="keybd_open.png" alt="Hide keyboard shortcuts" />
|
||||||
|
<p class="legend">Hot-keys on this page</p>
|
||||||
|
<div>
|
||||||
|
<p class="keyhelp">
|
||||||
|
<span class="key">n</span>
|
||||||
|
<span class="key">s</span>
|
||||||
|
<span class="key">m</span>
|
||||||
|
<span class="key">x</span>
|
||||||
|
<span class="key">c</span> change column sorting
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="index">
|
||||||
|
<table class="index">
|
||||||
|
<thead>
|
||||||
|
<tr class="tablehead" title="Click to sort">
|
||||||
|
<th class="name left headerSortDown shortkey_n">Module</th>
|
||||||
|
<th class="shortkey_s">statements</th>
|
||||||
|
<th class="shortkey_m">missing</th>
|
||||||
|
<th class="shortkey_x">excluded</th>
|
||||||
|
<th class="right shortkey_c">coverage</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tfoot>
|
||||||
|
<tr class="total">
|
||||||
|
<td class="name left">Total</td>
|
||||||
|
<td>54</td>
|
||||||
|
<td>0</td>
|
||||||
|
<td>0</td>
|
||||||
|
<td class="right" data-ratio="54 54">100%</td>
|
||||||
|
</tr>
|
||||||
|
</tfoot>
|
||||||
|
<tbody>
|
||||||
|
<tr class="file">
|
||||||
|
<td class="name left"><a href="d_bf1a7b34124815c2___init___py.html">rover/__init__.py</a></td>
|
||||||
|
<td>0</td>
|
||||||
|
<td>0</td>
|
||||||
|
<td>0</td>
|
||||||
|
<td class="right" data-ratio="0 0">100%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="file">
|
||||||
|
<td class="name left"><a href="d_bf1a7b34124815c2_rover_py.html">rover/rover.py</a></td>
|
||||||
|
<td>30</td>
|
||||||
|
<td>0</td>
|
||||||
|
<td>0</td>
|
||||||
|
<td class="right" data-ratio="30 30">100%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="file">
|
||||||
|
<td class="name left"><a href="d_a44f0ac069e85531___init___py.html">tests/__init__.py</a></td>
|
||||||
|
<td>0</td>
|
||||||
|
<td>0</td>
|
||||||
|
<td>0</td>
|
||||||
|
<td class="right" data-ratio="0 0">100%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="file">
|
||||||
|
<td class="name left"><a href="d_a44f0ac069e85531_conftest_py.html">tests/conftest.py</a></td>
|
||||||
|
<td>5</td>
|
||||||
|
<td>0</td>
|
||||||
|
<td>0</td>
|
||||||
|
<td class="right" data-ratio="5 5">100%</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="file">
|
||||||
|
<td class="name left"><a href="d_a44f0ac069e85531_test_rover_py.html">tests/test_rover.py</a></td>
|
||||||
|
<td>19</td>
|
||||||
|
<td>0</td>
|
||||||
|
<td>0</td>
|
||||||
|
<td class="right" data-ratio="19 19">100%</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<p id="no_rows">
|
||||||
|
No items found using the specified filter.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div id="footer">
|
||||||
|
<div class="content">
|
||||||
|
<p>
|
||||||
|
<a class="nav" href="https://coverage.readthedocs.io/en/6.0b1">coverage.py v6.0b1</a>,
|
||||||
|
created at 2021-08-27 11:19 +0200
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
9
htmlcov/jquery.ba-throttle-debounce.min.js
vendored
Normal file
9
htmlcov/jquery.ba-throttle-debounce.min.js
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
/*
|
||||||
|
* jQuery throttle / debounce - v1.1 - 3/7/2010
|
||||||
|
* http://benalman.com/projects/jquery-throttle-debounce-plugin/
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010 "Cowboy" Ben Alman
|
||||||
|
* Dual licensed under the MIT and GPL licenses.
|
||||||
|
* http://benalman.com/about/license/
|
||||||
|
*/
|
||||||
|
(function(b,c){var $=b.jQuery||b.Cowboy||(b.Cowboy={}),a;$.throttle=a=function(e,f,j,i){var h,d=0;if(typeof f!=="boolean"){i=j;j=f;f=c}function g(){var o=this,m=+new Date()-d,n=arguments;function l(){d=+new Date();j.apply(o,n)}function k(){h=c}if(i&&!h){l()}h&&clearTimeout(h);if(i===c&&m>e){l()}else{if(f!==true){h=setTimeout(i?k:l,i===c?e-m:e)}}}if($.guid){g.guid=j.guid=j.guid||$.guid++}return g};$.debounce=function(d,e,f){return f===c?a(d,e,false):a(d,f,e!==false)}})(this);
|
||||||
99
htmlcov/jquery.hotkeys.js
Normal file
99
htmlcov/jquery.hotkeys.js
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
/*
|
||||||
|
* jQuery Hotkeys Plugin
|
||||||
|
* Copyright 2010, John Resig
|
||||||
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||||
|
*
|
||||||
|
* Based upon the plugin by Tzury Bar Yochay:
|
||||||
|
* http://github.com/tzuryby/hotkeys
|
||||||
|
*
|
||||||
|
* Original idea by:
|
||||||
|
* Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(jQuery){
|
||||||
|
|
||||||
|
jQuery.hotkeys = {
|
||||||
|
version: "0.8",
|
||||||
|
|
||||||
|
specialKeys: {
|
||||||
|
8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause",
|
||||||
|
20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home",
|
||||||
|
37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del",
|
||||||
|
96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7",
|
||||||
|
104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/",
|
||||||
|
112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8",
|
||||||
|
120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 191: "/", 224: "meta"
|
||||||
|
},
|
||||||
|
|
||||||
|
shiftNums: {
|
||||||
|
"`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&",
|
||||||
|
"8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<",
|
||||||
|
".": ">", "/": "?", "\\": "|"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function keyHandler( handleObj ) {
|
||||||
|
// Only care when a possible input has been specified
|
||||||
|
if ( typeof handleObj.data !== "string" ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var origHandler = handleObj.handler,
|
||||||
|
keys = handleObj.data.toLowerCase().split(" ");
|
||||||
|
|
||||||
|
handleObj.handler = function( event ) {
|
||||||
|
// Don't fire in text-accepting inputs that we didn't directly bind to
|
||||||
|
if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) ||
|
||||||
|
event.target.type === "text") ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keypress represents characters, not special keys
|
||||||
|
var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ],
|
||||||
|
character = String.fromCharCode( event.which ).toLowerCase(),
|
||||||
|
key, modif = "", possible = {};
|
||||||
|
|
||||||
|
// check combinations (alt|ctrl|shift+anything)
|
||||||
|
if ( event.altKey && special !== "alt" ) {
|
||||||
|
modif += "alt+";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( event.ctrlKey && special !== "ctrl" ) {
|
||||||
|
modif += "ctrl+";
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Need to make sure this works consistently across platforms
|
||||||
|
if ( event.metaKey && !event.ctrlKey && special !== "meta" ) {
|
||||||
|
modif += "meta+";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( event.shiftKey && special !== "shift" ) {
|
||||||
|
modif += "shift+";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( special ) {
|
||||||
|
possible[ modif + special ] = true;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
possible[ modif + character ] = true;
|
||||||
|
possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true;
|
||||||
|
|
||||||
|
// "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
|
||||||
|
if ( modif === "shift+" ) {
|
||||||
|
possible[ jQuery.hotkeys.shiftNums[ character ] ] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( var i = 0, l = keys.length; i < l; i++ ) {
|
||||||
|
if ( possible[ keys[i] ] ) {
|
||||||
|
return origHandler.apply( this, arguments );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.each([ "keydown", "keyup", "keypress" ], function() {
|
||||||
|
jQuery.event.special[ this ] = { add: keyHandler };
|
||||||
|
});
|
||||||
|
|
||||||
|
})( jQuery );
|
||||||
53
htmlcov/jquery.isonscreen.js
Normal file
53
htmlcov/jquery.isonscreen.js
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
/* Copyright (c) 2010
|
||||||
|
* @author Laurence Wheway
|
||||||
|
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
|
||||||
|
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
|
||||||
|
*
|
||||||
|
* @version 1.2.0
|
||||||
|
*/
|
||||||
|
(function($) {
|
||||||
|
jQuery.extend({
|
||||||
|
isOnScreen: function(box, container) {
|
||||||
|
//ensure numbers come in as intgers (not strings) and remove 'px' is it's there
|
||||||
|
for(var i in box){box[i] = parseFloat(box[i])};
|
||||||
|
for(var i in container){container[i] = parseFloat(container[i])};
|
||||||
|
|
||||||
|
if(!container){
|
||||||
|
container = {
|
||||||
|
left: $(window).scrollLeft(),
|
||||||
|
top: $(window).scrollTop(),
|
||||||
|
width: $(window).width(),
|
||||||
|
height: $(window).height()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( box.left+box.width-container.left > 0 &&
|
||||||
|
box.left < container.width+container.left &&
|
||||||
|
box.top+box.height-container.top > 0 &&
|
||||||
|
box.top < container.height+container.top
|
||||||
|
) return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
jQuery.fn.isOnScreen = function (container) {
|
||||||
|
for(var i in container){container[i] = parseFloat(container[i])};
|
||||||
|
|
||||||
|
if(!container){
|
||||||
|
container = {
|
||||||
|
left: $(window).scrollLeft(),
|
||||||
|
top: $(window).scrollTop(),
|
||||||
|
width: $(window).width(),
|
||||||
|
height: $(window).height()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( $(this).offset().left+$(this).width()-container.left > 0 &&
|
||||||
|
$(this).offset().left < container.width+container.left &&
|
||||||
|
$(this).offset().top+$(this).height()-container.top > 0 &&
|
||||||
|
$(this).offset().top < container.height+container.top
|
||||||
|
) return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
})(jQuery);
|
||||||
4
htmlcov/jquery.min.js
vendored
Normal file
4
htmlcov/jquery.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
htmlcov/jquery.tablesorter.min.js
vendored
Normal file
2
htmlcov/jquery.tablesorter.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
htmlcov/keybd_closed.png
Normal file
BIN
htmlcov/keybd_closed.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.8 KiB |
BIN
htmlcov/keybd_open.png
Normal file
BIN
htmlcov/keybd_open.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.8 KiB |
1
htmlcov/status.json
Normal file
1
htmlcov/status.json
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"format":2,"version":"6.0b1","globals":"9bd57ebde26eb2f4bf8646481dbf1d3b","files":{"d_bf1a7b34124815c2___init___py":{"hash":"3c77fc9ef7f887ac2508d4109cf92472","index":{"nums":[0,1,0,0,0,0,0,0],"html_filename":"d_bf1a7b34124815c2___init___py.html","relative_filename":"rover/__init__.py"}},"d_a44f0ac069e85531___init___py":{"hash":"3c77fc9ef7f887ac2508d4109cf92472","index":{"nums":[0,1,0,0,0,0,0,0],"html_filename":"d_a44f0ac069e85531___init___py.html","relative_filename":"tests/__init__.py"}},"d_a44f0ac069e85531_test_rover_py":{"hash":"4d1bd2b75fabcbf83a857a2c86f6afe8","index":{"nums":[0,1,19,0,0,0,0,0],"html_filename":"d_a44f0ac069e85531_test_rover_py.html","relative_filename":"tests/test_rover.py"}},"d_bf1a7b34124815c2_rover_py":{"hash":"07cd27855c88f8cfc60965c599b883d4","index":{"nums":[0,1,30,0,0,0,0,0],"html_filename":"d_bf1a7b34124815c2_rover_py.html","relative_filename":"rover/rover.py"}},"d_a44f0ac069e85531_conftest_py":{"hash":"131dc5829333225ffeda75380140e18e","index":{"nums":[0,1,5,0,0,0,0,0],"html_filename":"d_a44f0ac069e85531_conftest_py.html","relative_filename":"tests/conftest.py"}}}}
|
||||||
291
htmlcov/style.css
Normal file
291
htmlcov/style.css
Normal file
|
|
@ -0,0 +1,291 @@
|
||||||
|
@charset "UTF-8";
|
||||||
|
/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */
|
||||||
|
/* For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt */
|
||||||
|
/* Don't edit this .css file. Edit the .scss file instead! */
|
||||||
|
html, body, h1, h2, h3, p, table, td, th { margin: 0; padding: 0; border: 0; font-weight: inherit; font-style: inherit; font-size: 100%; font-family: inherit; vertical-align: baseline; }
|
||||||
|
|
||||||
|
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 1em; background: #fff; color: #000; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { body { background: #1e1e1e; } }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { body { color: #eee; } }
|
||||||
|
|
||||||
|
html > body { font-size: 16px; }
|
||||||
|
|
||||||
|
a:active, a:focus { outline: 2px dashed #007acc; }
|
||||||
|
|
||||||
|
p { font-size: .875em; line-height: 1.4em; }
|
||||||
|
|
||||||
|
table { border-collapse: collapse; }
|
||||||
|
|
||||||
|
td { vertical-align: top; }
|
||||||
|
|
||||||
|
table tr.hidden { display: none !important; }
|
||||||
|
|
||||||
|
p#no_rows { display: none; font-size: 1.2em; }
|
||||||
|
|
||||||
|
a.nav { text-decoration: none; color: inherit; }
|
||||||
|
|
||||||
|
a.nav:hover { text-decoration: underline; color: inherit; }
|
||||||
|
|
||||||
|
#header { background: #f8f8f8; width: 100%; border-bottom: 1px solid #eee; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #header { background: black; } }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #header { border-color: #333; } }
|
||||||
|
|
||||||
|
.indexfile #footer { margin: 1rem 3.5rem; }
|
||||||
|
|
||||||
|
.pyfile #footer { margin: 1rem 1rem; }
|
||||||
|
|
||||||
|
#footer .content { padding: 0; color: #666; font-style: italic; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #footer .content { color: #aaa; } }
|
||||||
|
|
||||||
|
#index { margin: 1rem 0 0 3.5rem; }
|
||||||
|
|
||||||
|
#header .content { padding: 1rem 3.5rem; }
|
||||||
|
|
||||||
|
h1 { font-size: 1.25em; display: inline-block; }
|
||||||
|
|
||||||
|
#filter_container { float: right; margin: 0 2em 0 0; }
|
||||||
|
|
||||||
|
#filter_container input { width: 10em; padding: 0.2em 0.5em; border: 2px solid #ccc; background: #fff; color: #000; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #filter_container input { border-color: #444; } }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #filter_container input { background: #1e1e1e; } }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #filter_container input { color: #eee; } }
|
||||||
|
|
||||||
|
#filter_container input:focus { border-color: #007acc; }
|
||||||
|
|
||||||
|
h2.stats { margin-top: .5em; font-size: 1em; }
|
||||||
|
|
||||||
|
.stats button { font-family: inherit; font-size: inherit; border: 1px solid; border-radius: .2em; color: inherit; padding: .1em .5em; margin: 1px calc(.1em + 1px); cursor: pointer; border-color: #ccc; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { .stats button { border-color: #444; } }
|
||||||
|
|
||||||
|
.stats button:active, .stats button:focus { outline: 2px dashed #007acc; }
|
||||||
|
|
||||||
|
.stats button:active, .stats button:focus { outline: 2px dashed #007acc; }
|
||||||
|
|
||||||
|
.stats button.run { background: #eeffee; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { .stats button.run { background: #373d29; } }
|
||||||
|
|
||||||
|
.stats button.run.show_run { background: #dfd; border: 2px solid #00dd00; margin: 0 .1em; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { .stats button.run.show_run { background: #373d29; } }
|
||||||
|
|
||||||
|
.stats button.mis { background: #ffeeee; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { .stats button.mis { background: #4b1818; } }
|
||||||
|
|
||||||
|
.stats button.mis.show_mis { background: #fdd; border: 2px solid #ff0000; margin: 0 .1em; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { .stats button.mis.show_mis { background: #4b1818; } }
|
||||||
|
|
||||||
|
.stats button.exc { background: #f7f7f7; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { .stats button.exc { background: #333; } }
|
||||||
|
|
||||||
|
.stats button.exc.show_exc { background: #eee; border: 2px solid #808080; margin: 0 .1em; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { .stats button.exc.show_exc { background: #333; } }
|
||||||
|
|
||||||
|
.stats button.par { background: #ffffd5; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { .stats button.par { background: #650; } }
|
||||||
|
|
||||||
|
.stats button.par.show_par { background: #ffa; border: 2px solid #dddd00; margin: 0 .1em; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { .stats button.par.show_par { background: #650; } }
|
||||||
|
|
||||||
|
.help_panel, #source p .annotate.long { display: none; position: absolute; z-index: 999; background: #ffffcc; border: 1px solid #888; border-radius: .2em; color: #333; padding: .25em .5em; }
|
||||||
|
|
||||||
|
#source p .annotate.long { white-space: normal; float: right; top: 1.75em; right: 1em; height: auto; }
|
||||||
|
|
||||||
|
#keyboard_icon { float: right; margin: 5px; cursor: pointer; }
|
||||||
|
|
||||||
|
.help_panel { padding: .75em; border: 1px solid #883; }
|
||||||
|
|
||||||
|
.help_panel .legend { font-style: italic; margin-bottom: 1em; }
|
||||||
|
|
||||||
|
.indexfile .help_panel { width: 25em; }
|
||||||
|
|
||||||
|
.pyfile .help_panel { width: 18em; }
|
||||||
|
|
||||||
|
#panel_icon { float: right; cursor: pointer; }
|
||||||
|
|
||||||
|
.keyhelp { margin-top: .75em; }
|
||||||
|
|
||||||
|
.keyhelp .key { border: 1px solid black; border-color: #888 #333 #333 #888; padding: .1em .35em; font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-weight: bold; background: #eee; }
|
||||||
|
|
||||||
|
#source { padding: 1em 0 1em 3.5rem; font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; }
|
||||||
|
|
||||||
|
#source p { position: relative; white-space: pre; }
|
||||||
|
|
||||||
|
#source p * { box-sizing: border-box; }
|
||||||
|
|
||||||
|
#source p .n { float: left; text-align: right; width: 3.5rem; box-sizing: border-box; margin-left: -3.5rem; padding-right: 1em; color: #999; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p .n { color: #777; } }
|
||||||
|
|
||||||
|
#source p .n a { text-decoration: none; color: #999; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p .n a { color: #777; } }
|
||||||
|
|
||||||
|
#source p .n a:hover { text-decoration: underline; color: #999; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p .n a:hover { color: #777; } }
|
||||||
|
|
||||||
|
#source p.highlight .n { background: #ffdd00; }
|
||||||
|
|
||||||
|
#source p .t { display: inline-block; width: 100%; box-sizing: border-box; margin-left: -.5em; padding-left: 0.3em; border-left: 0.2em solid #fff; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p .t { border-color: #1e1e1e; } }
|
||||||
|
|
||||||
|
#source p .t:hover { background: #f2f2f2; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p .t:hover { background: #282828; } }
|
||||||
|
|
||||||
|
#source p .t:hover ~ .r .annotate.long { display: block; }
|
||||||
|
|
||||||
|
#source p .t .com { color: #008000; font-style: italic; line-height: 1px; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p .t .com { color: #6A9955; } }
|
||||||
|
|
||||||
|
#source p .t .key { font-weight: bold; line-height: 1px; }
|
||||||
|
|
||||||
|
#source p .t .str { color: #0451A5; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p .t .str { color: #9CDCFE; } }
|
||||||
|
|
||||||
|
#source p.mis .t { border-left: 0.2em solid #ff0000; }
|
||||||
|
|
||||||
|
#source p.mis.show_mis .t { background: #fdd; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p.mis.show_mis .t { background: #4b1818; } }
|
||||||
|
|
||||||
|
#source p.mis.show_mis .t:hover { background: #f2d2d2; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p.mis.show_mis .t:hover { background: #532323; } }
|
||||||
|
|
||||||
|
#source p.run .t { border-left: 0.2em solid #00dd00; }
|
||||||
|
|
||||||
|
#source p.run.show_run .t { background: #dfd; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p.run.show_run .t { background: #373d29; } }
|
||||||
|
|
||||||
|
#source p.run.show_run .t:hover { background: #d2f2d2; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p.run.show_run .t:hover { background: #404633; } }
|
||||||
|
|
||||||
|
#source p.exc .t { border-left: 0.2em solid #808080; }
|
||||||
|
|
||||||
|
#source p.exc.show_exc .t { background: #eee; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p.exc.show_exc .t { background: #333; } }
|
||||||
|
|
||||||
|
#source p.exc.show_exc .t:hover { background: #e2e2e2; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p.exc.show_exc .t:hover { background: #3c3c3c; } }
|
||||||
|
|
||||||
|
#source p.par .t { border-left: 0.2em solid #dddd00; }
|
||||||
|
|
||||||
|
#source p.par.show_par .t { background: #ffa; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p.par.show_par .t { background: #650; } }
|
||||||
|
|
||||||
|
#source p.par.show_par .t:hover { background: #f2f2a2; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p.par.show_par .t:hover { background: #6d5d0c; } }
|
||||||
|
|
||||||
|
#source p .r { position: absolute; top: 0; right: 2.5em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; }
|
||||||
|
|
||||||
|
#source p .annotate { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; color: #666; padding-right: .5em; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p .annotate { color: #ddd; } }
|
||||||
|
|
||||||
|
#source p .annotate.short:hover ~ .long { display: block; }
|
||||||
|
|
||||||
|
#source p .annotate.long { width: 30em; right: 2.5em; }
|
||||||
|
|
||||||
|
#source p input { display: none; }
|
||||||
|
|
||||||
|
#source p input ~ .r label.ctx { cursor: pointer; border-radius: .25em; }
|
||||||
|
|
||||||
|
#source p input ~ .r label.ctx::before { content: "▶ "; }
|
||||||
|
|
||||||
|
#source p input ~ .r label.ctx:hover { background: #d5f7ff; color: #666; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p input ~ .r label.ctx:hover { background: #0f3a42; } }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p input ~ .r label.ctx:hover { color: #aaa; } }
|
||||||
|
|
||||||
|
#source p input:checked ~ .r label.ctx { background: #aef; color: #666; border-radius: .75em .75em 0 0; padding: 0 .5em; margin: -.25em 0; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p input:checked ~ .r label.ctx { background: #056; } }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p input:checked ~ .r label.ctx { color: #aaa; } }
|
||||||
|
|
||||||
|
#source p input:checked ~ .r label.ctx::before { content: "▼ "; }
|
||||||
|
|
||||||
|
#source p input:checked ~ .ctxs { padding: .25em .5em; overflow-y: scroll; max-height: 10.5em; }
|
||||||
|
|
||||||
|
#source p label.ctx { color: #999; display: inline-block; padding: 0 .5em; font-size: .8333em; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p label.ctx { color: #777; } }
|
||||||
|
|
||||||
|
#source p .ctxs { display: block; max-height: 0; overflow-y: hidden; transition: all .2s; padding: 0 .5em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; white-space: nowrap; background: #aef; border-radius: .25em; margin-right: 1.75em; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #source p .ctxs { background: #056; } }
|
||||||
|
|
||||||
|
#source p .ctxs span { display: block; text-align: right; }
|
||||||
|
|
||||||
|
#index { font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 0.875em; }
|
||||||
|
|
||||||
|
#index table.index { margin-left: -.5em; }
|
||||||
|
|
||||||
|
#index td, #index th { text-align: right; width: 5em; padding: .25em .5em; border-bottom: 1px solid #eee; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #index td, #index th { border-color: #333; } }
|
||||||
|
|
||||||
|
#index td.name, #index th.name { text-align: left; width: auto; }
|
||||||
|
|
||||||
|
#index th { font-style: italic; color: #333; cursor: pointer; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #index th { color: #ddd; } }
|
||||||
|
|
||||||
|
#index th:hover { background: #eee; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #index th:hover { background: #333; } }
|
||||||
|
|
||||||
|
#index th.headerSortDown, #index th.headerSortUp { white-space: nowrap; background: #eee; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #index th.headerSortDown, #index th.headerSortUp { background: #333; } }
|
||||||
|
|
||||||
|
#index th.headerSortDown:after { content: " ↑"; }
|
||||||
|
|
||||||
|
#index th.headerSortUp:after { content: " ↓"; }
|
||||||
|
|
||||||
|
#index td.name a { text-decoration: none; color: inherit; }
|
||||||
|
|
||||||
|
#index tr.total td, #index tr.total_dynamic td { font-weight: bold; border-top: 1px solid #ccc; border-bottom: none; }
|
||||||
|
|
||||||
|
#index tr.file:hover { background: #eee; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #index tr.file:hover { background: #333; } }
|
||||||
|
|
||||||
|
#index tr.file:hover td.name { text-decoration: underline; color: inherit; }
|
||||||
|
|
||||||
|
#scroll_marker { position: fixed; right: 0; top: 0; width: 16px; height: 100%; background: #fff; border-left: 1px solid #eee; will-change: transform; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #scroll_marker { background: #1e1e1e; } }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #scroll_marker { border-color: #333; } }
|
||||||
|
|
||||||
|
#scroll_marker .marker { background: #ccc; position: absolute; min-height: 3px; width: 100%; }
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) { #scroll_marker .marker { background: #444; } }
|
||||||
0
rover/__init__.py
Normal file
0
rover/__init__.py
Normal file
45
rover/rover.py
Normal file
45
rover/rover.py
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
import dataclasses
|
||||||
|
|
||||||
|
|
||||||
|
@dataclasses.dataclass
|
||||||
|
class Rover:
|
||||||
|
x: int
|
||||||
|
y: int
|
||||||
|
direction: str
|
||||||
|
|
||||||
|
valid_commands = ("F", "B", "R", "L")
|
||||||
|
|
||||||
|
direction_map = {
|
||||||
|
"NORTH": (0, 1, "WEST", "EAST"),
|
||||||
|
"EAST": (1, 0, "NORTH", "SOUTH"),
|
||||||
|
"SOUTH": (0, -1, "EAST", "WEST"),
|
||||||
|
"WEST": (-1, 0, "SOUTH", "NORTH"),
|
||||||
|
}
|
||||||
|
|
||||||
|
def is_valid_command(self, command):
|
||||||
|
for ch in command:
|
||||||
|
if ch not in self.valid_commands:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
def move(self, command: str):
|
||||||
|
if not self.is_valid_command(command):
|
||||||
|
raise ValueError("invalid command. The rover does not move")
|
||||||
|
|
||||||
|
for ch in command:
|
||||||
|
self._move_one_step(ch)
|
||||||
|
|
||||||
|
return self.x, self.y, self.direction
|
||||||
|
|
||||||
|
def _move_one_step(self, command):
|
||||||
|
if command == "B":
|
||||||
|
self.x -= self.direction_map[self.direction][0]
|
||||||
|
self.y -= self.direction_map[self.direction][1]
|
||||||
|
if command == "F":
|
||||||
|
self.x += self.direction_map[self.direction][0]
|
||||||
|
self.y += self.direction_map[self.direction][1]
|
||||||
|
if command == "R":
|
||||||
|
self.direction = self.direction_map[self.direction][3]
|
||||||
|
if command == "L":
|
||||||
|
self.direction = self.direction_map[self.direction][2]
|
||||||
18
setup.cfg
Normal file
18
setup.cfg
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
[flake8]
|
||||||
|
exclude = .git, __pycache__, __init__.py, app/migrations/*
|
||||||
|
max-complexity = 13
|
||||||
|
max-line-length = 120
|
||||||
|
|
||||||
|
[mypy]
|
||||||
|
ignore_missing_imports = True
|
||||||
|
warn_unused_configs = True
|
||||||
|
no_implicit_optional = True
|
||||||
|
warn_unused_ignores = True
|
||||||
|
warn_unreachable = True
|
||||||
|
warn_redundant_casts = True
|
||||||
|
#disallow_untyped_defs=True
|
||||||
|
|
||||||
|
plugins = pydantic.mypy
|
||||||
|
[pydantic-mypy]
|
||||||
|
init_forbid_extra = True
|
||||||
|
init_typed = True
|
||||||
0
tests/__init__.py
Normal file
0
tests/__init__.py
Normal file
8
tests/conftest.py
Normal file
8
tests/conftest.py
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
import pytest as pytest
|
||||||
|
|
||||||
|
from rover.rover import Rover
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def rover():
|
||||||
|
return Rover(0, 0, "EAST")
|
||||||
49
tests/test_rover.py
Normal file
49
tests/test_rover.py
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from rover.rover import Rover
|
||||||
|
|
||||||
|
|
||||||
|
def test_rover_initialisation():
|
||||||
|
assert Rover(0, 0, "EAST")
|
||||||
|
|
||||||
|
|
||||||
|
def test_rover_can_move(rover):
|
||||||
|
command = "F"
|
||||||
|
assert rover.move(command) is not None
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
("init", "command", "expected"),
|
||||||
|
[
|
||||||
|
((0, 0, "EAST"), "F", (1, 0, "EAST")),
|
||||||
|
((0, 0, "EAST"), "B", (-1, 0, "EAST")),
|
||||||
|
((0, 0, "EAST"), "R", (0, 0, "SOUTH")),
|
||||||
|
((0, 0, "EAST"), "L", (0, 0, "NORTH")),
|
||||||
|
# change starting point
|
||||||
|
((0, 0, "WEST"), "F", (-1, 0, "WEST")),
|
||||||
|
((0, 0, "SOUTH"), "R", (0, 0, "WEST")),
|
||||||
|
((0, 0, "SOUTH"), "F", (0, -1, "SOUTH")),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_rover_receive_commands(init, command, expected):
|
||||||
|
rover = Rover(*init)
|
||||||
|
assert rover.move(command) == expected
|
||||||
|
|
||||||
|
|
||||||
|
def test_rover_rejects_invalid_commands(rover):
|
||||||
|
command = " W "
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
rover.move(command)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
("init", "command", "expected"),
|
||||||
|
[
|
||||||
|
((0, 0, "NORTH"), "FB", (0, 0, "NORTH")),
|
||||||
|
((0, 0, "NORTH"), "FF", (0, 2, "NORTH")),
|
||||||
|
((4, 2, "EAST"), "FLFFFRFLB", (6, 4, "NORTH")),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_rover_can_receive_multiple_commands(init, command, expected):
|
||||||
|
rover = Rover(*init)
|
||||||
|
assert rover.move(command) == expected
|
||||||
Loading…
Reference in a new issue