import tester.*;

// to represent different files in a computer
interface IFile{
  
  // compute the size of this file
  int size();
  
  // compute the time (in seconds) to download this file
  // at the given download rate
  int downloadTime(int rate);
  
  // is the owner of this file the same 
  // as the owner of the given file?
  boolean sameOwner(IFile that);
}

// to represent a text file
class TextFile implements IFile{
  String name;
  String owner;
  int length;   // in bytes
  
  TextFile(String name, String owner, int length){
    this.name = name;
    this.owner = owner;
    this.length = length;
  }
  
  // compute the size of this file
  int size(){
    return this.length;
  }  
  
  // compute the time (in seconds) to download this file
  // at the given download rate
  int downloadTime(int rate){
    return 0;
  }
  
  // is the owner of this file the same 
  // as the owner of the given file?
  boolean sameOwner(IFile that){
    return true;
  }
}

//to represent an image file
class ImageFile implements IFile{
  String name;
  String owner;
  int width;   // in pixels
  int height;  // in pixels
  
  ImageFile(String name, String owner, int width, int height){
    this.name = name;
    this.owner = owner;
    this.width = width;
    this.height = height;
  }
  
  // compute the size of this file
  int size(){
    return this.width * this.height;
  }  
  
  // compute the time (in seconds) to download this file
  // at the given download rate
  int downloadTime(int rate){
    return 0;
  }
  
  // is the owner of this file the same 
  // as the owner of the given file?
  boolean sameOwner(IFile that){
    return true;
  }
}


//to represent an audio file
class AudioFile implements IFile{
  String name;
  String owner;
  int speed;   // in bytes per second
  int length;  // in seconds of recording time
    
  AudioFile(String name, String owner, int speed, int length){
    this.name = name;
    this.owner = owner;
    this.speed = speed;
    this.length = length;
  }
  
  // compute the size of this file
  int size(){
    return this.speed * this.length;
  }  
  
  // compute the time (in seconds) to download this file
  // at the given download rate
  int downloadTime(int rate){
    return 0;
  }
  
  // is the owner of this file the same 
  // as the owner of the given file?
  boolean sameOwner(IFile that){
    return true;
  }
}

class ExamplesFiles{
  ExamplesFiles(){}
  
  IFile text1 = new TextFile("English paper", "Maria", 1234);
  IFile picture = new ImageFile("Beach", "Maria", 400, 200);
  IFile song = new AudioFile("Help", "Pat", 200, 120);
  
  // test the method size for the classes that represent files
  boolean testSize(Tester t){
    return
    t.checkExpect(this.text1.size(), 1234) &&
    t.checkExpect(this.picture.size(), 80000) &&
    t.checkExpect(this.song.size(), 24000);
  }
}