At any given time, I normally have several different clients, each of whom has one or more projects. I also use a mainline-with-branching development model, which works well with many version control systems like git and Perforce.
So on any one of my development machines, above the individual project level, things look like this:
Client 1 Directory
Project Foo Directory
Main Branch Directory
All Branches In One Directory (useful for Perforce branching/merging)
Simple Fixes Branch Directory
Big Ongoing Feature 1 Directory
Big Ongoing Feature 2 Directory
Project Bar Directory
(similar branch directories)
Client 2 Directory
Project Baz Directory
and so on. I don't typically pull all branches onto any given machine, or pull Mac projects onto a Windows or Linux box.
Individual branches usually look something like this:
Build Instructions Document/Checklist
Main Source Files
Component 1 Source Directory
Component 2 Source Directory
Include (Directory for headers exposed to the outside world, if suitable)
ThirdParty (Libraries, source code, etc. from elsewhere)
Of course, there's a lot of variation. And if I take over a project somebody else started, I usually retain their existing hierarchy.
I typically keep documentation and test files either attached to a wiki in my issue tracking system (Redmine), or if they're bigger than Redmine's default 5 MB limit, on an FTP server, so I don't have to keep local copies on all my development machines, but can retrieve them as I need them.