diff --git a/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/Application.java b/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/Application.java index b33a15c..9779c28 100644 --- a/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/Application.java +++ b/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/Application.java @@ -7,12 +7,9 @@ import ch.heigvd.res.lab01.interfaces.IFileVisitor; import ch.heigvd.res.lab01.quotes.QuoteClient; import ch.heigvd.res.lab01.quotes.Quote; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.StringWriter; -import java.io.Writer; + +import java.io.*; +import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.io.FileUtils; @@ -20,141 +17,185 @@ /** * * @author Olivier Liechti + * EDITED BY + * @author Antoine Nourazar */ public class Application implements IApplication { - /** - * This constant defines where the quotes will be stored. The path is relative - * to where the Java application is invoked. - */ - public static String WORKSPACE_DIRECTORY = "./workspace/quotes"; - - private static final Logger LOG = Logger.getLogger(Application.class.getName()); - - public static void main(String[] args) { - - /* - * I prefer to have LOG output on a single line, it's easier to read. Being able - * to change the formatting of console outputs is one of the reasons why it is - * better to use a Logger rather than using System.out.println - */ - System.setProperty("java.util.logging.SimpleFormatter.format", "%4$s: %5$s%6$s%n"); - - - int numberOfQuotes = 0; - try { - numberOfQuotes = Integer.parseInt(args[0]); - } catch (Exception e) { - System.err.println("The command accepts a single numeric argument (number of quotes to fetch)"); - System.exit(-1); - } - - Application app = new Application(); - try { + /** + * This constant defines where the quotes will be stored. The path is + * relative to where the Java application is invoked. + */ + public static String WORKSPACE_DIRECTORY = "." + File.separator + "workspace" + + File.separator + "quotes"; + + private static final Logger LOG = Logger.getLogger(Application.class.getName()); + + public static void main(String[] args) { + /* - * Step 1 : clear the output directory + * I prefer to have LOG output on a single line, it's easier to read. Being able + * to change the formatting of console outputs is one of the reasons why it is + * better to use a Logger rather than using System.out.println */ - app.clearOutputDirectory(); + System.setProperty("java.util.logging.SimpleFormatter.format", "%4$s: %5$s%6$s%n"); - /* - * Step 2 : use the QuotesClient to fetch quotes; store each quote in a file - */ - app.fetchAndStoreQuotes(numberOfQuotes); + int numberOfQuotes = 0; + try { + numberOfQuotes = Integer.parseInt(args[0]); + } catch (Exception e) { + System.err.println("The command accepts a single numeric argument (number of quotes to fetch)"); + System.exit(-1); + } - /* + Application app = new Application(); + try { + /* + * Step 1 : clear the output directory + */ + app.clearOutputDirectory(); + + /* + * Step 2 : use the QuotesClient to fetch quotes; store each quote in a file + */ + app.fetchAndStoreQuotes(numberOfQuotes); + + /* * Step 3 : use a file explorer to traverse the file system; print the name of each directory and file - */ - Writer writer = new StringWriter(); // we create a special writer that will send characters into a string (memory) - app.printFileNames(writer); // we hand over this writer to the printFileNames method - LOG.info(writer.toString()); // we dump the whole result on the console - - /* + */ + Writer writer = new StringWriter(); // we create a special writer that will send characters into a string (memory) + app.printFileNames(writer); // we hand over this writer to the printFileNames method + LOG.info(writer.toString()); // we dump the whole result on the console + + /* * Step 4 : process the quote files, by applying 2 transformations to their content * (convert to uppercase and add line numbers) - */ - app.processQuoteFiles(); + */ + app.processQuoteFiles(); + + } catch (IOException ex) { + LOG.log(Level.SEVERE, "Could not fetch quotes. {0}", ex.getMessage()); + ex.printStackTrace(); + } + } + + @Override + public void fetchAndStoreQuotes(int numberOfQuotes) throws IOException { - } catch (IOException ex) { - LOG.log(Level.SEVERE, "Could not fetch quotes. {0}", ex.getMessage()); - ex.printStackTrace(); - } - } - - @Override - public void fetchAndStoreQuotes(int numberOfQuotes) throws IOException { - clearOutputDirectory(); - QuoteClient client = new QuoteClient(); - for (int i = 0; i < numberOfQuotes; i++) { - Quote quote = client.fetchQuote(); - /* There is a missing piece here! - * As you can see, this method handles the first part of the lab. It uses the web service - * client to fetch quotes. We have removed a single line from this method. It is a call to - * one method provided by this class, which is responsible for storing the content of the - * quote in a text file (and for generating the directories based on the tags). - */ - LOG.info("Received a new joke with " + quote.getTags().size() + " tags."); - for (String tag : quote.getTags()) { - LOG.info("> " + tag); + clearOutputDirectory(); + QuoteClient client = new QuoteClient(); + + for (int i = 0; i < numberOfQuotes; i++) { + + Quote quote = client.fetchQuote(); + /* There is a missing piece here! + * As you can see, this method handles the first part of the lab. It uses the web service + * client to fetch quotes. We have removed a single line from this method. It is a call to + * one method provided by this class, which is responsible for storing the content of the + * quote in a text file (and for generating the directories based on the tags). + * + * FIXED + */ + storeQuote(quote, "quote-" + Integer.toString(i+1) + ".utf8"); + + LOG.info("Received a new joke with " + quote.getTags().size() + " tags."); + for (String tag : quote.getTags()) { + LOG.info("> " + tag); + } } - } - } - - /** - * This method deletes the WORKSPACE_DIRECTORY and its content. It uses the - * apache commons-io library. You should call this method in the main method. - * - * @throws IOException - */ - void clearOutputDirectory() throws IOException { - FileUtils.deleteDirectory(new File(WORKSPACE_DIRECTORY)); - } + } + + /** + * This method deletes the WORKSPACE_DIRECTORY and its content. It uses the + * apache commons-io library. You should call this method in the main method. + * + * @throws IOException + */ + void clearOutputDirectory() throws IOException { + FileUtils.deleteDirectory(new File(WORKSPACE_DIRECTORY)); + } + + /** + * This method stores the content of a quote in the local file system. It has + * 2 responsibilities: + * + * - with quote.getTags(), it gets a list of tags and uses it to create + * sub-folders (for instance, if a quote has three tags "A", "B" and "C", it + * will be stored in /quotes/A/B/C/quotes-n.utf8. + * + * - with quote.getQuote(), it has access to the text of the quote. It stores + * this text in UTF-8 file. + * + * @param quote the quote object, with tags and text + * @param filename the name of the file to create and where to store the + * quote text + * @throws IOException + */ + void storeQuote(Quote quote, String filename) throws IOException { + + //Get the tags + List tagsList = quote.getTags(); - /** - * This method stores the content of a quote in the local file system. It has - * 2 responsibilities: - * - * - with quote.getTags(), it gets a list of tags and uses - * it to create sub-folders (for instance, if a quote has three tags "A", "B" and - * "C", it will be stored in /quotes/A/B/C/quotes-n.utf8. - * - * - with quote.getQuote(), it has access to the text of the quote. It stores - * this text in UTF-8 file. - * - * @param quote the quote object, with tags and text - * @param filename the name of the file to create and where to store the quote text - * @throws IOException - */ - void storeQuote(Quote quote, String filename) throws IOException { - throw new UnsupportedOperationException("The student has not implemented this method yet."); - } - - /** - * This method uses a IFileExplorer to explore the file system and prints the name of each - * encountered file and directory. - */ - void printFileNames(final Writer writer) { - IFileExplorer explorer = new DFSFileExplorer(); - explorer.explore(new File(WORKSPACE_DIRECTORY), new IFileVisitor() { - @Override - public void visit(File file) { - /* - * There is a missing piece here. Notice how we use an anonymous class here. We provide the implementation - * of the the IFileVisitor interface inline. You just have to add the body of the visit method, which should - * be pretty easy (we want to write the filename, including the path, to the writer passed in argument). - */ + /* Create the directory */ + String directory = WORKSPACE_DIRECTORY; + + //Create the pathname + for (String tag : tagsList) { + directory += File.separator + tag; } - }); - } - - @Override - public String getAuthorEmail() { - throw new UnsupportedOperationException("The student has not implemented this method yet."); - } + + filename = directory + File.separator + filename; + + File file = new File(directory); + + //Create every necessary directories + file.mkdirs(); + + File namedFile = new File(filename); + + //Writing in the file... + BufferedOutputStream writer = new BufferedOutputStream(new FileOutputStream(namedFile)); + writer.write(quote.getQuote().getBytes("UTF-8")); + writer.close(); + } - @Override - public void processQuoteFiles() throws IOException { - IFileExplorer explorer = new DFSFileExplorer(); - explorer.explore(new File(WORKSPACE_DIRECTORY), new CompleteFileTransformer()); - } + /** + * This method uses a IFileExplorer to explore the file system and prints the + * name of each encountered file and directory. + */ + void printFileNames(final Writer writer) { + + IFileExplorer explorer = new DFSFileExplorer(); + explorer.explore(new File(WORKSPACE_DIRECTORY), new IFileVisitor() { + + @Override + public void visit(File file) { + /* + * There is a missing piece here. Notice how we use an anonymous class here. We provide the implementation + * of the the IFileVisitor interface inline. You just have to add the body of the visit method, which should + * be pretty easy (we want to write the filename, including the path, to the writer passed in argument). + * + * FIXED ! + */ + try { + writer.write(file.getPath()+ '\n'); + } catch (IOException e) { + e.printStackTrace(); + } + } + }); + } + + @Override + public String getAuthorEmail() { + //return my email as it was indicate in IApplication interface + return "antoine.nourazar@heig-vd.ch"; + } + + @Override + public void processQuoteFiles() throws IOException { + IFileExplorer explorer = new DFSFileExplorer(); + explorer.explore(new File(WORKSPACE_DIRECTORY), new CompleteFileTransformer()); + } } diff --git a/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/Utils.java b/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/Utils.java index ebededd..7ef030f 100644 --- a/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/Utils.java +++ b/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/Utils.java @@ -5,22 +5,47 @@ /** * * @author Olivier Liechti + * EDITED BY + * @author Antoine Nourazar */ public class Utils { - private static final Logger LOG = Logger.getLogger(Utils.class.getName()); + private static final Logger LOG = Logger.getLogger(Utils.class.getName()); - /** - * This method looks for the next new line separators (\r, \n, \r\n) to extract - * the next line in the string passed in arguments. - * - * @param lines a string that may contain 0, 1 or more lines - * @return an array with 2 elements; the first element is the next line with - * the line separator, the second element is the remaining text. If the argument does not - * contain any line separator, then the first element is an empty string. - */ - public static String[] getNextLine(String lines) { - throw new UnsupportedOperationException("The student has not implemented this method yet."); - } + /** + * This method looks for the next new line separators (\r, \n, \r\n) to extract + * the next line in the string passed in arguments. + * + * @param lines a string that may contain 0, 1 or more lines + * @return an array with 2 elements; the first element is the next line with the + * line separator, the second element is the remaining text. If the argument does + * not contain any line separator, then the first element is an empty string. + */ + public static String[] getNextLine(String lines) { -} + String[] lineTab = new String[2]; + + /* Initialize an empty string */ + lineTab[0] = ""; + lineTab[1] = ""; + + String[] separators = {"\r\n","\r", "\n"}; + int index = -1; + + //Check if the string given is containing one of the separators + for (String separator : separators) { + + if (lines.contains(separator)) { + + index = lines.indexOf(separator); + //Create the next line + lineTab[0] = lines.substring(0,index + 1); + } + } + + //return the remaining text + lineTab[1] = lines.substring(index + 1,lines.length()); + + return lineTab; + } +} \ No newline at end of file diff --git a/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/explorers/DFSFileExplorer.java b/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/explorers/DFSFileExplorer.java index 0322ffc..a77c917 100644 --- a/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/explorers/DFSFileExplorer.java +++ b/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/explorers/DFSFileExplorer.java @@ -3,20 +3,48 @@ import ch.heigvd.res.lab01.interfaces.IFileExplorer; import ch.heigvd.res.lab01.interfaces.IFileVisitor; import java.io.File; +import java.util.Arrays; /** * This implementation of the IFileExplorer interface performs a depth-first * exploration of the file system and invokes the visitor for every encountered - * node (file and directory). When the explorer reaches a directory, it visits all - * files in the directory and then moves into the subdirectories. - * + * node (file and directory). When the explorer reaches a directory, it visits + * all files in the directory and then moves into the subdirectories. + * * @author Olivier Liechti + * EDITED BY + * @author Antoine Nourazar */ public class DFSFileExplorer implements IFileExplorer { - @Override - public void explore(File rootDirectory, IFileVisitor vistor) { - throw new UnsupportedOperationException("The student has not implemented this method yet."); - } + @Override + public void explore(File rootDirectory, IFileVisitor visitor) { + //First, we have to visit where we are + visitor.visit(rootDirectory); + + //If the file doesn't exist, we're getting out... + if (!rootDirectory.exists()) + return; + + /* DFS */ + + File[] childFiles = rootDirectory.listFiles(); + //Sort the array to make sure to always get the same order... + Arrays.sort(childFiles); + + // we have to check first all the files then the directories + for (File childFile : childFiles) { + if (childFile.isFile()) { + visitor.visit(childFile); + } + } + + //Explore each subdirectories... + for (File childFile : childFiles) { + if (childFile.isDirectory()) { + explore(childFile, visitor); + } + } + } } diff --git a/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/filters/FileNumberingFilterWriter.java b/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/filters/FileNumberingFilterWriter.java index 509843d..e49b663 100644 --- a/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/filters/FileNumberingFilterWriter.java +++ b/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/filters/FileNumberingFilterWriter.java @@ -14,28 +14,100 @@ * Hello\n\World -> 1\Hello\n2\tWorld * * @author Olivier Liechti + * + * EDITED BY + * @author Antoine Nourazar */ public class FileNumberingFilterWriter extends FilterWriter { - private static final Logger LOG = Logger.getLogger(FileNumberingFilterWriter.class.getName()); + private static final Logger LOG = Logger.getLogger(FileNumberingFilterWriter.class.getName()); - public FileNumberingFilterWriter(Writer out) { - super(out); - } + /* Members added to use with the methods */ + private boolean lseparator = false; + private boolean start = true; + private int line = 1; - @Override - public void write(String str, int off, int len) throws IOException { - throw new UnsupportedOperationException("The student has not implemented this method yet."); - } + public FileNumberingFilterWriter(Writer out) { + super(out); + } - @Override - public void write(char[] cbuf, int off, int len) throws IOException { - throw new UnsupportedOperationException("The student has not implemented this method yet."); - } + @Override + public void write(String str, int off, int len) throws IOException { - @Override - public void write(int c) throws IOException { - throw new UnsupportedOperationException("The student has not implemented this method yet."); - } + for (int i = off; i < (off + len); i++) + write(str.charAt(i)); + } + @Override + public void write(char[] cbuf, int off, int len) throws IOException { + + for (int i = off; i < off + len; i++) + write(cbuf[i]); + } + + + /** This method will be called by the others + * It will manage the case with \r, \r\n or \n + * + * @param c + * @throws IOException + */ + @Override + public void write(int c) throws IOException { + + /* First if we want to write the first character, we to got the write + * the line number and a tabulation */ + if (start && line != '\r' && line != '\n' ) { + + out.write(Integer.toString(line)); + out.write('\t'); + out.write(c); + start = false; + } + //if it's not the first character, we're looking if it's a line separator + else { + + // if it's a '\r', we can't already write it, we have to check the next + // char. So we store with a boolean the fact we met a '\r'... + if (c == '\r') + lseparator = true; + + else { + + if (c == '\n') { + + /* if the current char is a '\n', we're lookin if there was a '\r' + * before. Because we didn't write it before, so we have to write it + * now. Then we just have to write the '\n', the line number and + * the '\t' + */ + if (lseparator) { + + out.write('\r'); + lseparator = false; + } + + out.write(c); + out.write(Integer.toString(++line)); + out.write('\t'); + } + + /* if it's not a '\n', then it's a normal char, we just have to check + * if there was a '\r' before just to write it with the line and the + * tab, otherwise, we just write the char... + */ + else { + + if (lseparator) { + + out.write('\r'); + out.write(Integer.toString(++line)); + out.write('\t'); + lseparator = false; + } + out.write(c); + } + } + } + } } diff --git a/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/filters/UpperCaseFilterWriter.java b/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/filters/UpperCaseFilterWriter.java index 1be272e..be5ddda 100644 --- a/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/filters/UpperCaseFilterWriter.java +++ b/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/filters/UpperCaseFilterWriter.java @@ -7,26 +7,46 @@ /** * * @author Olivier Liechti + * EDITED BY + * @author Antoine Nourazar */ public class UpperCaseFilterWriter extends FilterWriter { - - public UpperCaseFilterWriter(Writer wrappedWriter) { - super(wrappedWriter); - } - @Override - public void write(String str, int off, int len) throws IOException { - throw new UnsupportedOperationException("The student has not implemented this method yet."); - } + public UpperCaseFilterWriter(Writer wrappedWriter) { + super(wrappedWriter); + } - @Override - public void write(char[] cbuf, int off, int len) throws IOException { - throw new UnsupportedOperationException("The student has not implemented this method yet."); - } + @Override + public void write(String str, int off, int len) throws IOException { + + // Convert to uppercase + str = str.toUpperCase(); + + // Use the mother's method + super.write(str, off, len); + } - @Override - public void write(int c) throws IOException { - throw new UnsupportedOperationException("The student has not implemented this method yet."); - } + @Override + public void write(char[] cbuf, int off, int len) throws IOException { + + /* Convert to uppercase */ + for (int i = 0; i < cbuf.length; i++) + cbuf[i] = Character.toUpperCase(cbuf[i]); + + + //Use the mother's method + super.write(cbuf, off, len); + + } + + @Override + public void write(int c) throws IOException { + + // Convert to uppercase + c = Character.toUpperCase(c); + + //Use mother's method + super.write(c); + } } diff --git a/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/transformers/CompleteFileTransformer.java b/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/transformers/CompleteFileTransformer.java index 86fff79..2add31d 100644 --- a/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/transformers/CompleteFileTransformer.java +++ b/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/transformers/CompleteFileTransformer.java @@ -1,6 +1,7 @@ package ch.heigvd.res.lab01.impl.transformers; import java.io.Writer; +import ch.heigvd.res.lab01.impl.filters.*; /** * This class returns a writer decorated with two filters: an instance of @@ -10,21 +11,23 @@ * beginning of each line. * * @author Olivier Liechti + * EDITED BY + * @author Antoine Nourazar */ public class CompleteFileTransformer extends FileTransformer { @Override public Writer decorateWithFilters(Writer writer) { - if (true) { - throw new UnsupportedOperationException("The student has not implemented this method yet."); - } + /* * If you uncomment the following line (and get rid of th 3 previous lines...), you will restore the decoration * of the writer (connected to the file. You can see that you first decorate the writer with an UpperCaseFilterWriter, which you then * decorate with a FileNumberingFilterWriter. The resulting writer is used by the abstract class to write the characters read from the * input files. So, the input is first prefixed with line numbers, then transformed to uppercase, then sent to the output file.f + * + * FIXED ! */ - //writer = new FileNumberingFilterWriter(new UpperCaseFilterWriter(writer)); + writer = new FileNumberingFilterWriter(new UpperCaseFilterWriter(writer)); return writer; } diff --git a/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/transformers/FileTransformer.java b/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/transformers/FileTransformer.java index 5eec488..e25a088 100644 --- a/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/transformers/FileTransformer.java +++ b/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/transformers/FileTransformer.java @@ -24,6 +24,8 @@ * a list of filters and decorates the output writer with them. * * @author Olivier Liechti + * EDITED BY + * @author Antoine Nourazar */ public abstract class FileTransformer implements IFileVisitor { @@ -52,16 +54,22 @@ public void visit(File file) { Reader reader = new InputStreamReader(new FileInputStream(file), "UTF-8"); Writer writer = new OutputStreamWriter(new FileOutputStream(file.getPath()+ ".out"), "UTF-8"); // the bug fix by teacher writer = decorateWithFilters(writer); - + /* * There is a missing piece here: you have an input reader and an ouput writer (notice how the * writer has been decorated by the concrete subclass!). You need to write a loop to read the * characters and write them to the writer. + * + * FIXED ! (Maybe the infinite loops came from here, I tried to test several implementations here...) */ + while (reader.ready()) { + writer.write(reader.read()); + } reader.close(); writer.flush(); writer.close(); + } catch (IOException ex) { LOG.log(Level.SEVERE, null, ex); } diff --git a/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/transformers/NoOpFileTransformer.java b/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/transformers/NoOpFileTransformer.java index 41670aa..72a74b3 100644 --- a/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/transformers/NoOpFileTransformer.java +++ b/Lab01App-build/Lab01App-code/src/main/java/ch/heigvd/res/lab01/impl/transformers/NoOpFileTransformer.java @@ -8,19 +8,21 @@ * the content of the input file into the output file. * * @author Olivier Liechti + * EDITED BY + * @author Antoine Nourazar */ public class NoOpFileTransformer extends FileTransformer { @Override public Writer decorateWithFilters(Writer writer) { - throw new UnsupportedOperationException("The student has not implemented this method yet."); /* * The NoOpFileTransformer does not apply any transformation of the character stream * (no uppercase, no line number, etc.). So, we don't need to decorate the writer connected to * the output file at all. Just uncomment the following line and get rid of the UnsupportedOperationException and * you will be all set. + * FIXED ! */ - //return writer; + return writer; } } diff --git a/Lab01App-build/Lab01App-test/tmp/test.txt b/Lab01App-build/Lab01App-test/tmp/test.txt deleted file mode 100644 index 2b33688..0000000 --- a/Lab01App-build/Lab01App-test/tmp/test.txt +++ /dev/null @@ -1,2 +0,0 @@ -Les bons élèves sont tous très assidus. -Les bons maîtres sont appliqués. \ No newline at end of file diff --git a/Lab01App-build/Lab01App-test/tmp/test.txt.out b/Lab01App-build/Lab01App-test/tmp/test.txt.out deleted file mode 100644 index e69de29..0000000