@Test
public void testValueOf () throws IOException {

  final String path = "/testValueOf";
  final short replication = 3;
  {//cast from null
    final INode from = null;
    //cast to INodeFile, should fail
    try {
      INodeFile.valueOf(from, path);
      fail();
    } catch(FileNotFoundException fnfe) {
      assertTrue(fnfe.getMessage().contains("File does not exist"));
    }
    //cast to INodeDirectory, should fail
    try {
      INodeDirectory.valueOf(from, path);
      fail();
    } catch(FileNotFoundException e) {
      assertTrue(e.getMessage().contains("Directory does not exist"));
    }
  }
  {//cast from INodeFile
    final INode from = createINodeFile(replication, preferredBlockSize);
   //cast to INodeFile, should success
    final INodeFile f = INodeFile.valueOf(from, path);
    assertTrue(f == from);
    //cast to INodeDirectory, should fail
    try {
      INodeDirectory.valueOf(from, path);
      fail();
    } catch(PathIsNotDirectoryException e) {
      // Expected
    }
  }
  {//cast from INodeFileUnderConstruction
    final INode from = new INodeFile(
        INodeId.GRANDFATHER_INODE_ID, null, perm, 0L, 0L, null, replication,
        1024L, (byte)0);
    from.asFile().toUnderConstruction("client", "machine");
  
    //cast to INodeFile, should success
    final INodeFile f = INodeFile.valueOf(from, path);
    assertTrue(f == from);
    //cast to INodeDirectory, should fail
    try {
      INodeDirectory.valueOf(from, path);
      fail();
    } catch(PathIsNotDirectoryException expected) {
      // expected
    }
  }
  {//cast from INodeDirectory
    final INode from = new INodeDirectory(INodeId.GRANDFATHER_INODE_ID, null,
        perm, 0L);
    //cast to INodeFile, should fail
    try {
      INodeFile.valueOf(from, path);
      fail();
    } catch(FileNotFoundException fnfe) {
      assertTrue(fnfe.getMessage().contains("Path is not a file"));
    }
    //cast to INodeDirectory, should success
    final INodeDirectory d = INodeDirectory.valueOf(from, path);
    assertTrue(d == from);
  }
}