# test for reading pajek formatted files


# test for case of verticse, but no edges/arcs
tmptest<-tempfile()
cat("*Vertices          2
        1    1231062
        2    1231095
*Arcs
*Edges
",file=tmptest)
noEdges<-read.paj(tmptest)
expect_equal(network.size(noEdges),2)
expect_equal(network.edgecount(noEdges),0)


# check arcs vs edges parsing

# arcs only

tmptest<-tempfile()
cat("*Vertices          3
1   'A'
2   'B'
3   'C'
*Arcs
1 2 1
1 3 1
",file=tmptest)
arcsOnly<-read.paj(tmptest)
expect_true(is.directed(arcsOnly))
expect_equal(network.edgecount(arcsOnly),2)

# edges only
tmptest<-tempfile()
cat('*Vertices      9
1 "1"    0.3034    0.7561
2 "2"    0.4565    0.6039
3 "3"    0.4887    0.8188
4 "4"    0.5687    0.4184
5 "5"    0.3574    0.4180
6 "6"    0.7347    0.2678
7 "7"    0.9589    0.3105
8 "8"    0.8833    0.1269
9 "9"    0.7034    0.0411
*Arcs
*Edges
1      2       1
1      3       1
2      3       1
2      4       1
2      5       1
4      5       1
4      6       1
6      7       1
6      8       1
6      9       1
7      8       1
8      9       1
',file=tmptest)
edgesOnly<-read.paj(tmptest)
expect_false(is.directed(edgesOnly))
expect_equal(network.edgecount(edgesOnly),12)


# both arcs and edges
# network will be directed, each *edges record will create one arc in each direction
tmptest<-tempfile()
cat("*Vertices          4
1   'A'
2   'B'
3   'C'
4   'D'
*Arcs
1 2 1
1 3 1
*Edges
3 4 1
",file=tmptest)
arcsNEdges<-read.paj(tmptest)
expect_true(is.directed(arcsNEdges))
expect_equal(network.edgecount(arcsNEdges),4)
as.matrix(arcsNEdges)


# ----- error testing
tmptest<-tempfile()
cat("*Vertices          2
1   'A'
2   'B'
*Arcs
1
",file=tmptest)
expect_error(read.paj(tmptest),regexp = 'does not appear to have the required')

tmptest<-tempfile()
cat("*Vertices          2
1   'A'
2   'B'
*Arcs
1 A 1
",file=tmptest)
expect_error(suppressWarnings(read.paj(tmptest)),regexp = 'contains non-numeric or NA values')

tmptest<-tempfile()
cat("*Vertices          2
1   'A'
2   'B'
*Arcs
1 2.5 1
",file=tmptest)
expect_error(read.paj(tmptest),regexp = 'contains non-integer values')


# check vertex graphic attribute fill-in
tmptest<-tempfile()
cat("*Vertices          4
1   'A' 0 0 0 box
2   'B' 0 0 0
3   'C' 0 0 0
4   'D' 0 0 0 ellipse
*Arcs
1 2 1
1 3 1
",file=tmptest)
fillIn<-read.paj(tmptest)
expect_equal(fillIn%v%'shape',c('box','box','box','ellipse'))


# test stuff in file comments
########## but multirelational ############ only ~200  nodes
#GulfLDays.net
#GulfLMonths.net
#GulfLDow.net
#gulfAllDays.net     #GulfADays.zip
#gulfAllMonths.net   #GulfAMonths.zip
#LevantDays.net
#LevantMonths.net
#BalkanDays.net
#BalkanMonths.net

#arcs and edges both present   search for " #these have both arc and edge lines " or "URL has a net file"
#Graph drawing competition page (GD)
#C95,C95,B98,A99,C99,A99m


#things to do:
#handle ragged array .net files like "CSphd.net"     DONE!!
#handel two mode networks                            DONE!!
#handle mix of edges and arcs                        DONE!!
#handle multirelational pajek files

#issue with read.table and number.cols and fill...SanJuanSur_deathmessage.net has one row with 8 all the rest (including the first 5 have 5)



## # this file has character encoding issues
## scotland<-tempfile('scotland',fileext='.zip')
## download.file(
##   'http://vlado.fmf.uni-lj.si/pub/networks/data/esna/scotland.zip',
##   scotland,
##   quiet = TRUE)
## scotpaj<-tempfile('Scotland',fileext='.paj')
## con <- unz(scotland,'Scotland.paj')
## cat(
##   readLines(con, encoding = "UTF-8"),
##   sep='\n',
##   file = scotpaj
##   )
## close(con)
## scotproj<-read.paj(scotpaj)

## # produces two element list, containing networks and partitions
## expect_equal(names(scotproj),c("networks","partitions"))
## expect_equal(network.size(scotproj[[1]][[1]]),244)
## expect_equal(names(scotproj$partitions),c("Affiliation.partition.of.N1.[108,136]","Industrial_categories.clu"))


## A95net<-read.paj("http://vlado.fmf.uni-lj.si/pub/networks/data/GD/gd95/A95.net")
## expect_equal(network.size(A95net),36)
## expect_equal(network.vertex.names(A95net)[1:5],c("MUX","INSTRUCTION BUFFER (4 x 16)", "RCV","DRV","ROM REG"))

## # test reading a .paj project file
## bkfratProj<-read.paj('http://vlado.fmf.uni-lj.si/pub/networks/data/ucinet/bkfrat.paj')

## # should have two networks
## expect_equal(sapply(bkfratProj,class),c('network','network'),check.attributes=FALSE)
## # .. with wierd names
## expect_equal(names(bkfratProj),c('UciNet\\BKFRAT.DAT : BKFRAB','UciNet\\BKFRAT.DAT : BKFRAC'))
## # and 58 vertices
## expect_equal(sapply(bkfratProj,network.size),c(58,58),check.attributes=FALSE)
## expect_equal(sapply(bkfratProj,network.edgecount),c(1934,3306),check.attributes=FALSE)

## #check edge values and attribute naming
## expect_equal((bkfratProj[[1]]%e%"UciNet\\BKFRAT.DAT : BKFRAB")[1900:1934],c(1, 1, 1, 5, 2, 4, 2, 1, 3, 1, 3, 1, 2, 5, 1, 1, 1, 2, 1, 2, 2, 1, 6, 2, 1, 2, 2, 1, 1, 1, 1, 3, 3, 1, 1))

## # check vert attrs
## expect_equal(list.vertex.attributes(bkfratProj[[1]]),c('na','vertex.names','x','y','z'))

## # check network attrs
## expect_equal(bkfratProj[[1]]%n%'title',"UciNet\\BKFRAT.DAT : BKFRAB")
## expect_equal(bkfratProj[[2]]%n%'title',"UciNet\\BKFRAT.DAT : BKFRAC")

## # check loop flagging

## tmptest<-tempfile()
## cat("*Vertices          2
## 1   'A'
## 2   'B'
## *Arcs
## 1 1 1
## ",file=tmptest)
## loopTest<-read.paj(tmptest,verbose=FALSE)
## expect_true(has.loops(loopTest))

## # check edge.name argument

## tmptest<-tempfile()
## cat("*Vertices          2
## 1   'A'
## 2   'B'
## *Arcs
## 1 1 1
## ",file=tmptest)
## loopTest<-read.paj(tmptest,verbose=FALSE,edge.name='weight')
## expect_equal(list.edge.attributes(loopTest),c('na','weight'))

## # the rest of these will take longer, so including in opttest block so won't run on CRAN
## require(statnet.common)
## opttest(testvar = "ENABLE_statnet_TESTS",{


## #  ----- examples from http://vlado.fmf.uni-lj.si/pub/networks/doc/ECPR/08/ECPR01.pdf ---

## GraphSet<-read.paj('http://vlado.fmf.uni-lj.si/vlado/podstat/AO/net/GraphSet.net')
## expect_true(is.directed(GraphSet))
## expect_equal(network.edgecount(GraphSet),27)
## # network contains some repeated edges
## expect_true(is.multiplex(GraphSet))
## expect_equal(network.vertex.names(GraphSet),letters[1:12])

## Tina<-read.paj('http://vlado.fmf.uni-lj.si/vlado/podstat/AO/net/TinaSet.net')

## # arcslist
## GraphList<-read.paj('http://vlado.fmf.uni-lj.si/vlado/podstat/AO/net/GraphList.net')
## # http://vlado.fmf.uni-lj.si/vlado/podstat/AO/net/TinaList.net  # arcslist

## # matrix
## GraphMat <-read.paj('http://vlado.fmf.uni-lj.si/vlado/podstat/AO/net/GraphMat.net')
## expect_equal(network.vertex.names(GraphMat),letters[1:12])
## # check that edge attribute created and parsed correctly
## expect_equal(as.matrix(GraphMat,attrname='GraphMat')[3,7],2)

## # partition
## TinaPaj<-read.paj('http://vlado.fmf.uni-lj.si/vlado/podstat/AO/net/Tina.paj')
## expect_equal(class(TinaPaj$partitions),'data.frame')
## expect_equal( TinaPaj$partitions[,1],c(2,1,2,2,2,2,2,2,3,3,3),use.names=FALSE)
## expect_true(is.network(TinaPaj$networks$Tina))

## # --- crude timing info --
## # by default timing info should be added as attribute
## timetest<-read.paj('http://vlado.fmf.uni-lj.si/vlado/podstat/AO/net/Time.net')
## expect_equal(timetest%e%'pajekTiming',c("[7]","[6-8]"))
## expect_equal(timetest%v%'pajekTiming',c("[5-10,12-14]", "[1-3,7]", "[4-*]"))
## expect_true(setequal(list.vertex.attributes(timetest),c('na','pajekTiming','vertex.names'))) # no x or y
## expect_true(setequal(list.edge.attributes(timetest),c('na','pajekTiming','Time')))

## # test converting to networkDynamic format
## timetestNd<-read.paj('http://vlado.fmf.uni-lj.si/vlado/podstat/AO/net/Time.net',time.format='networkDynamic')
## expect_equal(class(timetestNd),c('networkDynamic','network'))
## # check that activiy matrices are built as expected
## expect_equal(get.vertex.attribute(timetestNd,'active',unlist=FALSE),list(structure(c(5, 12, 11, 15), .Dim = c(2L, 2L)), structure(c(1, 7, 4, 8), .Dim = c(2L, 2L)), structure(c(4, Inf), .Dim = 1:2)))
## expect_equal(get.edge.attribute(timetestNd,'active',unlist=FALSE),list(structure(c(7, 8), .Dim = 1:2), structure(c(6, 9), .Dim = 1:2)))

## # read a *big* one http://vlado.fmf.uni-lj.si/pub/networks/data/CRA/Days.zip
## # 1.3 Mb, 13k vertices, 256K lines.
## #  days<-tempfile('days',fileext='.zip')
## #  download.file('http://vlado.fmf.uni-lj.si/pub/networks/data/CRA/Days.zip',days)
## #  terrorTerms<-read.paj(unz(days,'Days.net'),verbose=TRUE,time.format='networkDynamic',edge.name='count')



## # multiple networks
## sampson<-read.paj('http://vlado.fmf.uni-lj.si/pub/networks/pajek/data/Sampson.net')
## lapply(sampson,class)  # for some reason it is a formula?
## expect_equal(names(sampson$networks),c("SAMPLK1", "SAMPLK2", "SAMPLK3",  "SAMPDLK",  "SAMPES","SAMPDES","SAMPIN","SAMPNIN","SAMPPR","SAMNPR"))

## # multiple networks in arcslist format
## # sampsonL<-read.paj('http://vlado.fmf.uni-lj.si/pub/networks/pajek/data/SampsonL.net')

## # two-mode
## sandi<-read.paj('http://vlado.fmf.uni-lj.si/pub/networks/data/2mode/sandi/sandi.net')
## expect_true(is.bipartite(sandi))
## expect_equal(sandi%n%'bipartite',314)
## Davis<-read.paj('http://vlado.fmf.uni-lj.si/vlado/podstat/AO/net/Davis.paj')         # two-mode
## expect_equal(Davis$networks[[1]]%n%'bipartite',18)

## # lots of edge and vertex attributes
## A96<-read.paj('http://vlado.fmf.uni-lj.si/pub/networks/data/GD/gd96/A96.net')
## expect_equal(network.size(A96),1096)
## expect_equal(list.vertex.attributes(A96),c("bw","fos","na","shape","vertex.names", "x","x_fact","y","y_fact"))   # note no z attribute
## expect_equal(head(A96%v%'shape'),c("box","ellipse", "ellipse", "ellipse", "ellipse", "ellipse"))
## # check edge attribute parsing
## expect_equal(list.edge.attributes(A96),c("A96", "fos", "l" ,  "lr",  "na",  "s",   "w"  ))
## # l is the only one with unique values
## expect_equal(head(A96%e%'l'),c("a", "s","n","r","s","t"))

## })  # end of non-cran tests



# temporal versions http://vlado.fmf.uni-lj.si/pub/networks/data/KEDS/KEDS.htm

# temporal events data (not supported)
# http://vlado.fmf.uni-lj.si/vlado/podstat/AO/net/Time.tim
# http://vlado.fmf.uni-lj.si/vlado/podstat/AO/net/Friends.tim
