|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
This report was generated with an evaluation server license. Purchase Clover or configure your license. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
VertaaTiedosto | Line # 25 | 119 | 53 | 100% |
1.0
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
(10) | |||
Result | |||
0.2820513
|
alitest.VertaaTiedostoTest.testVertaaFileFile34
![]() |
1 PASS | |
0.2820513
|
alitest.VertaaTiedostoTest.testVertaaFileString99
![]() |
1 PASS | |
0.25641027
|
alitest.VertaaTiedostoTest.testVertaaString201
![]() |
1 PASS | |
0.23589744
|
alitest.VertaaTiedostoTest.testVertaaString2157
![]() |
1 PASS | |
0.22564103
|
alitest.SuuntaajaTest.testInNimi389
![]() |
1 PASS | |
0.20512821
|
alitest.SuuntaajaTest.testEro347
![]() |
1 PASS | |
0.17948718
|
alitest.SuuntaajaTest.testWriteTo316
![]() |
1 PASS | |
0.17948718
|
alitest.SuuntaajaTest.testOutNimi137
![]() |
1 PASS | |
0.06666667
|
alitest.VertaaTiedostoTest.testKirjoitaTiedosto250
![]() |
1 PASS | |
0.06153846
|
alitest.SuuntaajaTest.testInNimi82
![]() |
1 PASS | |
1 | package fi.jyu.mit.ohj2; | |
2 | import java.io.*; | |
3 | import java.util.Scanner; | |
4 | ||
5 | /** | |
6 | * Aliohjelma kahden tekstitiedoston vertaamiseksi. | |
7 | * Käyttö lähinnä JUnit testeissä esim. seuraavasti: | |
8 | * <pre> | |
9 | * VertaaTiedosto.kirjoitaTiedosto("hiljaa.txt", | |
10 | * "33 hiljaa 1 hiipii\n"+ | |
11 | * "hyvä 33 tulee\n"+ | |
12 | * "36 1 3 5 55\n"+ | |
13 | * "nyt 33 riittää\n"); | |
14 | * VertaaTiedosto.kirjoitaTiedosto("hiljaayli30.txt", | |
15 | * "33 hiljaa 1 hiipii\n"+ | |
16 | * "36 1 3 5 55\n"); | |
17 | * VertaaTiedosto.tuhoaTiedosto("tulos.txt"); | |
18 | * TulYli30.main(new String[]{"hiljaa.txt","tulos.txt"}); | |
19 | * String virhe=VertaaTiedosto.vertaa("tulos.txt","hiljaayli30.txt"); | |
20 | * if ( virhe != null ) fail(virhe); | |
21 | * </pre> | |
22 | * @author vesal | |
23 | * @version 10.3.2007 | |
24 | */ | |
25 | public class VertaaTiedosto { // NOPMD Cyclomatic | |
26 | /** | |
27 | * Verrataan kahta tekstitiedostoa ja heti kun tulee ensimmäin poikkeava | |
28 | * rivi palautetaanvirhe. Lopussa olevat pelkkä yksi rivi ei tee eroa. | |
29 | * @param nimi1 1. verrattavan tiedoston nimi | |
30 | * @param nimi2 2. verrattavan tiedoston nimi | |
31 | * @return ensimmäinen eroavaisuus joka löytyy. Null jos ei eroja. | |
32 | * @throws IOException jos lukemisessa tapahtuu virhe. | |
33 | * @example | |
34 | * <pre name="test"> | |
35 | * #THROWS IOException | |
36 | * #import java.io.*; | |
37 | * #STATICIMPORT | |
38 | * kirjoitaTiedosto("hiljaa1.txt", "33 hiljaa 1 hiipii\nhyvä 33 tulee\n"); | |
39 | * | |
40 | * kirjoitaTiedosto("hiljaa2.txt", "33 hiljaa 1 hiipii\nhyvä 33 tulee\n"); | |
41 | * vertaaFileFile("hiljaa1.txt","hiljaa2.txt") === null; | |
42 | * | |
43 | * kirjoitaTiedosto("hiljaa2.txt", "33 hiljaa 1 hiipii\nhyvä 33 tulee"); | |
44 | * vertaaFileFile("hiljaa1.txt","hiljaa2.txt") === null; | |
45 | * | |
46 | * kirjoitaTiedosto("hiljaa2.txt", "33 hiljaa 1 hiipii\nhyvä 33 tulee\n\n\n"); | |
47 | * vertaaFileFile("hiljaa1.txt","hiljaa2.txt") === "Rivi 3: hiljaa1.txt loppui ensin, hiljaa2.txt on "; | |
48 | * | |
49 | * kirjoitaTiedosto("hiljaa2.txt", "33 hiljaa 1 hiipii\nhyvä 34 tulee\n"); | |
50 | * vertaaFileFile("hiljaa1.txt","hiljaa2.txt") === "Ero riveissä 2: hyvä 33 tulee ja hyvä 34 tulee"; | |
51 | * | |
52 | * kirjoitaTiedosto("hiljaa2.txt", "33 hiljaa 1 hiipii\n"); | |
53 | * vertaaFileFile("hiljaa1.txt","hiljaa2.txt") === "Rivi 2: hiljaa2.txt loppui ensin, hiljaa1.txt on hyvä 33 tulee"; | |
54 | * | |
55 | * kirjoitaTiedosto("hiljaa2.txt", "33 hiljaa 1 hiipii\nhyvä 33 tulee\nja 34 tulee\n"); | |
56 | * vertaaFileFile("hiljaa1.txt","hiljaa2.txt") === "Rivi 3: hiljaa1.txt loppui ensin, hiljaa2.txt on ja 34 tulee"; | |
57 | * vertaaFileFile("hiljaa1.txt","hiljaa3.txt") === "Tiedosto ei aukea: hiljaa3.txt"; | |
58 | * vertaaFileFile("hiljaa4.txt","hiljaa2.txt") === "Tiedosto ei aukea: hiljaa4.txt"; | |
59 | * | |
60 | * tuhoaTiedosto("hiljaa1.txt"); | |
61 | * tuhoaTiedosto("hiljaa2.txt"); | |
62 | * | |
63 | * </pre> | |
64 | */ | |
65 | 8 |
![]() |
66 | 8 | BufferedReader f1 = null; |
67 | 8 | BufferedReader f2 = null; |
68 | 8 | try { |
69 | 8 | f1 = Tiedosto.avaa_lukemista_varten(nimi1); |
70 | 8 | f2 = Tiedosto.avaa_lukemista_varten(nimi2); |
71 | 8 | if ( f1 == null ) return "Tiedosto ei aukea: " + nimi1; |
72 | 7 | if ( f2 == null ) return "Tiedosto ei aukea: " + nimi2; |
73 | 6 | int n = 1; |
74 | ||
75 | 6 | while (true) { |
76 | 16 | String s1 = f1.readLine(); |
77 | 16 | String s2 = f2.readLine(); |
78 | 16 | if (s1 == null && s2 == null ) return null; |
79 | 14 | if (s1 != null && s2 == null ) return "Rivi "+ n + ": " + nimi2 + " loppui ensin, " + nimi1 + " on "+ s1; // NOPMD |
80 | 13 | if (s1 == null && s2 != null) return "Rivi "+ n + ": " + nimi1 + " loppui ensin, " + nimi2 + " on "+ s2; // NOPMD |
81 | 11 | if ( s1.compareTo(s2) != 0 ) return "Ero riveissä " + n + ": " + s1 + " ja " + s2; // NOPMD |
82 | 10 | n++; |
83 | } | |
84 | } finally { | |
85 | 8 | if (f1 != null) |
86 | 7 | f1.close(); |
87 | 8 | if (f2 != null) |
88 | 7 | f2.close(); |
89 | } | |
90 | } | |
91 | ||
92 | /** | |
93 | * Verrataan tekstitiedostoa merkkijonoon ja heti kun tulee ensimmäinen poikkeava | |
94 | * rivi palautetaan virhe. Lopussa olevat pelkkä yksi tyhkä rivi eo tee eroa. | |
95 | * @param nimi1 1. verrattavan tiedoston nimi | |
96 | * @param ss2 2. verrattava sisältö | |
97 | * @return ensimmäinen eroavaisuus joka löytyy. Null jos ei eroja. | |
98 | * @throws IOException jos lukemisessa tapahtuu virhe. | |
99 | * <pre name="test"> | |
100 | * #THROWS IOException | |
101 | * #import java.io.*; | |
102 | * #STATICIMPORT | |
103 | * kirjoitaTiedosto("hiljaa1.txt", "33 hiljaa 1 hiipii\nhyvä 33 tulee\n"); | |
104 | * | |
105 | * vertaaFileString("hiljaa1.txt","33 hiljaa 1 hiipii\nhyvä 33 tulee\n") === null; | |
106 | * | |
107 | * vertaaFileString("hiljaa1.txt","33 hiljaa 1 hiipii\nhyvä 33 tulee") === null; | |
108 | * | |
109 | * vertaaFileString("hiljaa1.txt","33 hiljaa 1 hiipii\nhyvä 33 tulee\n\n") === "Rivi 3: hiljaa1.txt loppui ensin, jono on "; | |
110 | * | |
111 | * vertaaFileString("hiljaa1.txt","33 hiljaa 1 hiipii\nhyvä 33 tulee\n\n\n") === "Rivi 3: hiljaa1.txt loppui ensin, jono on "; | |
112 | * | |
113 | * vertaaFileString("hiljaa1.txt","33 hiljaa 1 hiipii\nhyvä 34 tulee\n") === "Ero riveissä 2: hyvä 33 tulee ja hyvä 34 tulee"; | |
114 | * | |
115 | * vertaaFileString("hiljaa1.txt","33 hiljaa 1 hiipii\n") === "Rivi 2: Jono loppui ensin, hiljaa1.txt on hyvä 33 tulee"; | |
116 | * | |
117 | * vertaaFileString("hiljaa1.txt","33 hiljaa 1 hiipii\nhyvä 33 tulee\nja 34 tulee\n") === "Rivi 3: hiljaa1.txt loppui ensin, jono on ja 34 tulee"; | |
118 | * vertaaFileString("hiljaa1.txt",null) === "Jono on null"; | |
119 | * vertaaFileString("hiljaa4.txt","hiljaa2.txt") === "Tiedosto ei aukea: hiljaa4.txt"; | |
120 | * | |
121 | * tuhoaTiedosto("hiljaa1.txt"); | |
122 | * | |
123 | * </pre> | |
124 | */ | |
125 | 12 |
![]() |
126 | 12 | if ( ss2 == null ) return "Jono on null"; |
127 | 11 | BufferedReader f1 = null; |
128 | 11 | Scanner f2 = new Scanner(ss2); |
129 | 11 | int n = 1; |
130 | 11 | try { |
131 | 11 | f1 = Tiedosto.avaa_lukemista_varten(nimi1); |
132 | 11 | if ( f1 == null ) return "Tiedosto ei aukea: " + nimi1; |
133 | ||
134 | 10 | while (true) { |
135 | 27 | String s1 = f1.readLine(); |
136 | 27 | boolean b2 = f2.hasNextLine(); |
137 | 27 | String s2 = null; |
138 | 27 | if ( b2 ) s2 = f2.nextLine(); |
139 | 27 | if (s1 == null && !b2) return null; |
140 | 22 | if (s1 != null && !b2 ) return "Rivi "+ n + ": " + "Jono loppui ensin, " + nimi1 + " on "+ s1; |
141 | 21 | if (s1 == null && b2) return "Rivi "+ n + ": " + nimi1 + " loppui ensin, " + "jono on "+ s2; |
142 | 18 | if ( s1.compareTo(s2) != 0 ) return "Ero riveissä " + n + ": " + s1 + " ja " + s2; |
143 | 17 | n++; |
144 | } | |
145 | } finally { | |
146 | 11 | if (f1 != null) |
147 | 10 | f1.close(); |
148 | } | |
149 | } | |
150 | ||
151 | /** | |
152 | * Verrataan kahta tekstitiedoston kaltaista merkkijonoa ja heti kun tulee ensimmäinen poikkeava | |
153 | * rivi palautetaan virhe. Lopussa oleva yksi tyhjä rivi ei tee eroa. | |
154 | * @param ss1 1. verrattava sisältö | |
155 | * @param ss2 2. verrattava sisältö | |
156 | * @return ensimmäinen eroavaisuus joka löytyy. Null jos ei eroja. | |
157 | * <pre name="test"> | |
158 | * #THROWS IOException | |
159 | * #import java.io.*; | |
160 | * #STATICIMPORT | |
161 | * vertaaString2("","\n") === "Rivi 1: 1. loppui ensin, 2. on "; | |
162 | * vertaaString2("kissa\n","kissa") === null; | |
163 | * vertaaString2("\n\n","\n") === "Rivi 2: 2. loppui ensin, 1. on "; | |
164 | * vertaaString2("\r\n","\n") === null; | |
165 | * vertaaString2("\r\n","\n\n") === "Rivi 2: 1. loppui ensin, 2. on "; | |
166 | * vertaaString2("33 hiljaa 1 hiipii\r\nhyvä 33 tulee\r\n","33 hiljaa 1 hiipii\nhyvä 33 tulee\n") === null; | |
167 | * vertaaString2("a b","a c") === "Ero riveissä 1: a b ja a c" | |
168 | * vertaaString2(null,null) === null; | |
169 | * vertaaString2(null," ") === "1. on null"; | |
170 | * vertaaString2(" ",null) === "2. on null"; | |
171 | * </pre> | |
172 | */ | |
173 | 10 |
![]() |
174 | 10 | if ( ss1 == null & ss2 == null ) return null; |
175 | 9 | if ( ss1 == null ) return "1. on null"; |
176 | 8 | if ( ss2 == null ) return "2. on null"; |
177 | 7 | Scanner f1 = new Scanner(ss1); |
178 | 7 | Scanner f2 = new Scanner(ss2); |
179 | 7 | int n = 1; |
180 | 7 | while (true) { |
181 | 13 | String s1 = null; |
182 | 13 | String s2 = null; |
183 | 13 | boolean b1 = f1.hasNextLine(); |
184 | 13 | boolean b2 = f2.hasNextLine(); |
185 | 13 | if ( b1 ) s1 = f1.nextLine(); |
186 | 13 | if ( b2 ) s2 = f2.nextLine(); |
187 | 13 | if ( !b1 && !b2) return null; |
188 | 10 | if ( b1 && !b2 ) return "Rivi "+ n + ": " + "2. loppui ensin, 1. on "+ s1; |
189 | 9 | if ( !b1 && b2) return "Rivi "+ n + ": " + "1. loppui ensin, 2. on "+ s2; |
190 | 7 | if ( s1.compareTo(s2) != 0 ) return "Ero riveissä " + n + ": " + s1 + " ja " + s2; |
191 | 6 | n++; |
192 | } | |
193 | } | |
194 | ||
195 | /** | |
196 | * Verrataan kahta tekstitiedoston kaltaista merkkijonoa ja heti kun tulee ensimmäinen poikkeava | |
197 | * rivi palautetaan virhe. Lopussa olevat pelkät tyhjät rivit merkitsevät. | |
198 | * @param ss1 1. verrattava sisältö | |
199 | * @param ss2 2. verrattava sisältö | |
200 | * @return ensimmäinen eroavaisuus joka löytyy. Null jos ei eroja. | |
201 | * <pre name="test"> | |
202 | * #THROWS IOException | |
203 | * #import java.io.*; | |
204 | * #STATICIMPORT | |
205 | * vertaaString("kissa\n","kissa") === "Rivi 2: 2. loppui ensin, 1. on "; | |
206 | * vertaaString("","\n") === "Rivi 1: 1. loppui ensin, 2. on "; | |
207 | * vertaaString("\n\n","\n") === "Rivi 3: 2. loppui ensin, 1. on "; | |
208 | * vertaaString("\r\n","\n") === null; | |
209 | * vertaaString("\r","\n") === null; | |
210 | * vertaaString("\r\n","\n\n") === "Rivi 3: 1. loppui ensin, 2. on "; | |
211 | * vertaaString("33 hiljaa 1 hiipii\r\nhyvä 33 tulee\r\n","33 hiljaa 1 hiipii\nhyvä 33 tulee\n") === null; | |
212 | * vertaaString("a b","a c") === "Ero riveissä 1: a b ja a c" | |
213 | * vertaaString(null,null) === null; | |
214 | * vertaaString(null," ") === "1. on null"; | |
215 | * vertaaString(" ",null) === "2. on null"; | |
216 | * </pre> | |
217 | */ | |
218 | 16 |
![]() |
219 | 16 | if ( ss1 == null & ss2 == null ) return null; |
220 | 15 | if ( ss1 == null ) return "1. on null"; |
221 | 14 | if ( ss2 == null ) return "2. on null"; |
222 | 13 | ss1 = ss1.replaceAll("\\r\\n", "\n"); |
223 | 13 | ss2 = ss2.replaceAll("\\r\\n", "\n"); |
224 | 13 | ss1 = ss1.replaceAll("\\r", "\n"); |
225 | 13 | ss2 = ss2.replaceAll("\\r", "\n"); // Toki nyt voitaisiin verrata pelkkiä jonoja sellaisenaan |
226 | 13 | Erottelija f1 = new Erottelija(ss1,"\n"); |
227 | 13 | Erottelija f2 = new Erottelija(ss2,"\n"); |
228 | 13 | int n = 1; |
229 | 13 | while (true) { |
230 | 34 | String s1 = null; |
231 | 34 | String s2 = null; |
232 | 34 | boolean b1 = f1.hasMoreTokens(); |
233 | 34 | boolean b2 = f2.hasMoreTokens(); |
234 | 34 | if ( b1 ) s1 = f1.nextToken(); |
235 | 34 | if ( b2 ) s2 = f2.nextToken(); |
236 | 34 | if ( !b1 && !b2) return null; |
237 | 27 | if ( b1 && !b2 ) return "Rivi "+ n + ": " + "2. loppui ensin, 1. on "+ s1; |
238 | 25 | if ( !b1 && b2) return "Rivi "+ n + ": " + "1. loppui ensin, 2. on "+ s2; |
239 | 23 | if ( s1.compareTo(s2) != 0 ) return "Ero riveissä " + n + ": " + s1 + " ja " + s2; |
240 | 21 | n++; |
241 | } | |
242 | } | |
243 | ||
244 | /** | |
245 | * Kirjoitetaan tiedostoon sisältö | |
246 | * @param nimi tiedoston nimi johon kirjoitetaan | |
247 | * @param sisalto merkkijono joka kirjoitetaan tiedostoon | |
248 | * @throws IOException jos tiedosto ei aukea. | |
249 | * @example | |
250 | * <pre name="test"> | |
251 | * #THROWS IOException | |
252 | * kirjoitaTiedosto("hiljaa1.txt", "33 hiljaa 1 hiipii\nhyvä 33 tulee\n"); | |
253 | * tuhoaTiedosto("hiljaa1.txt"); | |
254 | * kirjoitaTiedosto("ö:\\ö.ö", "33 hiljaa 1 hiipii\nhyvä 33 tulee\n"); #THROWS IOException | |
255 | * </pre> | |
256 | */ | |
257 | 12 |
![]() |
258 | 12 | PrintWriter out = null; |
259 | 12 | try { |
260 | 12 | out = new PrintWriter(new FileWriter(nimi)); |
261 | 11 | out.write(sisalto); |
262 | 11 | out.close(); |
263 | } finally { | |
264 | 12 | if (out != null) |
265 | 11 | out.close(); |
266 | } | |
267 | } | |
268 | ||
269 | /** | |
270 | * Tuhotaan tiedosto levyltä | |
271 | * @param nimi tuhottavan tiedoston nimi | |
272 | */ | |
273 | 9 |
![]() |
274 | 9 | File f = new File(nimi); |
275 | 9 | f.delete(); |
276 | } | |
277 | ||
278 | /** | |
279 | * Testataan tiedostojen vertaamista | |
280 | * @param args ei käytössä | |
281 | * @throws IOException jos tulee virhe | |
282 | */ | |
283 | /* | |
284 | public static void main(String[] args) throws IOException { | |
285 | String koe = vertaaFileFile("fi/jyu/mit/ohj2/IO.java","fi/jyu/mit/ohj2/Syotto.java"); | |
286 | System.out.println(koe); | |
287 | } | |
288 | */ | |
289 | } |
|