Skip to content

Commit 47f517c

Browse files
committed
Add test project for image export (may not run in CI)
1 parent 803e04f commit 47f517c

15 files changed

+283
-123
lines changed

Plotly.NET.sln

+9
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Plotly.NET.Tests.CSharpCons
139139
EndProject
140140
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Plotly.NET.Tests.CSharp", "tests\Plotly.NET.Tests.CSharp\Plotly.NET.Tests.CSharp.csproj", "{26539796-0C9D-4856-8584-B58BE32CC495}"
141141
EndProject
142+
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Plotly.NET.ImageExport.Tests", "tests\Plotly.NET.ImageExport.Tests\Plotly.NET.ImageExport.Tests.fsproj", "{55A461C3-8018-4020-B16E-D6005BDFCAED}"
143+
EndProject
142144
Global
143145
GlobalSection(SolutionConfigurationPlatforms) = preSolution
144146
Debug|Any CPU = Debug|Any CPU
@@ -188,6 +190,12 @@ Global
188190
{26539796-0C9D-4856-8584-B58BE32CC495}.Dotnet|Any CPU.Build.0 = Debug|Any CPU
189191
{26539796-0C9D-4856-8584-B58BE32CC495}.Release|Any CPU.ActiveCfg = Release|Any CPU
190192
{26539796-0C9D-4856-8584-B58BE32CC495}.Release|Any CPU.Build.0 = Release|Any CPU
193+
{55A461C3-8018-4020-B16E-D6005BDFCAED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
194+
{55A461C3-8018-4020-B16E-D6005BDFCAED}.Debug|Any CPU.Build.0 = Debug|Any CPU
195+
{55A461C3-8018-4020-B16E-D6005BDFCAED}.Dotnet|Any CPU.ActiveCfg = Debug|Any CPU
196+
{55A461C3-8018-4020-B16E-D6005BDFCAED}.Dotnet|Any CPU.Build.0 = Debug|Any CPU
197+
{55A461C3-8018-4020-B16E-D6005BDFCAED}.Release|Any CPU.ActiveCfg = Release|Any CPU
198+
{55A461C3-8018-4020-B16E-D6005BDFCAED}.Release|Any CPU.Build.0 = Release|Any CPU
191199
EndGlobalSection
192200
GlobalSection(SolutionProperties) = preSolution
193201
HideSolutionNode = FALSE
@@ -203,6 +211,7 @@ Global
203211
{60114ACE-77E6-4A19-9A2F-CB64084174AF} = {EAE25A1F-86FC-426B-803F-1006D1AD06A8}
204212
{1BC73DA0-586F-45C2-BC5B-A70C452A00F0} = {EAE25A1F-86FC-426B-803F-1006D1AD06A8}
205213
{26539796-0C9D-4856-8584-B58BE32CC495} = {EAE25A1F-86FC-426B-803F-1006D1AD06A8}
214+
{55A461C3-8018-4020-B16E-D6005BDFCAED} = {EAE25A1F-86FC-426B-803F-1006D1AD06A8}
206215
EndGlobalSection
207216
GlobalSection(ExtensibilityGlobals) = postSolution
208217
SolutionGuid = {7177F1E1-341C-48AB-9864-6B525FFF7633}

build.fsx

+1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ module ProjectInfo =
8282

8383
let testProjects = [
8484
"tests/Plotly.NET.Tests/Plotly.NET.Tests.fsproj"
85+
"tests/Plotly.NET.ImageExport.Tests/Plotly.NET.ImageExport.Tests.fsproj"
8586
"tests/Plotly.NET.Tests.CSharp/Plotly.NET.Tests.CSharp.csproj"
8687
]
8788

+196-83
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,184 @@
11
#r "nuget: FSharp.Data"
22
#r "nuget: Deedle"
33
#r "nuget: FSharpAux"
4-
#r "nuget: Newtonsoft.Json, 12.0.3"
54
#r "nuget: DynamicObj"
5+
#r "nuget: Newtonsoft.Json, 13.0.1"
66

7-
#load "../Plotly.NET/StyleParams.fs"
8-
#load "../Plotly.NET/Colors.fs"
9-
#load "../Plotly.NET/Rangebreak.fs"
10-
#load "../Plotly.NET/TickFormatStop.fs"
11-
#load "../Plotly.NET/Selection.fs"
12-
#load "../Plotly.NET/Frame.fs"
13-
#load "../Plotly.NET/StockData.fs"
14-
#load "../Plotly.NET/Font.fs"
15-
#load "../Plotly.NET/Title.fs"
16-
#load "../Plotly.NET/Pathbar.fs"
17-
#load "../Plotly.NET/TreemapTiling.fs"
18-
#load "../Plotly.NET/ColorBar.fs"
19-
#load "../Plotly.NET/RangeSlider.fs"
20-
#load "../Plotly.NET/Button.fs"
21-
#load "../Plotly.NET/RangeSelector.fs"
22-
#load "../Plotly.NET/Light.fs"
23-
#load "../Plotly.NET/Legend.fs"
24-
#load "../Plotly.NET/Contours.fs"
25-
#load "../Plotly.NET/Dimensions.fs"
26-
#load "../Plotly.NET/Domain.fs"
27-
#load "../Plotly.NET/Line.fs"
28-
#load "../Plotly.NET/WaterfallConnector.fs"
29-
#load "../Plotly.NET/FunnelConnector.fs"
30-
#load "../Plotly.NET/Box.fs"
31-
#load "../Plotly.NET/Meanline.fs"
32-
#load "../Plotly.NET/Marker.fs"
33-
#load "../Plotly.NET/Hoverlabel.fs"
34-
#load "../Plotly.NET/Axis.fs"
35-
#load "../Plotly.NET/Polar.fs"
36-
#load "../Plotly.NET/Bins.fs"
37-
#load "../Plotly.NET/Cumulative.fs"
38-
#load "../Plotly.NET/Scene.fs"
39-
#load "../Plotly.NET/Selected.fs"
40-
#load "../Plotly.NET/Shape.fs"
41-
#load "../Plotly.NET/Error.fs"
42-
#load "../Plotly.NET/Table.fs"
43-
#load "../Plotly.NET/Trace.fs"
44-
#load "../Plotly.NET/Trace3d.fs"
45-
#load "../Plotly.NET/GeoProjection.fs"
46-
#load "../Plotly.NET/Geo.fs"
47-
#load "../Plotly.NET/MapboxLayerSymbol.fs"
48-
#load "../Plotly.NET/MapboxLayer.fs"
49-
#load "../Plotly.NET/Mapbox.fs"
50-
#load "../Plotly.NET/LayoutGrid.fs"
51-
#load "../Plotly.NET/Annotation.fs"
52-
#load "../Plotly.NET/Layout.fs"
53-
#load "../Plotly.NET/Template.fs"
54-
#load "../Plotly.NET/Config.fs"
55-
#load "../Plotly.NET/DisplayOptions.fs"
56-
#load "../Plotly.NET/GenericChart.fs"
57-
#load "../Plotly.NET/Chart.fs"
58-
#load "../Plotly.NET/ChartExtensions.fs"
59-
#load "../Plotly.NET/GenericChartExtensions.fs"
60-
#load "../Plotly.NET/CandelstickExtension.fs"
61-
#load "../Plotly.NET/SankeyExtension.fs"
7+
#load "../Plotly.NET/InternalUtils.fs"
8+
9+
#I "../Plotly.NET/CommonAbstractions"
10+
11+
#load "StyleParams.fs"
12+
#load "ColorKeyword.fs"
13+
#load "Colors.fs"
14+
#load "Frame.fs"
15+
#load "Font.fs"
16+
#load "Title.fs"
17+
#load "Line.fs"
18+
19+
#I "../Plotly.NET/Layout/ObjectAbstractions/Common"
20+
21+
#load "LayoutImage.fs"
22+
#load "Button.fs"
23+
#load "RangeSelector.fs"
24+
#load "RangeSlider.fs"
25+
#load "Transition.fs"
26+
#load "ActiveShape.fs"
27+
#load "ModeBar.fs"
28+
#load "DefaultColorScales.fs"
29+
#load "UniformText.fs"
30+
#load "Margin.fs"
31+
#load "Domain.fs"
32+
#load "Shape.fs"
33+
#load "Hoverlabel.fs"
34+
#load "Annotation.fs"
35+
#load "LayoutGrid.fs"
36+
#load "Legend.fs"
37+
#load "TickFormatStop.fs"
38+
#load "ColorBar.fs"
39+
#load "Rangebreak.fs"
40+
#load "LinearAxis.fs"
41+
#load "ColorAxis.fs"
42+
#load "Padding.fs"
43+
44+
#I "../Plotly.NET/Layout/ObjectAbstractions/Map"
45+
46+
#load "GeoProjection.fs"
47+
#load "Geo.fs"
48+
#load "MapboxLayerSymbol.fs"
49+
#load "MapboxLayer.fs"
50+
#load "Mapbox.fs"
51+
52+
#I "../Plotly.NET/Layout/ObjectAbstractions/3D"
53+
54+
#load "Camera.fs"
55+
#load "AspectRatio.fs"
56+
#load "Scene.fs"
57+
58+
#I "../Plotly.NET/Layout/ObjectAbstractions/Polar"
59+
60+
#load "AngularAxis.fs"
61+
#load "RadialAxis.fs"
62+
#load "Polar.fs"
63+
64+
#I "../Plotly.NET/Layout/ObjectAbstractions/Ternary"
65+
66+
#load "Ternary.fs"
67+
68+
#I "../Plotly.NET/Layout/ObjectAbstractions/Common/Slider"
69+
70+
#load "SliderCurrentValue.fs"
71+
#load "SliderStep.fs"
72+
#load "Slider.fs"
73+
74+
#load "../Plotly.NET/Layout/Layout.fs"
75+
76+
#I "../Plotly.NET/Traces/ObjectAbstractions"
77+
78+
#load "Gradient.fs"
79+
#load "Pattern.fs"
80+
#load "Marker.fs"
81+
#load "Projection.fs"
82+
#load "Surface.fs"
83+
#load "SpaceFrame.fs"
84+
#load "Slices.fs"
85+
#load "Caps.fs"
86+
#load "StreamTubeStarts.fs"
87+
#load "Lighting.fs"
88+
#load "Selection.fs"
89+
#load "StockData.fs"
90+
#load "Pathbar.fs"
91+
#load "TreemapTiling.fs"
92+
#load "Contours.fs"
93+
#load "Dimensions.fs"
94+
#load "WaterfallConnector.fs"
95+
#load "FunnelConnector.fs"
96+
#load "Box.fs"
97+
#load "MeanLine.fs"
98+
#load "Bins.fs"
99+
#load "Cumulative.fs"
100+
#load "Error.fs"
101+
#load "Table.fs"
102+
#load "Indicator.fs"
103+
#load "Icicle.fs"
104+
#load "FinanceMarker.fs"
105+
#load "SplomDiagonal.fs"
106+
107+
#I "../Plotly.NET/Traces"
108+
109+
#load "Trace.fs"
110+
#load "Trace2D.fs"
111+
#load "Trace3D.fs"
112+
#load "TracePolar.fs"
113+
#load "TraceGeo.fs"
114+
#load "TraceMapbox.fs"
115+
#load "TraceTernary.fs"
116+
#load "TraceCarpet.fs"
117+
#load "TraceDomain.fs"
118+
#load "TraceID.fs"
119+
120+
#I "../Plotly.NET/Config/ObjectAbstractions"
121+
122+
#load "ToImageButtonOptions.fs"
123+
124+
#I "../Plotly.NET/Config"
125+
126+
#load "Config.fs"
127+
128+
#I "../Plotly.NET/DisplayOptions"
129+
130+
#load "DisplayOptions.fs"
131+
132+
#I "../Plotly.NET/Templates"
133+
134+
#load "Template.fs"
135+
#load "ChartTemplates.fs"
136+
#load "Defaults.fs"
137+
138+
#I "../Plotly.NET/ChartAPI"
139+
140+
#load "GenericChart.fs"
141+
#load "Chart.fs"
142+
#load "Chart2D.fs"
143+
#load "Chart3D.fs"
144+
#load "ChartPolar.fs"
145+
#load "ChartMap.fs"
146+
#load "ChartTernary.fs"
147+
#load "ChartCarpet.fs"
148+
#load "ChartDomain.fs"
149+
150+
#I "../Plotly.NET/CSharpLayer"
151+
152+
#load "GenericChartExtensions.fs"
153+
154+
#I "../Plotly.NET/Extensions"
155+
156+
#load "SankeyExtension.fs"
157+
158+
open DynamicObj
159+
160+
open Plotly.NET
161+
open Plotly.NET.LayoutObjects
162+
open Plotly.NET.TraceObjects
163+
open Plotly.NET.ConfigObjects
164+
165+
open FSharp.Data
166+
open Newtonsoft.Json
167+
open System.Text
168+
open System.IO
169+
open Deedle
170+
open FSharpAux
171+
172+
open System
173+
open System.IO
174+
175+
open Plotly.NET
176+
177+
open System
178+
open Plotly.NET
179+
180+
#r "nuget: FSharp.Data"
181+
#r "nuget: Deedle"
62182

63183

64184
open Plotly.NET
@@ -92,16 +212,17 @@ let xyz = Seq.zip3 x y x
92212
let simpleChart = Chart.Point([1.,1.])
93213

94214
let complexChart =
95-
Chart.Grid(
96-
[
97-
[Chart.Line(x,y); Chart.Line(x,y); Chart.Line(x,y)]
98-
[Chart.Histogram2dContour(x,y); Chart.Point(x,y); Chart.Point(x,y)]
99-
[Chart.Spline(x,y); Chart.Spline(x,y); Chart.Spline(x,y)]
100-
]
101-
)
215+
[
216+
[Chart.Line(x,y); Chart.Line(x,y); Chart.Line(x,y)]
217+
[Chart.Histogram2DContour(x,y); Chart.Point(x,y); Chart.Point(x,y)]
218+
[Chart.Spline(x,y); Chart.Spline(x,y); Chart.Spline(x,y)]
219+
]
220+
|> Chart.Grid()
221+
222+
102223

103224
complexChart
104-
|> Chart.Show
225+
|> Chart.show
105226

106227
simpleChart
107228
|> Chart.saveJPG (
@@ -140,34 +261,26 @@ let map =
140261
)
141262

142263

143-
map.SaveSVG(__SOURCE_DIRECTORY__ + "/testrenders/map")
144-
145-
complexChart.SaveJPG (__SOURCE_DIRECTORY__ + "/testrenders/complex")
146-
147-
simpleChart
148-
|> Chart.savePNG (__SOURCE_DIRECTORY__ + "/testrenders/simple")
149-
150-
complexChart
151-
.WithTitle("soos")
152-
.SavePNG(__SOURCE_DIRECTORY__ + "/testrenders/complex")
153-
154-
simpleChart
155-
|> Chart.saveSVG (__SOURCE_DIRECTORY__ + "/testrenders/simple")
156-
157-
complexChart.SaveSVG (__SOURCE_DIRECTORY__ + "/testrenders/complex")
158-
159264
let jpgString =
160265
Chart.Point([1.,1.])
161266

162267
|> Chart.toBase64JPGString()
163-
|> fun f -> File.WriteAllText(@"C:\Users\Kevin\source\repos\plotly\Plotly.NET\tests\Plotly.NET.Tests\data\testBase64JPG.txt", f)
268+
|> fun f -> File.WriteAllText(@"C:\Users\schne\source\repos\plotly\Plotly.NET\tests\Plotly.NET.ImageExport.Tests\data\testBase64JPG.txt", f)
164269

165270
let pngString =
166271
Chart.Point([1.,1.])
167272
|> Chart.toBase64PNGString()
168-
|> fun f -> File.WriteAllText(@"C:\Users\Kevin\source\repos\plotly\Plotly.NET\tests\Plotly.NET.Tests\data\testBase64PNG.txt", f)
273+
|> fun f -> File.WriteAllText(@"C:\Users\schne\source\repos\plotly\Plotly.NET\tests\Plotly.NET.ImageExport.Tests\data\testBase64PNG.txt", f)
274+
275+
let a =
276+
File.ReadAllBytes(@"C:\Users\schne\source\repos\plotly\Plotly.NET\tests\Plotly.NET.ImageExport.Tests\data\testPNG.png")
277+
|> Convert.ToBase64String
278+
279+
Chart.Point([1.,1.])
280+
|> Chart.toBase64PNGString()
281+
|> fun x -> x.Contains(a)
169282

170283
let svgString =
171284
Chart.Point([1.,1.])
172285
|> Chart.toSVGString()
173-
|> fun f -> File.WriteAllText(@"C:\Users\Kevin\source\repos\plotly\Plotly.NET\tests\Plotly.NET.Tests\data\testSVGURI.txt", f)
286+
|> fun f -> File.WriteAllText(@"C:\Users\schne\source\repos\plotly\Plotly.NET\tests\Plotly.NET.ImageExport.Tests\data\testSVGURI.txt", f)

src/Plotly.NET.ImageExport/PuppeteerSharpRenderer.fs

+2-2
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ type PuppeteerSharpRenderer() =
7272
/// Initalizes headless browser
7373
let fetchAndLaunchBrowserAsync() =
7474
async {
75-
let browserFetcher = BrowserFetcher()
75+
use browserFetcher = new BrowserFetcher()
7676

7777
let! revision = browserFetcher.DownloadAsync() |> Async.AwaitTask
7878

@@ -92,7 +92,7 @@ type PuppeteerSharpRenderer() =
9292

9393
/// skips the data type part of the given URI
9494
let skipDataTypeString (base64:string) =
95-
let imgBase64StartIdx =base64.IndexOf(",", StringComparison.Ordinal) + 1
95+
let imgBase64StartIdx = base64.IndexOf(",", StringComparison.Ordinal) + 1
9696
base64.Substring(imgBase64StartIdx)
9797

9898
/// converst a base64 encoded string URI to a byte array

0 commit comments

Comments
 (0)