@@ -16,6 +16,7 @@ import (
16
16
"github.com/livepeer/go-livepeer/net"
17
17
"github.com/livepeer/lpms/ffmpeg"
18
18
"github.com/stretchr/testify/assert"
19
+ "github.com/stretchr/testify/require"
19
20
)
20
21
21
22
func TestFFmpegProfiletoNetProfile (t * testing.T ) {
@@ -476,3 +477,120 @@ func TestMimeTypeToExtension(t *testing.T) {
476
477
_ , err := MimeTypeToExtension (invalidContentType )
477
478
assert .Equal (ErrNoExtensionsForType , err )
478
479
}
480
+
481
+ func TestParsePricePerUnit (t * testing.T ) {
482
+ tests := []struct {
483
+ name string
484
+ pricePerUnitStr string
485
+ expectedPrice * big.Rat
486
+ expectedExponent * big.Rat
487
+ expectedCurrency string
488
+ expectError bool
489
+ }{
490
+ {
491
+ name : "Valid integer price with currency" ,
492
+ pricePerUnitStr : "100USD" ,
493
+ expectedPrice : big .NewRat (100 , 1 ),
494
+ expectedCurrency : "USD" ,
495
+ expectError : false ,
496
+ },
497
+ {
498
+ name : "Valid fractional price with currency" ,
499
+ pricePerUnitStr : "0.13USD" ,
500
+ expectedPrice : big .NewRat (13 , 100 ),
501
+ expectedCurrency : "USD" ,
502
+ expectError : false ,
503
+ },
504
+ {
505
+ name : "Valid price with negative exponent" ,
506
+ pricePerUnitStr : "1.23e-2USD" ,
507
+ expectedPrice : big .NewRat (123 , 10000 ),
508
+ expectedCurrency : "USD" ,
509
+ expectError : false ,
510
+ },
511
+ {
512
+ name : "Lower case currency" ,
513
+ pricePerUnitStr : "99.99eur" ,
514
+ expectedPrice : big .NewRat (9999 , 100 ),
515
+ expectedCurrency : "eur" ,
516
+ expectError : false ,
517
+ },
518
+ {
519
+ name : "Currency with numbers" ,
520
+ pricePerUnitStr : "420DOG3" ,
521
+ expectedPrice : big .NewRat (420 , 1 ),
522
+ expectedCurrency : "DOG3" ,
523
+ expectError : false ,
524
+ },
525
+ {
526
+ name : "No specified currency" ,
527
+ pricePerUnitStr : "100" ,
528
+ expectedPrice : big .NewRat (100 , 1 ),
529
+ expectedCurrency : "" ,
530
+ expectError : false ,
531
+ },
532
+ {
533
+ name : "Explicit wei currency" ,
534
+ pricePerUnitStr : "100wei" ,
535
+ expectedPrice : big .NewRat (100 , 1 ),
536
+ expectedCurrency : "wei" ,
537
+ expectError : false ,
538
+ },
539
+ {
540
+ name : "Valid price with scientific notation and currency" ,
541
+ pricePerUnitStr : "1.23e2USD" ,
542
+ expectedPrice : big .NewRat (123 , 1 ),
543
+ expectedCurrency : "USD" ,
544
+ expectError : false ,
545
+ },
546
+ {
547
+ name : "Valid price with capital scientific notation and currency" ,
548
+ pricePerUnitStr : "1.23E2USD" ,
549
+ expectedPrice : big .NewRat (123 , 1 ),
550
+ expectedCurrency : "USD" ,
551
+ expectError : false ,
552
+ },
553
+ {
554
+ name : "Valid price with negative scientific notation and currency" ,
555
+ pricePerUnitStr : "1.23e-2USD" ,
556
+ expectedPrice : big .NewRat (123 , 10000 ),
557
+ expectedCurrency : "USD" ,
558
+ expectError : false ,
559
+ },
560
+ {
561
+ name : "Invalid number" ,
562
+ pricePerUnitStr : "abcUSD" ,
563
+ expectedPrice : nil ,
564
+ expectedCurrency : "" ,
565
+ expectError : true ,
566
+ },
567
+ {
568
+ name : "Negative price" ,
569
+ pricePerUnitStr : "-100USD" ,
570
+ expectedPrice : nil ,
571
+ expectedCurrency : "" ,
572
+ expectError : true ,
573
+ },
574
+ {
575
+ name : "Only exponent part without base (e-2)" ,
576
+ pricePerUnitStr : "e-2USD" ,
577
+ expectedPrice : nil ,
578
+ expectedCurrency : "" ,
579
+ expectError : true ,
580
+ },
581
+ }
582
+
583
+ for _ , tt := range tests {
584
+ t .Run (tt .name , func (t * testing.T ) {
585
+ price , currency , err := ParsePricePerUnit (tt .pricePerUnitStr )
586
+
587
+ if tt .expectError {
588
+ assert .Error (t , err )
589
+ } else {
590
+ require .NoError (t , err )
591
+ assert .True (t , tt .expectedPrice .Cmp (price ) == 0 )
592
+ assert .Equal (t , tt .expectedCurrency , currency )
593
+ }
594
+ })
595
+ }
596
+ }
0 commit comments