circuitpython/tests
Josh Klar 3a7a5ba686 py: Implement partial PEP-498 (f-string) support
This implements (most of) the PEP-498 spec for f-strings, with two
exceptions:

- raw f-strings (`fr` or `rf` prefixes) raise `NotImplementedError`
- one special corner case does not function as specified in the PEP
(more on that in a moment)

This is implemented in the core as a syntax translation, brute-forcing
all f-strings to run through `String.format`. For example, the statement
`x='world'; print(f'hello {x}')` gets translated *at a syntax level*
(injected into the lexer) to `x='world'; print('hello {}'.format(x))`.
While this may lead to weird column results in tracebacks, it seemed
like the fastest, most efficient, and *likely* most RAM-friendly option,
despite being implemented under the hood with a completely separate
`vstr_t`.

Since [string concatenation of adjacent literals is implemented in the
lexer](534b7c368d),
two side effects emerge:

- All strings with at least one f-string portion are concatenated into a
single literal which *must* be run through `String.format()` wholesale,
and:
- Concatenation of a raw string with interpolation characters with an
f-string will cause `IndexError`/`KeyError`, which is both different
from CPython *and* different from the corner case mentioned in the PEP
(which gave an example of the following:)

```python
x = 10
y = 'hi'
assert ('a' 'b' f'{x}' '{c}' f'str<{y:^4}>' 'd' 'e') == 'ab10{c}str< hi >de'
```

The above-linked commit detailed a pretty solid case for leaving string
concatenation in the lexer rather than putting it in the parser, and
undoing that decision would likely be disproportionately costly on
resources for the sake of a probably-low-impact corner case. An
alternative to become complaint with this corner case of the PEP would
be to revert to string concatenation in the parser *only when an
f-string is part of concatenation*, though I've done no investigation on
the difficulty or costs of doing this.

A decent set of tests is included. I've manually tested this on the
`unix` port on Linux and on a Feather M4 Express (`atmel-samd`) and
things seem sane.
2020-03-09 08:16:07 -05:00
..
basics py: Implement partial PEP-498 (f-string) support 2020-03-09 08:16:07 -05:00
bench Updated tests; removed try/catch for ucollections 2018-05-14 14:43:34 -04:00
circuitpython tests: Fixup tests for 3.x on Rosie 2017-11-16 10:56:20 -08:00
cmdline Fix tests and clarify first character access 2019-05-07 09:30:55 -07:00
cpydiff WIP: after merge; before testing 2018-07-11 16:45:30 -04:00
extmod extmod/ure: Handle some escape sequences. 2019-02-14 15:42:25 +01:00
feature_check tests/class_reverse_op: Test for reverse arith ops special methods. 2017-09-10 17:05:57 +03:00
float py/lexer: Add support for underscores in numeric literals. 2018-06-12 12:17:43 +10:00
import Fix tests 2019-06-26 11:02:18 -07:00
inlineasm tests: Add a test for argument passing to inline-asm functions. 2016-03-16 08:24:07 +00:00
io tests: Add tests using "file" argument in print and sys.print_exception. 2018-06-20 16:08:25 +10:00
jni tests: Convert remaining "sys.exit()" to "raise SystemExit". 2017-06-10 20:34:38 +03:00
micropython py/emit: Combine yield value and yield-from emit funcs into one. 2018-05-23 00:22:35 +10:00
misc WIP: after merge; before testing 2018-07-11 16:45:30 -04:00
net_hosted tests/net_hosted: Add test for socket connect() and poll() behaviour. 2017-11-23 10:45:12 +11:00
net_inet tests/net_inet: Update tls test to work with CPython and incl new site. 2017-10-26 12:29:24 +11:00
pyb tests/pyb: Make i2c and pyb1 pyboard tests run again. 2018-06-08 13:00:27 +10:00
pybnative py: Fix stack access in thumb native emitter. 2014-05-07 23:27:45 +01:00
stress tests: Move recursive tests to the tests/stress/ subdir. 2018-04-10 14:43:52 +10:00
thread py/modthread: Raise RuntimeError in release() if lock is not acquired. 2017-06-14 14:43:50 +10:00
unicode py/objstr: Add check for valid UTF-8 when making a str from bytes. 2017-09-06 16:43:09 +10:00
unix Update tests for new autocomplete behavior 2019-05-06 14:19:07 -07:00
wipy various: Spelling fixes 2017-05-29 11:36:05 +03:00
pyboard.py tests: Point pyboard.py to tools/cpboard.py 2018-06-02 19:09:54 +02:00
README all: Remove trailing spaces, per coding conventions. 2017-07-19 13:12:10 +10:00
run-bench-tests tests/run-bench-tests: Update locations of executables, now in ports/. 2017-09-08 12:11:15 +10:00
run-tests Use tests from ulab extmod, instead of our own 2020-03-03 12:46:59 -06:00
run-tests-exp.py unix: Rename "_os" module to "uos" for consistency with baremetal ports. 2015-12-12 00:04:35 +02:00
run-tests-exp.sh run-tests-exp.sh: Typo fix in comment. 2015-02-21 03:22:33 +02:00
skip_if.py Updated tests; removed try/catch for ucollections 2018-05-14 14:43:34 -04:00

This directory contains tests for various functionality areas of MicroPython.
To run all stable tests, run "run-tests" script in this directory.

Tests of capabilities not supported on all platforms should be written
to check for the capability being present. If it is not, the test
should merely output 'SKIP' followed by the line terminator, and call
sys.exit() to raise SystemExit, instead of attempting to test the
missing capability. The testing framework (run-tests in this
directory, test_main.c in qemu_arm) recognizes this as a skipped test.

There are a few features for which this mechanism cannot be used to
condition a test. The run-tests script uses small scripts in the
feature_check directory to check whether each such feature is present,
and skips the relevant tests if not.

When creating new tests, anything that relies on float support should go in the
float/ subdirectory.  Anything that relies on import x, where x is not a built-in
module, should go in the import/ subdirectory.