Convert python test code to TypeScript using mocha and chai's assert APIs.

Use 2 spaces indentation.
Add ; after statements.
Remove comments in tests.
Do not include import or require statements.
Use ' instead of " for strings.
Convert to camelCase for snake_case names, for example array_equal => arrayEqual, ones_like => onesLike, logical_not => logicalNot.
Do not convert mx.array_equal to mx.equal, convert it mx.arrayEqual instead.
For names like tolist/isnan, do not change caps, for example isnan => isnan, allclose => allclose.
For comparions like `a == b`, use global op `mx.equal(a, b)` instead.
For matrix multiplication, use op `mx.matmul` instead.
Remove "Test" prefix from test names, e.g. TestEquality => equality.
Use () => instead of function() for defining functions.
Use const when possible, but use let if the same name is reused in the same scope.
Use true/false instead of True/False.
Convert python tuples to TypeScript Arrays.
For calls of len function, convert to the length property.
Use `assertArrayAllFalse` and `assertArrayAllTrue` helpers for assersion the results of ops like mx.equal.
Use `assert.deepEqual` to compare JavaScript arrays, for example assert.deepEqual(x.tolist(), [1.0, 1.0]) and assert.deepEqual(x.shape, [3, 4]).
Use `assert.equal` to compare other things like dtype. The dtypes can be accessed via properties like mx.float32.
Use `assert.throws` to test exceptions.
For arithmetic operations like a + b, use ops instead, for example a + b to mx.add(a, b) , a % b to mx.remainder(a, b), a * b to mx.multiply(a, b).
The TypeScript APIs does not take object arguments, so convert code like mx.array(2, dtype=dt) to mx.array(2, dt).
The mx.random.uniform TypeScript API does not have defaults for low/high parameters, always call with mx.random.uniform(0, 1, shape) instead of mx.random.uniform(shape) if low/high is not explicitly specified in Python code.
The complex number in mx is represented as object {re: number, im: number}, and can be created with mx.complex(re, im).
For getting item via indexing, use the "index" method, for example a[1, 2, 3] becomes a.index(1, 2, 3).
For setting item vai idnexing, use the "indexPut_" method, for example `a[1] = b` becomes `a.indexPut_(1, b)`, `a[1, 2] = b` becomes `a.indexPut_([1, 2], b)`, `a[1:2] = b` becomes `a.indexPut_(mx.Slice(1, 2), b)`.
For objects, make sure the converted code only uses string as keys. For example, {mx.float32: 1e-6, ...} should be converted to [{dtype: mx.float32, eps: 1e-6}].
For dtypes, in TypeScript their types are "mx.Dtype", and they should be referenced as values of mx module, such as "mx.float32".

For code that compares results between mx and np (numpy), replace the numpy code with tensorflow-js. For example, replace np.array to tf.tensor. When comparing results, convert to js Array first, for example assert.deepEqual(rTf.arraySync(), rMlx.tolist()). For ops, convert the tf tensor to JS array, and then call the op like `mx.isclose(rMlx, rTf.arraySync())`. Replaces "np" in names with "tf".

Write code inside markdown codeblock.
