I generally write tests for the initial/main functionality up-front - usually just a simple call to some func that's currently just stubbed, assert that it does the right thing (e.g. "I want to call my new code like this... and get back this..."). Then implement enough code to make that pass, and perhaps modify/expand the test during that process (exercising edge cases perhaps, or adding more functionality - depends on the project).
Then I might write a whole bunch of related code, fleshing out other parts which rely on the primary part (that I know works well enough for now), perhaps without writing tests first. But if I do that, I will then go back and write more tests until I get 100% coverage later. Undoubtedly you will find corner cases that you didn't cater for when you exercise the code in tests.
It's not done until all my code has 100% coverage, and all the main entry points, important data structs, tricky bits, etc, have documentation of some kind. But I might implement a fair chunk of the code before implementing full tests.
So: some tests up-front (because it makes coding easier), and the remainder of the tests (for full coverage) have higher priority than writing documentation on my list of todos.
In no particular order, I've written non-trivial amounts of Go, Javascript, C#, Python, Java, C/C++, ...
— But your question is not specific enough because the process can vary a lot, depending on what you're coding (e.g. I don't bother writing tests for bash scripts: they usually either work, or they don't), and who / what it is for. e.g. the above process works great if you're building a library (and if you're not building a library, it can help to try and break apart the project into some library-like pieces).
Obviously the above would be somewhat different if I were doing TDD for a web-app, but I'd still apply the same process to the bits and pieces that make up the app behind the scenes - and then have to also consider front-end testing if appropriate.