Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Java solution with JUnit tests #4

Open
wants to merge 2 commits into
base: akhsunna
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions task1/desc.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# Команды cd и pwd

Вася пишет оболочку для своей операционной системы. В ней непременно должны присутствовать команды для работы с директориями. Для начала он решил обойтись всего двумя командами: cd (смена текущей директории) и pwd (вывод на экран текущей директории).

Директории в операционной системе Васи образуют традиционную иерархическую древовидную структуру. Существует единственная корневая директория, обозначаемая символом слеш «/». У всех остальных директорий есть названия — непустые строки из строчных латинских букв. У каждой некорневой директории есть родительская директория — та, внутри которой она расположена. Эта директория обозначается как «..».

Команда cd принимает один параметр, являющийся путем в файловой системе. Команда меняет текущую директорию на директорию, расположенную по заданному пути. Путь состоит из названий директорий, разделённых слешами. В качестве названия директории может использоваться «..», что обозначает переход в родительскую директорию. «..» может встретиться вместо названия директории в любом месте пути, возможно, несколько раз. Если путь начинается со слеша, он считается абсолютным путём, то есть директория меняется на указанную, считая от корневой. Если параметр начинается с имени директории (или «..»), он считается относительным путём, то есть директория меняется на указанную, считая от текущей.

Команда pwd должна выводить абсолютный путь до текущей директории. Этот путь не должен содержать «..».

Изначально текущей директорией является корневая. Все директории, явно упоминаемые или проходимые косвенно внутри одной команды cd, считаются существующими. Гарантируется отсутствие попыток перехода в родительскую директорию корневой директории.

Входные данные
В входных данных n строк по одной команде в каждой строке. В каждой из этих строк записана либо команда pwd, либо команда cd, после которой идёт отделённый пробелом непустой параметр.

В параметре команды cd используются только строчные латинские буквы, слеши и точки, не может идти два слеша подряд, точки встречаются только как название родительской псевдо-директории. Параметр команды cd не завершается слешем, кроме случая, когда это единственный символ, указывающий на корневую директорию. Параметр команды имеет длину от 1 до 200 символов включительно.

Директории в файловой системе могут иметь одинаковые имена.

Выходные данные
Для каждой команды pwd требуется вывести полный абсолютный путь текущей директории, завершённый слешем. Он должен начинаться со слеша и содержать список директорий в порядке вложенности от корневой до текущей, разделённый слешами. Этот путь не должен содержать точек.


## Примеры тестов:

### Входные данные

```
pwd
cd /home/vasya
pwd
cd ..
pwd
cd vasya/../petya
pwd
```

### Выходные данные

```
/
/home/vasya/
/home/
/home/petya/
```

### Входные данные

```
cd /a/b
pwd
cd ../a/b
pwd
```

### Выходные данные

```
/a/b/
/a/a/b/
```
77 changes: 77 additions & 0 deletions task1/solution/src/cdpwd.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package cdpwd;
import java.util.*;

/**
* This class implements work of commands cd and pwd.
* @author Anna
* @version 1.0
*/
public class cdpwd {

static ArrayList<String> list;

/**
* This method implements the command cd.
* @param st string that was broken into tokens - names of folders.
*/
public static void cd(StringTokenizer st){
while(st.hasMoreTokens()){
list.add(st.nextToken());
if(list.get(list.size()-1).equals("..")){
if(list.size()==2){
System.out.println("Error");
list.remove(list.size()-1);
} else {
list.remove(list.size()-1);
list.remove(list.size()-1);
}
}
}
}

/**
* This method implements the command pwd.
* @return current directory
*/
public static String pwd(){
String way = "";
for(String t: list){
way=way+t+"/";
}
return way;
}

/**
* This method determines which command must be executed.
*/
public static void comand(){
Scanner sc = new Scanner(System.in);
StringTokenizer st = new StringTokenizer(sc.nextLine(), " \t\n\r/");
String c=st.nextToken();
if(c.equals("pwd")){
System.out.println(pwd());
}
if(c.equals("cd")){
cd(st);
}
if(c.equals("exit")){
return;
}
comand();
}

/**
* The main (start) method.
* @param args
*/
public static void main(String[] args){
// TODO Auto-generated method stub
list = new ArrayList<String>();
list.add("");
comand();
}

}



63 changes: 63 additions & 0 deletions task1/solution/test/cdpwdTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package cdpwd;

import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.StringTokenizer;

import org.junit.BeforeClass;
import org.junit.Test;

public class cdpwdTest {

@BeforeClass
public static void setUpBeforeClass() throws Exception {
cdpwd.list = new ArrayList<String>();
cdpwd.list.add("");
}

@Test
public void testOne(){
StringTokenizer st = new StringTokenizer("cd ..", " \t\n\r/");
st.nextToken();
cdpwd.cd(st);
assertEquals("/",cdpwd.pwd());
}

@Test
public void testTwo(){
StringTokenizer st = new StringTokenizer("cd a/b/../c", " \t\n\r/");
st.nextToken();
cdpwd.cd(st);
assertEquals("/a/c/",cdpwd.pwd());
}

@Test
public void testThree(){
StringTokenizer st = new StringTokenizer("cd /", " \t\n\r/");
st.nextToken();
cdpwd.cd(st);
assertEquals("/a/c/",cdpwd.pwd());
}

@Test
public void testList(){
ArrayList<String> expecteds = new ArrayList<String>();
expecteds.add(""); expecteds.add("a"); expecteds.add("c");
assertArrayEquals(expecteds, cdpwd.list);
}

@Test
public void testNotEmpty(){
StringTokenizer st = new StringTokenizer("cd ../../../../..", " \t\n\r/");
st.nextToken();
cdpwd.cd(st);
assertTrue(cdpwd.list.size()!=0);
}

private void assertArrayEquals(ArrayList<String> expecteds,
ArrayList<String> list) {
// TODO Auto-generated method stub
}

}