Languages nowadays come with frameworks. It is almost useless to know a language well without it's framework if your talking about high level languages like java and c#.
This could help: http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm
The most important thing about mastering a framework is knowing where to look. You don't need to memorise every single class to be good at it. If I want to write e-mail code in .Net I know to look in System.Net.Mail, if there is something I don't know I can google it. If I didn't know to look there it could have been a problem, especially with more abstract things.
The mastery of a language is similarly not only knowing all the keywords and constructs, but where they are useful. If you just learn about generics you want to find a place to use them, but the important part is using them in the right place.
If you want to assign a point system to language knowledge, here is my crappy rating system:
- Knows how to write statements but tends to ask many questions about obvious problems such as inaccessible variables and scope. Does not use loops. Declares many variables.
- Understands loops and functions and the importance of return types. Many unused variables and bad arrangement of statements or unintentional arrangement.
- Uses longer statements and does not declare variables unnecesarily. For instance only to send a value to a function.
- Writes functions to properly separate logic. no (value = true) statements or statements that could be more succinct(short and to the point)
- Using classes. Unnecessary public variables or functions. Tight coupling.
- Proper classes with intentional design constraints, hiding of implementation. Good commenting.
- Use of novel problem solving techniques such as interfaces and regular expressions. Defensive programming such as assertions, use of transactions, design patterns
- Use of introspection, generics, advanced polymorphism.
- Understands language semantics including memory allocation and garbage collection.
- Understands language internals. Is able write language tools such as compilers, debuggers and profilers.
I kind of nose-picked that list, but the idea is that advanced concepts available to the language should be used in the right places, in the right way. To master a language you should need to know how to predict and enhance it. If you really want to master a language you should write compilers and profilers, but in most cases I think that is impractical.
Frameworks have the same effect. The best way to master a framework is to extend it, enhance it and possibly write your own.